Тексты программ 365
это EGA, VGA или SVGA в графическом режиме) begin
х := 0; (Левый верхний...} хх := GetMaxX; {угол экрана} у ;= 0; (Правый нижний угол} УУ := 0;
Рад := 0; (Номер началььой страницы EMS}
(Определяем количество dy полных строк экрана, которые еще умещаются в памяти одной страницы EMS}
while (ImageSize(х,у,хх,yy)<LPage) and (yy<=GetMaxY) do inc(yy);
dy := yy-1;
/Основной цикл сохранения копии блоками по 16 К) repeat
(Картируем страницу окна} MapEMSPage(Handle,0,Рад) ;
(Получаем копию части жрана} if y+dy<-GetMaxY then
GetImage(x,y,xx,y+dy,EMS^) else
GetImage(x/y,xx,GetMaxY,EMS");
inc(Рад) ;
inc (y,dy) until y>=GetMaxY end end {case Mode} end; {TEMSScreen.PutScreen} ^————-.————————;
Procedure TEMSScreen.GetScreen;
(Получает из EMS-памяти копию экрана} var
х,у,хх,yy,dy: Integer;
Рад: Byte;
EMS,Video: Pointer;
begin
(Проверяем текущий видеорежим} with Reg do begin
ah := $F;
Intr($lO,Reg) ;
if aloMode then (Режим соответствует Mote'?} begin (Нет - сообщаем и выходим} EMSError($AD);
Exit end end;
(Переносим копию а видеопамять в зависимости от режима} EMS := ptr(EMSS,O); (Начало EMS} case Mode of
1..6,13..14: (Текстовые режимы всех адаптеров,
кроме MDh, графика CGA или ее имитация:
начало видеопамяти в $В800, длина до 16 Кбайт} begin
Video := Ptr($B800,0) ;
MapEMSPage(Handle,0,0) ;
if not EMSErrorFlag then
MoveToScreenfEMS^Vidao^LPage) end;
7: (Текстовый режим MDA: начало видеопамяти в $ВООО, длина 4 Кбайт) begin