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/ |