OSDev

для всех
Текущее время: 02 май 2024, 18:32

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Начинающий 2 [Графические режимы]
СообщениеДобавлено: 05 сен 2007, 09:57 

Зарегистрирован: 05 сен 2007, 09:45
Сообщения: 3
Здраствуйте, всем.
К сожелению я не нашел пример переключения/установки режимов VESA/VBE в защищенном режиме. Неужели для этого необходимо выходить в реальный режим?? И еще. Как устанавливать LFB на свой адрес памяти? Примеров достаточно хороших не нашел, наверное плохо искал.

Если можно доки(желательно на русском) подкинтье или просто совет дайте хороший с примером ;)

Спасибо


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 сен 2007, 10:23 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Для переключения видео режимов VESA нужно переходить либо в реальный режим либо в виртуальный VM-86. Последней предпочтителнее.
Еще можно написать драйвер для каждой видюшки.

LFB устанавливается на нужный адресс используя пейджинг.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 сен 2007, 16:38 

Зарегистрирован: 08 май 2007, 07:25
Сообщения: 22
qwe113
Все что ты спрашиваешь, ты можешь найти в исходниках Kolibri OS.
С помощью шаманских методов можно даже установить повышенную частоту горизонтальной развертки, перейдя из более высокого графического режима в меньший. Все это сделано в Kolibri.
http://kolibrios.org/


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 сен 2007, 06:59 

Зарегистрирован: 05 сен 2007, 09:45
Сообщения: 3
Эти исходники у меня есть. Смотрел. Настройка графического режима выполняеться в нескольких местах. Это очень обьемно и тяжело. Мне необходимо понять суть на счет LFB, и небольшой пример реализации.

Цитата:
LFB устанавливается на нужный адресс используя пейджинг.
//Pavia

Дело в том, я даже не могу установить просто адрес, не говоря уже о пейджинге. В книге Зубкова, говориться что можно установить любой адрес используя сегментную адресацию защищенного режима, о пейджинге там ничего не говорилось, а пример приведен с использованием DPMI интерфейса, которго в принципе мне необходимо написать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 сен 2007, 15:52 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
qwe113, установить видео режим легко, читаем VBE3.pdf
Насчет LFB. Его можно узнать из VESA в свойствах видео режимах.

Вот и обращайся, по этому адрессу.
Для удобства можно создать сегмент, которй будет соответствовать LFB. Задается он в GDT или LDT


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 сен 2007, 07:08 

Зарегистрирован: 05 сен 2007, 09:45
Сообщения: 3
Цитата:
qwe113Насчет LFB. Его можно узнать из VESA в свойствах видео режимах.
//Pavia

Я спросил как его установить на определенный участок памяти(желательно, при 32-битной адресации). Из твоего ответа я понял, что уже все установлено, необходимо только посмотреть "в свойствах видео режима", разве это так? Возможное, чтоб я чего-нибудь понял, необходимо выражаться чуть-чуть по шире.
На счет vbe3.pdf спасибо.

Есть ли справочник какой-нибудь, книга по описанию программинга vesa во всех режимах, каких только возможно :) ?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 сен 2007, 18:01 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Цитата:
Цитата:
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].


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 44


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB