Binary Hell's main site

 Главная страница 
 Новости 
 Статьи 
 Продукты 
 Документация 
 Наши проекты 
 О группе 
 
 Пишите нам 

..............................................................................
................#...#.#####..####...#.........#......###......................
................#...#.#.....#......#.#.......##.....#...#.....................
................#...#.###....###..#...#.......#.......##......................
.................#.#..#.........#.#####.......#.....,#........................
..................#...#####.####..#...#......###.##.#####.....................
..............................................................................

______________________________________________________________________________
  КАК НАПИСАТЬ НАИБОЛЕЕ БЫСТРУЮ БИБЛИОТЕКУ ПОД VESA 1.2  В ЗАЩИЩЕННОМ РЕЖИМЕ
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Начнем с того, как проинициализировать графический режим и какие режимы вообще
поддерживаются VESA 1.2. Чтобы проинициализировать гр. режим необходимо
сэмулировать реал модовское прерывание (функция 0x300 прерывания 0x31).

К примеру нам надо установить 320x200x16бит, вот как ето делается...

------------------------------------------------------------------------------

//Структура регистров для эмуляции прерывания
int r_edi=0;
int r_esi=0;
int r_ebp=0;
int r_000=0;
int r_ebx=0;
int r_edx=0;
int r_ecx=0;
int r_eax=0;
short r_001=0;
short r_es=0;
short r_ds=0;
short r_fs=0;
short r_gs=0;
short r_ip=0;
short r_cs=0;
short r_sp=0;
short r_ss=0;
//Конец структуры
//Я специально не делаю полноценной структуры (struct{};) для большего
//понимания происходящего.
//Все регистры должны быть записаны именно в этом порядке

//Объявим указатель на BackBuffer, Указатель сделаем short-овым
//для увеличения скорости
short *mpage;

//Напишем функцию инициализации гр. режима
void initgraph(){
_asm{
//Положим в регистр eax номер функции VESA Bios
// 0x4f02 - установка видео режима
mov [r_eax],0x4f02
//В ebx - номер гр. режима (список режимов в таблице 1)
mov [r_ebx],0x010e
//Устанавливаем функцию эмуляции прерывания
mov eax,0x0300
//Это номер прерывания которое будем эмулировать
mov bl,0x10
//Этот регистр надо обнулить
xor bh,bh
//Здесь должно лежать количество байт возвращенных из
//стека после эмуляции прерывания, обнулим...
xor ecx,ecx
//Установим es=ds
push ds
pop es
//Загрузим указатель на структуру
mov edi,offset r_edi
//Сэмулируем прерывание
int 0x31
}
//Выделим память под BackBuffer (Надо
//для оптимизации скорости вывода на экран...) 320*200*2=128000
mpage=(short *)calloc(128000,1);
}

------------------------------------------------------------------------------

Теперь поговорим о BackBuffer-е...
Что это такое и для чего нужен???
Как известно (надеюсь и вам тоже) видео память работает в 4 раза медленней
оперативной. Отсюда видно, что чем меньше к ней обращений тем быстрее будет
работать ваша програма.
Напишем функцию копирования BackBuffer-а в видео память. Т.к. VESA 1.2 непод-
держивает LFB(Линейный буффер) то нам придется юзать банки.

------------------------------------------------------------------------------

void redraw(){
_asm{
//Для установки банка эмулировать прерывание ненадо
//0x4f05 - Установка банка
mov eax,0x4f05
//Обнулим эти регистры !!!
xor ebx,ebx
xor ecx,ecx
//Здесь установим номер банка нас интерисует нулевой
xor edx,edx
int 0x10
//Скопируем в видео память первые 64Кб
mov edi,0xA0000
mov esi,dword ptr [mpage]
mov ecx,16384
rep movsd
//Теперь переадресуем вывод на первый банк
mov eax,0x4f05
xor ebx,ebx
xor ecx,ecx
mov edx,1
int 0x10
//Выведем оставшиеся 61Кб
mov edi,0xA0000
mov esi,dword ptr [mpage]
add esi,0x10000
mov ecx,15616
rep movsd
}
}

------------------------------------------------------------------------------

Теперь напишем простенький пример использования этих функций

------------------------------------------------------------------------------

int main(){
short i,j,k;
initgraph();
//Выведем 500 кадров эффекта
for(k=0;k<500;k++){
for(j=0;j<200;j++){
for(i=0;i<320;i++){
//Для помещения в BackBuffer
//изображения, для большей оптимизации, будем использовать указатель, т.к. мы
//сделали его short-овым, то будем пихать туда уже отконверченый номер цвета
//(j<<8)+(j<<6)+i эта строка эквивалентна j*320+i, но работает на порядок
//быстрее. Как сформировать номер цвета читайте ниже...
mpage[(j<<8)+(j<<6)+i]=i+j+k;
}
}
redraw();
}
//Незабудем закрыть гр. режим перед выходом
_asm{
//Текстовый режим (80x25)
mov eax,0x03
int 0x10
//И не забудем освободить память
free(mpage);
}
return 0;
}

------------------------------------------------------------------------------

Цвет в данном режиме распределен так: на КРАСНЫЙ 5 бит, на ЗЕЛЕНЫЙ 6 бит,
на СИНИЙ 5 бит. Отсюда максимальные значения R,G,B соответственно 31,63,31.
Например преобразуем RGB(24,46,15) в цвет, который мы должны кинуть в Back-
Buffer.

color=15+(46<<5)+(24<<11)=50639;

Вот собственно и все, это не самые оптимальные коды, но на iP166 Выдают
стабильно порядка 60-80 fps.

------------------------------------------------------------------------------

ТАБЛИЦА 1 [ СПИСОК ВИДЕОРЕЖИМОВ ПОДДЕРЖИВАЕМЫХ VESA 1.2 ]

/--------------T----------------T---------------------\
|.Номер.режима.|...Разрешение...|.Цветовое.разрешение.|
>--------------+----------------+---------------------<
|....0x100.....|....640x400.....|........8bit.........|
|....0x101.....|....640x480.....|........8bit.........|
|....0x102.....|....800x600.....|........4bit.........|
|....0x103.....|....800x600.....|........8bit.........|
|....0x104.....|....1024x768....|........4bit.........|
|....0x105.....|....1024x768....|........8bit.........|
|....0x106.....|...1280x1024....|........4bit.........|
|....0x107.....|...1280x1024....|........8bit.........|
|....0x108.....|....(80x60).....|........4bit.........|
|....0x109.....|....(132x25)....|........4bit.........|
|....0x10a.....|....(132x43)....|........4bit.........|
|....0x110.....|....640x480.....|.......15bit.........|
|....0x111.....|....640x480.....|.......16bit.........|
|....0x112.....|....640x480.....|.......24bit.........|
|....0x113.....|....800x600.....|.......15bit.........|
|....0x114.....|....800x600.....|.......16bit.........|
|....0x115.....|....800x600.....|.......24bit.........|
|....0x116.....|....1024x768....|.......15bit.........|
|....0x117.....|....1024x768....|.......16bit.........|
|....0x118.....|....1024x768....|.......24bit.........|
|....0x119.....|...1280x1024....|.......15bit.........|
|....0x10a.....|...1280x1024....|.......16bit.........|
|....0x10b.....|...1280x1024....|.......24bit.........|
\-----------------------------------------------------/
Красным выделены текстовые режимы


BinaryHell.Gold_Dragon(); (keenblade2k@mail.ru) [for WATCOM]


Rambler's Top100 Rambler's Top100 NET's Top100