Дополнительная память (EMS) — способ для программ, запускающихся в реальном режиме (или в режиме V86), обращаться к памяти, находящейся за пределами первого мегабайта. EMS позволяет отобразить сегмент памяти, начинающийся обычно с 0D000h, на любые участки памяти, аналогично тому, как осуществляется доступ к видеопамяти в SVGA-режимах. Вызывать функции EMS (прерывание 67h) можно, только если в системе присутствует драйвер с именем ЕММХХХХ0. Для проверки его существования можно, например, вызвать функцию 3Dh (открыть файл или устройство), причем на тот случай, если драйвер EMS отсутствует, а в текущей директории есть файл с именем ЕММХХХХ0, следует дополнительно вызвать функцию IOCTL — INT 21h с АХ = 4400h и ВХ = идентификатор файла или устройства, полученный от функции 3Dh. Если значение бита 7 в DX после вызова этой функции 1, то драйвер EMS наверняка присутствует в системе.
Основные функции EMS:
INT 67h, АН = 46h — Получить номер версии
Ввод: | AH = 46h |
Вывод: | АН = 0 и AL = номер версии в упакованном BCD (40h для 4.0) |
Во всех случаях, если АН не ноль, произошла ошибка.
INT 67h, АН = 41h — Получить сегментный адрес окна
Ввод: | AH = 41h |
Вывод: | АН = 0 и ВХ = сегментный адрес окна |
INT 67h, АН = 42h — Получить объем памяти
Ввод: | AH = 42h |
Вывод: | АН = 0 DX = объем EMS-памяти в 16-килобайтных страницах ВХ = объем свободной EMS-памяти в 16-килобайтных страницах |
INT 67h, АН = 43h — Выделить идентификатор и EMS-память
Ввод: | АН = 43h ВХ = требуемое число 16-килобайтных страниц |
Вывод: | АН = 0, DX = идентификатор |
Теперь указанный в этой функции набор страниц в EMS-памяти описывается как занятый и другие программы не смогут его выделить для себя.
INT 67h, АН = 44h — Отобразить память
Ввод: | АН = 44h AL = номер 16-килобайтной страницы в 64-килобайтном окне EMS (0 – 3) ВХ = номер 16-килобайтной страницы в EMS-памяти DX = идентификатор |
Вывод: | АН = 0 |
Ввод: | АН = 45h DX = идентификатор |
Вывод: | АH = 00h |