начиная с позиции Dest байт от ее начала) var

Rest,Pos,k: Longint;

Рад: Word;

PD,PS: Pointer;

PW: record

S,0: Word end absolute PS;

Stop: Boolean;

begin {$IFSDEF NOTCHECK}

if (Sz<0) or (Dest+Sz>Size) then

EMSError($AA) {Запись за границей памяти} else {?endIF} begin

Рад := Dest div LPage; {Логическая страница} Pos := Dest mod LPage; {Смещение в ней) PS := @Source; {Указатель в источнике} PD :- ptr(EMSS,Pos); {Указатель в EMS} Stop :» False; (Флаг ошибки картирования) Rest :== Sz; {Остаток записи} repeat {Цикл по страницам EMS} MapEMSPage(Handle,0,Рад); {Картируем окно} EMSError(EMSStatus) ;

Stop := EMSStatusOO; {Признак ошибки} if not Stop then begin

{Определяем размер Sz очередного блока:} if Rest>LPage-Pos then

Sz := LPage-Pos else

Sz := Rest;

MovefPS^PD^Sz) ; ' {Переносим блок} Dec(Rest,Sz); (Уменьшаем остаток} Inc(Рад); {Следующая логическая страница} PD := ptr(EMSS,0); (Указатель - а ее начало} Pos := 0;

Inc(PW.O,Sz); (Смещение в источнике} {Нормализуем указатель PS источника:} PW.S :» PW.S+(PW.O Shr 4);

PW.O := PW.O mod 16 end

until Stop or <Rest=0) end

end; {TEMSArea.WriteEMS} /———_————————/

Procedure TEMSArea.ReadEMS(Source: Longint; var Dest; Sz: Longint)-{Читает Sz байт из EMS-памяти, начиная с байта Source от ее начала, в переменную Dest} var

Rest,Pos,k: Longint;

Рад: Word;

PD,PS: Pointer;

PW: record S,0: Word end absolute PD;

Stop: Boolean;

begin (fIFNDEF NOTCHECK}

±f (Sz<0) or (Source+Sz>Size) then

EMSError($A9) {Чтение за границей памяти}