начиная с позиции 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) {Чтение за границей памяти}