var
k: Byte;
Size: Word;
Page: Byte;
begin
{Определяем тип адаптера по байту оборудования ДОС} case (MemW[$0040:$0010] and $30) shr 4 of 3: begin {MDA} MaxPage := 0;
VMemory := $BOOO end;
else begin {Остальные адаптеры} MaxPage :=• 3;
VMemory := $B8OO end;
end;
{Определяем режим работы адаптера} case Mem[$0040:$0049] of
0,1: MaxChar := 40; {40х25} 2,3: MaxChar := 80; {80х25} 1 : begin (MDA) MaxChar := 80;
VMemory := $ВООО end;
else
MaxChar := 80 end;
{Вычисляем остальные константы} MaxLine := 25;
PageSize := MaxLine*MaxChar*2;
Page := ActivePage;
for k := 0 to 7 do begin
SetActivePage(k) ;
VMW[2*k] :« MemW[$OO4O:$004E] end;
VSize := VMH[2]-VMW[O] ;
SetActivePage(Page) end; {InitText} /————————————.-————/
Procedure MoveFromScreen (var Source,Destin;Count: Word);
{Читает данные из видеопамяти} begin
if Count>0 then if not CheckSnow then
Move(Source,Destin,Count) else
{Синхронизация переноса для адаптера CGA} asm
Ids si,[Source] {DS:SI » адрес источника) les di,[Destin] {ES:DI = адрес приемника} mov ex,Count {Загружаем счетчик в СХ} eld (Направление передачи} shr cx,l (Заменяем байты на слова} mov dx,PortCGA /Загружаем а ОХадрес CGA-порта}
( Отсюда начинается цикл чтения из видеопамяти, который продолжается во время обратного хода луча при горизонтальной развертке. } @1: di {Закрываем прерывания} @2: in al,dx {В начале очередного цикла}