18.3.3. Размещение оверлейного файла в EMS-памяти
Процедура OvrInitEMS не имеет параметров. Она просто определяет, есть ли в ПЭВМ расширяемая память (EMS-память). Если есть, то далее процедура проверяет, установлена ли программа-драйвер этой памяти, работающая по стандарту LIM (EMS 4.0 и выше). Если и это условие выполняется, то оверлейный файл целиком загрузится в EMS и все операции по работе с оверлейными процедурами и функциями будут происходить в памяти. При этом программа начинает работать более быстро, так как операции чтения из памяти в память производятся гораздо быстрее, чем с диска в память (особенно при работе с дискетами). Вызов OvrInitEMS не является обязательным, и ни в коей мере не отменяет необходимости обычной предварительной инициализации администратора оверлеев. Неудача при попытке разместить OVR-файл в EMS-памяти не будет иметь никаких фатальных последствий, и программа будет работать так, как будто вызова OvrInitEMS не было. Переменная OvrResult при этом получит значения OvrNoEMSDriver или OvrNoEMSMemory. Последняя может возникнуть из-за того, что в EMS-памяти уже размещены кэш (cache) жесткого диска, виртуальный диск или что-нибудь иное.
При запуске процедуры OvrInitEMS в переменную OvrResult могут передаваться и другие ошибки: OvrError — если не было предварительного вызова OvrInit, и OvrIOError — если произошел сбой при переносе оверлейного файла с диска в EMS-память.
Приведенный на рис. 18.2 фрагмент основной программы показывает запуск администратора оверлеев и попытку использовать EMS-память с полной проверкой ошибок.
- 398 -
| VAR
| ovr_name : PathStr; { полное имя оверлея на диске }
| d : DirStr; { Типы объявлены в модуле DOS.}
| n : NameStr;
| е : ExtStr;
| BEGIN
| FSplit(ParamStr(0), d, n, e); { анализ имени ЕХЕ-файла }
| ovr_name := d + n + '.OVR'; { построение имени .OVR }
REPEAT
| OvrInit( ovr_name ); { запуск администратора }
| if OvrResult = OvrNotFound { OVR-файл не найден }
| then begin
| WriteLn('Оверлейный файл не найден:',ovr_name);
| Write ('Введите правильное имя файла: ');
| ReadLn ( ovr_name )
| end; {if}
| UNTIL OvrResult <> OvrNotFound;
| if OvrResult <> OvrOk { анализ прочих ошибок }
| then begin
| WriteLn('Ошибка администратора оверлеев ',
| OvrResult);
| RunError { останов программы }
| end; {if}
| OvrInitEMS; { попытка загрузки в EMS }
| if OvrResult <> OvrOk then { анализ этой попытки }
| then begin
| case OvrResult of
| OvrNoEMSDriver:Write('Драйвер EMS не установлен');
| OvrNoEMSMemory:Write('Мало свободной EMS-памяти');
| OvrIOError :Write('Ошибка чтения файла' );
| end; {case}
| Write( ' - EMS память не используется.' ) { итог }
| end; {if}
| { Администратор инициализирован. Можно работать дальше }
| ...
| END.
Рис. 18.2