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 {В начале очередного цикла}