4.9.4. Интерфейс EMS

Расширенная память (EMS) - дополнительная возможность для программ, за­пускающихся в реальном режиме (или в режиме V86), обращаться к памяти, ко­торая находится за пределами первого мегабайта. EMS позволяет отобразить сег­мент памяти, начинающийся, обычно с ODOOOh, на любые участки памяти, аналогично тому, как осуществляется доступ к видеопамяти в SVGA-режимах. Вызывать функции EMS (прерывание 67h) разрешается, только если в системе присутствует драйвер с именем EMMXXXXО. Для проверки его существования можно, например, вызвать функцию 3Dh (открыть файл или устройство). При­чем на тот случай, если драйвер EMS отсутствует, а в текущей директории есть файл с именем ЕММХХХХО, следует дополнительно вызвдть функцию IOCTL -INT 21h с АХ = 4400h и ВХ = идентификатор файла или устройства, полученный от функции 3Dh. Если значение бита 7 в DX после вызова этой функции равно 1, то драйвер EMS наверняка присутствует в системе.

Основные функции EMS:

INT67h, АН =46h: Получить номер версии Вход:    АH = 46h

Выход: АH = 0 и AL = номер версии в упакованном BCD (40h для 4.0). Во всех случаях, если АH не ноль, произошла ошибка

INT67h, АН = 41к Получить сегментный адрес окна 'Вход:    АН = 41h

Выход: АН = 0 и ВХ - сегментный адрес окна

INT67h,AH= 42к Получить объем памяти

Вход:    АН = 42h

Выход: АН = 0

DX = объем EMS-памяти в 16-килобайтных страницах

ВХ = объем свободной EMS-памяти в 16-килобайтных страницах

INT67h, АН-43k Выделить идентификатор и EMS-память Вход:   АН = 43h

ВХ = требуемое число 16-килобайтных страниц Выход: АН = О, DX = идентификатор

Теперь указанный в этой функции набор страниц в EMS-памяти описывается как занятый и другие программы не смогут его выделить для себя.

INT67h,AH = 44к Отобразить память Вход:   АН = 44h

AL = номер 16-килобайтной страницы в 64-килобайтном окне EMS (0-3) ВХ = номер 16-килобайтной страницы в EMS-памяти DX = идентификатор

Выход: АН = О

Далее запись/чтение в указанную страницу в реальном адресном пространстве приведет к записи/чтению в указанную страницу в EMS-памяти.

INT67h, АН = 45к Освободить идентификатор и EMS-память Вход:    АН = 45h

DX = идентификатор

Выход: АН = 0

Спецификация EMS была разработана для компьютеров IBM XT, снабжав­шихся особой платой, на которой и находилась расширенная память. С появле­нием процессора 80286 стало возможным устанавливать больше одного мегабай­та памяти на материнской плате, и для работы с ней была введена новая спецификация - XMS. Тогда же были созданы менеджеры памяти, эмулировав­шие EMS поверх XMS, для совместимости со старыми программами, причем ра­бота через EMS выполнялась медленнее. Позже, когда в процессорах Intel появил­ся механизм страничной адресации, выяснилось, что теперь уже EMS можно реализовать гораздо быстрее XMS. Большинство программ для DOS, которым

требуется дополнительная память, поддерживают обе спецификации.