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; (Дать статус файла)