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