Ты работаешь с VESA?
тогда да, там окна =)
Итак, что такое окна?
640*480*8bit= 307200 байт,
Сегмент же у нас 65536 байт
307200/ 65536 примерно 4.7 - т.е. у нас здесь 4 полных окна и еще чуть чуть =) 5 окон всего.
Каждое окно - это просто напросто возможность записать в определенный кусок памяти, т.е. все что я запишу в $A000 будет записано в другой адрес.
В принципе правило перехода из окна в окно - если у нас
счетчик > 65535
то надо менять окно.
В VESA это можно сделать 2мя способами:
1. Использовать функцию 4F05:
mov dx,curwin
xor bx,bx
mov ax,4F05h
int 10h
и все. Эта функция меняет текущее окно на CurWin
НО разработчики VESA говорят что прерывание 10h уж очень торозное =)
т.к. на обращение к нему реагируют различные резидентыи компоненты DOS (ну например утилитка KEYRUS)
поэтому =) они советуют воспользоваться процедурой VMC [Video Memory Control] которая состоит из 10-15 команд и передвигает окно =) что нам и надо.
Где же эту функцию взять? Она записана в Video BIOS'е, именно ее адрес выдается нам когда мы запрашиваем информацию о режиме
(
mov ax, 4F01h - функция
mov cx, mode - режим
mov es,Info - сегмент, по адресу которого запишется инфа о режиме
xor di,di - и 0 смещение
int 10h - ВПЕРЕД!!!
)
вот, 4 байта по смещению [Info:di+0Ch] будут адресом VMC.
Здесь я приведу 2 процедуры им моего движка VESA - вычисления VMC и рисования точки =)
Код
type TModeInfo = record
Attributes : word;
WinAAttr,WinBAttr : byte;
WinGran : word;
WinSize : word;
WinASeg, WinBSeg : word;
[COLOR=blue]
VMC : pointer;
[/COLOR]
BytesPLine : word;
Width,Height : word;
CharWidth,CharHeight : byte;
Planes,BitsPPixel : byte;
Banks,MemModel,BankSize : byte;
ImagePages : byte;
Reserv1 : byte;
RedMaskSize : byte;
RedFieldPos : byte;
GreenMaskSize : byte;
GreenFieldPos : byte;
BlueMaskSize : byte;
BlueFieldPos : byte;
ResMaskSize : byte;
ResFieldPos : byte;
ColorModeInfo : byte;
Reserv2 : array [0..225] of byte;{ничего нету - резерв}
end;
Код
var
ModeInfo : TModeInfo;
Код
function TestMode(mode:word):boolean;
begin
asm
cmp [IsVesa],0
je @exit
mov ax,seg ModeInfo
mov es,ax
mov di,offset ModeInfo
mov @result,1
mov ax,4f01h
mov cx,[mode]
int 10h
xor ax,4fh
je @exit
mov @result,0
@exit:
end;
end;
Код
var CurWin:word;
procedure SetBank;assembler;
asm
pusha
xor bx,bx
mov dx,[curwin]
call [ModeInfo.VMC]
mov [CurWin],dx
popa
end;
Код
procedure VPutPixel(x,y:word;col:byte);
begin
asm
cmp [IsVESA],0
je @exit
mov ax,[y]
mul [ModeInfo.width]
add ax,[x]
adc dx,0
mov di,ax
cmp dx,[curwin]
je @next
mov [CurWin],dx
call SetBank
@next:
mov ax,0A000h
mov es,ax
mov al,col
stosb
@exit:
end;
end;
Вот и все что я могу сказать =) спрашивайте.
А на тему видеостраниц - их колво зависит от видеопамяти, т.е. если видеопамяти всего 1 Мб то наша программа будет иметь всеголишь 2 доп окна
Специальные функции переключения окон отсутствуют, но программист может переставить адрес начала отображаемой на экран памяти
Код
xor bx,bx
mov cx.basecol
mov dx,baserow
mov ax.4F07h
int 10h
Пока что все =) - спроси что еще не понятно я последовательно отвечу.