test al,l {проверяем наличие обратного хода}

jne @2 (Ждем обратный ход}

lodsw (Получаем видеослово}

sti (Открываем прерывания}

stosw (Пишем видеослово в приемник}

loop 81 {Продолжаем цикл} end

end; {MoveFromScreen} {,-. —————————— ————;

Procedure MoveToScreen (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 {Грузим в CX счетчик} eld (Направление передачи} shr ex, 1 {Переводим байты в слова) mov dx,PortCGA {Получаем в ОХстатус CGA-порта} mov Ы,9 {Готовим a BL маску проверки готовности} {Отсюда начинается цикл записи в видеопамять, который продолжается во время обратного хода луча при горизонтальной развертке. Запись проходит при закрытых прерываниях.} @3: lodsw {Получаем в ВР}

mov Ьр,ах (очередное видеослово} cli /Закрываем прерывания) @4: in al,dx (Получаем статус видеопорта} test al,l {Конец горизонтального хода?} jne @4 {Нет - ждем} mov ax,bp (Переносим в АХ видеослово} stosw (Пишем его в видеопамять) sti (Открываем прерывания} loop @3 {Продолжаем цикл} end end; {MoveToScreen} _•__—————————————;

Function pagewrite(var F: TextRec): Integer; Far;

{Осуществляет вывод строки, подготовленной процедурами HRITE/WRITELN, в активную видеостраницу} var

k: Integer;

begin

with F,Pages[ActivePage] do if (Mode=fm0utput) and (BufPos>0) then begin

for k := 0 to BufPos-1 do with Reg do WriteChar(ActivePage,BufPtr'^ [k]) ;

BufPos := 0 {Обнуляем буфер.вывода} end;

PageWrite :° О end; (PageWrite} /————————————————;

Procedure PageWriteOff;

(Восстанавливает стандартный канал вывода} begin