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