OSDev http://osdev.su/ |
|
Начинающий 2 [Графические режимы] http://osdev.su/viewtopic.php?f=6&t=116 |
Страница 1 из 1 |
Автор: | qwe113 [ 05 сен 2007, 09:57 ] |
Заголовок сообщения: | Начинающий 2 [Графические режимы] |
Здраствуйте, всем. К сожелению я не нашел пример переключения/установки режимов VESA/VBE в защищенном режиме. Неужели для этого необходимо выходить в реальный режим?? И еще. Как устанавливать LFB на свой адрес памяти? Примеров достаточно хороших не нашел, наверное плохо искал. Если можно доки(желательно на русском) подкинтье или просто совет дайте хороший с примером ;) Спасибо |
Автор: | pavia [ 05 сен 2007, 10:23 ] |
Заголовок сообщения: | Re: Начинающий 2 [Графические режимы] |
Для переключения видео режимов VESA нужно переходить либо в реальный режим либо в виртуальный VM-86. Последней предпочтителнее. Еще можно написать драйвер для каждой видюшки. LFB устанавливается на нужный адресс используя пейджинг. |
Автор: | mario79 [ 05 сен 2007, 16:38 ] |
Заголовок сообщения: | Re: Начинающий 2 [Графические режимы] |
qwe113 Все что ты спрашиваешь, ты можешь найти в исходниках Kolibri OS. С помощью шаманских методов можно даже установить повышенную частоту горизонтальной развертки, перейдя из более высокого графического режима в меньший. Все это сделано в Kolibri. http://kolibrios.org/ |
Автор: | qwe113 [ 06 сен 2007, 06:59 ] |
Заголовок сообщения: | Re: Начинающий 2 [Графические режимы] |
Эти исходники у меня есть. Смотрел. Настройка графического режима выполняеться в нескольких местах. Это очень обьемно и тяжело. Мне необходимо понять суть на счет LFB, и небольшой пример реализации. Цитата: LFB устанавливается на нужный адресс используя пейджинг. //Pavia Дело в том, я даже не могу установить просто адрес, не говоря уже о пейджинге. В книге Зубкова, говориться что можно установить любой адрес используя сегментную адресацию защищенного режима, о пейджинге там ничего не говорилось, а пример приведен с использованием DPMI интерфейса, которго в принципе мне необходимо написать. |
Автор: | pavia [ 06 сен 2007, 15:52 ] |
Заголовок сообщения: | Re: Начинающий 2 [Графические режимы] |
qwe113, установить видео режим легко, читаем VBE3.pdf Насчет LFB. Его можно узнать из VESA в свойствах видео режимах. Вот и обращайся, по этому адрессу. Для удобства можно создать сегмент, которй будет соответствовать LFB. Задается он в GDT или LDT |
Автор: | qwe113 [ 13 сен 2007, 07:08 ] |
Заголовок сообщения: | Re: Начинающий 2 [Графические режимы] |
Цитата: qwe113Насчет LFB. Его можно узнать из VESA в свойствах видео режимах. //Pavia Я спросил как его установить на определенный участок памяти(желательно, при 32-битной адресации). Из твоего ответа я понял, что уже все установлено, необходимо только посмотреть "в свойствах видео режима", разве это так? Возможное, чтоб я чего-нибудь понял, необходимо выражаться чуть-чуть по шире. На счет vbe3.pdf спасибо. Есть ли справочник какой-нибудь, книга по описанию программинга vesa во всех режимах, каких только возможно :) ? |
Автор: | Himik [ 21 сен 2007, 18:01 ] |
Заголовок сообщения: | Re: Начинающий 2 [Графические режимы] |
Цитата: Цитата: qwe113Насчет LFB. Его можно узнать из VESA в свойствах видео режимах. //qwe113 Я спросил как его установить на определенный участок памяти(желательно, при 32-битной адресации). Из твоего ответа я понял, что уже все установлено, необходимо только посмотреть "в свойствах видео режима", разве это так? //"Pavia" Код: //Get Video Info UCHAR* pBuf = pSysInfo->pDiskBuf + g0MegPtr; memset4(pBuf, 0, 0x200 / 4); pBuf[0] = 'V'; pBuf[1] = 'B'; pBuf[2] = 'E'; pBuf[3] = '2'; _ThreadRegs BiosRegs; BiosRegs.eax = 0x4F00; //GET SuperVGA INFORMATION BiosRegs.es = pSysInfo->segDiskBuf; BiosRegs.edi = 0; syscall2(SYSCALL::BiosIntCall, 0x10, (UINT)&BiosRegs); if((USHORT)BiosRegs.eax == 0x4F) { pSysInfo->VesaCapab = pBuf[0xA]; pSysInfo->VesaVbeVer = *(USHORT*)&pBuf[0x22]; pSysInfo->VesaModes[0] = 0xFFFF; USHORT* pModes = (USHORT*)(*(USHORT*)&pBuf[0x10] * 0x10 + *(USHORT*)&pBuf[0xE]); for(UINT iSrc = 0, iDst = 0;; iSrc++) { if(pModes[iSrc] < 0x100u) { continue; } pSysInfo->VesaModes[iDst] = pModes[iSrc]; if(pModes[iSrc] == 0xFFFF || iDst == 0xFF) { break; } iDst++; } } //Set Graphic mode USHORT* pModes = pSysInfo->VesaModes; for(UINT i = 0; i < 0x100u && pModes[i] != 0xFFFF; i++) { BiosRegs.eax = 0x4F01; //GET SuperVGA MODE INFORMATION BiosRegs.ecx = pModes[i]; BiosRegs.es = pSysInfo->segDiskBuf; BiosRegs.edi = 0; syscall2(SYSCALL::BiosIntCall, 0x10, (UINT)&BiosRegs); if((USHORT)BiosRegs.eax != 0x4F) { break; } if((pBuf[0] & 2) && *(USHORT*)&pBuf[0x12] == 800 && *(USHORT*)&pBuf[0x14] == 600 && pBuf[0x19] == 16 && pBuf[0x21] == 6) { UINT ConfigMode = pModes[i]; if(pSysInfo->VesaCapab & 8) { ConfigMode |= 0x2000; } //Init VBE/AF pSysInfo->VesaConfigMode = ConfigMode; pSysInfo->VesaPixelsX = *(USHORT*)&pBuf[0x12]; pSysInfo->VesaPixelsY = *(USHORT*)&pBuf[0x14]; pSysInfo->VesaPixelBits = pBuf[0x19]; pSysInfo->VesaLineBytes = *(USHORT*)&pBuf[0x10]; if(pBuf[0] & 0x80) //With LFB { ConfigMode |= 0x4000; //Enable LFB ULONG VesaPhysLfb = *(ULONG*)&pBuf[0x28]; pSysInfo->VesaPhysLfb = VesaPhysLfb; pSysInfo->VesaLfb = K_MapPhysMem(VesaPhysLfb, pSysInfo->VesaPixelsX * pSysInfo->VesaPixelsY * 2); } BiosRegs.eax = 0x4F02; //SET SuperVGA MODE BiosRegs.ebx = ConfigMode; syscall2(SYSCALL::BiosIntCall, 0x10, (UINT)&BiosRegs); break; } } Поскольку номера поддерживаемых режимов и сами параметры режимов нам заранее не известны, то сначала запрашивается список всех имеющихся режимов в буфер. Используется вызов BIOS в режиме VM86, заполняется массив значений pSysInfo->VesaModes. Затем после (//Set Graphic mode) в цикле запрашиваются параметры каждого номера режима, чтобы найти подходящее разрешение и цветность. В данном примере выбирается 800x600x16, у которого зелёный компонент составляет 6 бит (pBuf[0x21] == 6). Адрес LFB считывается из *(ULONG*)&pBuf[0x28]. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |