366 Приложение

Video := Ptr ($BOOO,0) ;

MapEMSPage(Handle,0,0) ;

if not EMSErrorFlag then

MoveToScreen(EMS,Video,LPage div 4) end;

else {Остальные дисплеи: предполагается,

что это EGA, VGA или SVGA. в графическом режиме} begin

х :° 0; {Левый верхний...} хх := GetMaxX; {угол экрана) у :=• 0; {Правый нижний угол} уу := 0;

Рад := 0; {Номер начальной страницы EMS} (Определяем количество dy полных строк экрана, которые еще умещаются в памяти одной страницы EMS} while (ImageSize(х,у,хх,уу)<LPage) and (yy<=GetMaxY) do inc(yy);

dy := yy-1;

{Основной цикл восстановления экрана блоками по 16 К} repeat

{Картируем окно} MapEMSPage(Handle,0,Рад) ;

(Переносим копию части экрана} PutIniagetXfyiEMS^NornialPut) ;

inc(Рад) ;

inc (y,dy) until y>=GetMaxY end

end (case Mode} end; {TEMSScreen.GetScreen} {----—--—-- Интерфейс с EMM ------------)

Procedure Intr67;

{Реализует прерывание $67 и устанавливает флаг EMSStatus} begin

Intr($67,Reg) ;

EMSStatus := Reg.ah end;

^———————————;

Function IsEMS: Boolean;

{Возвращает TRUE, если в ПК имеется EMS-память} const

Name: array [1..9] of Char = 'EMMXXXXO'#0;

label Exit;

begin

if EMSVer=0 then with Reg do {Была проверка раньше?}

begin {Нет - проверяем установку EMM} ah :° $3D; {Создаем дескриптор файла} а1 :^ 0; {Для чтения} dx := Ofs(Name); {С именем "EMMXXXXO"} ds := Seg(Name) ;

MSDOS(Reg) ;

{Если файла нет - EMM не установлен} if (Flags and FCarry)<>0 then Goto Exit;

(Проверяем статус файла}

bx :== ax; {Дескриптор файла}

ah := $44; {Запрос IOCTL}

al :== 7; (Дать статус файла)