OSDev
http://osdev.su/

Вывод символов в VESA 115h (800*600*16M)
http://osdev.su/viewtopic.php?f=7&t=972
Страница 1 из 1

Автор:  Rammstein [ 23 июл 2014, 11:04 ]
Заголовок сообщения:  Вывод символов в VESA 115h (800*600*16M)

в борще работает, а в qemu нет. да собственно как и в других виртуалках.
Код:
initTTY:
   pusha
   mov esi, [videoModeInfo]

   mov eax, dword [esi+28h]
   mov [LFB], eax
   mov edi, eax
   mov al, [esi+19h]
   cmp al, 24
   jne @f
   mov [bytesPerPixel], 3
   mov [bytesPerLine], 3*800
   jmp .detected
@@:
   mov [bytesPerPixel], 4
   mov [bytesPerLine], 4*800
.detected:
   pushw 'W'
   call putChar
   popa
   ret
   
putChar:
   push ebp
   mov ebp, esp
   pusha
   
   mov esi, font
   movzx eax, word [ebp+8]
   shl eax, 4
   add esi, eax
   mov ecx, 16
   mov edx, [LFB]
   mov eax, 0xFFFFFF
.lines:
   mov bl, byte [esi]
   push ecx
   mov ecx, 8
   mov edi, edx
   .columns:
      shl bl, 1
      jnc @f
      mov [edi], eax
   @@:
      add edi, [bytesPerPixel]
      loop .columns
   add edx, [bytesPerLine]
   pop ecx
   inc esi
   loop .lines
   
   popa
   leave
   ret 2
   
LFB dd ?
bytesPerPixel dd ?
bytesPerLine dd ?   
tab db 4
backgroundColor db 0
simbolsColor db 1111b
cursorX dw 0
cursorY dw 0
font:
   include 'font.inc'

проблема в следующем: имеются три типа режимов: 256 цветов, 64К и 16М. при включении режима в 256 цветов работают только 2 виртуалки: это борщ и кему. но у них есть какие-то глюке в выводе цветов. в борще выводится белый цвет, а в кему какой-то бело-синий. затем я решил заюзать TrueColor и 16М цветов. в борще сей код пашет а в Qemu нет, хотя видеорежим устанавливается.

Автор:  Rammstein [ 23 июл 2014, 11:09 ]
Заголовок сообщения:  Re: Вывод символов в VESA 115h (800*600*16M)

однако просто линия
Код:
mov eax, 0xFFFFFF
mov edi, [LFB]
mov ecx, 800
@@:
   mov [edi], eax
   add edi, 3
   loop @b

выводится норм в обеих виртуалках. соответственно формат пикселя и там и там 8:8:8. я бы мог подумать на неверные вычисления, да только в борще то пашет ._.

Автор:  Himik [ 23 июл 2014, 15:10 ]
Заголовок сообщения:  Re: Вывод символов в VESA 115h (800*600*16M)

У тебя неправильный алгоритм нахождения заданного видеорежима. Это должен быть цикл по всем имеющимся режимам с выборкой по заданным параметрам, а у тебя проверяется один единственный видеорежим. Так требуемый режим не может быть найден.
Список режимов берётся от функции AX=4F00h "GET SuperVGA INFORMATION", из полученного буфера берётся дальний указатель на смещении 0Eh.

Автор:  Rammstein [ 23 июл 2014, 15:40 ]
Заголовок сообщения:  Re: Вывод символов в VESA 115h (800*600*16M)

так-то я про поиск знаю, но режим 800*600*16М точно присутствует и я не стал искать нужный. в общем баг каким-то магическим образом пропал. мб я что-то подправил и не помню, но проблема решена. тогда есть другой вопрос: как достучаться до оперативки видеокарты? ато нужно много-много памяти для хранение экрана, а я их планирую несколько. а так можно было бы размещать их прямо в видюхе.

Автор:  Himik [ 23 июл 2014, 15:48 ]
Заголовок сообщения:  Re: Вывод символов в VESA 115h (800*600*16M)

Нет проблем - адрес видеобуфера это начало всей имеющейся памяти, адресоваться к ней можно линейно. Данные о размерах поищи в информационном блоке. Например "количество буферов" можно умножить на размер самого буфера. Но запись (и особенно чтение) видеопамяти гораздо медленней оперативной компьютера, поэтому тормоза будут приличные.

Автор:  Rammstein [ 23 июл 2014, 16:06 ]
Заголовок сообщения:  Re: Вывод символов в VESA 115h (800*600*16M)

т.е. лучше все-таки писать в оперативку?

Автор:  Himik [ 23 июл 2014, 16:40 ]
Заголовок сообщения:  Re: Вывод символов в VESA 115h (800*600*16M)

Оперативная память конечно лучше.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/