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, которым
требуется дополнительная память, поддерживают обе спецификации.