Расширенная память (Expanded Memory). Спецификация расширенной памяти.
Описание стандартных функций
К категории стандартных относятся следующие функции драйвера EMM.
Функция 40h Get EMM status предназначена для получения информации о состоянии драйвера. Входные параметры отсутствуют. Результат проверки возвращается в регистре ah. Если он очищен, то все в порядке. Код 8lh означает неисправность расширенной памяти, других кодов ошибки в данном случае не должно быть. В случае ошибки надо прекратить выполнение задачи и проверить состояние системного программного обеспечения.
Функция 41h Get Physical Segment Address of EMS Frame возвращает значение сегмента, используемого для доступа к расширенной памяти. Входные параметры отсутствуют, код сегмента указан в регистре bx. Его надо сохранить и при чтении или записи данных помещать в один из сегментных регистров. Код сегмента зависит от конфигурации оборудования, установленного на компьютере, в процессе выполнения задачи он не может и не должен изменяться. Размер сегмента 64 Кбайт, он делится на 4 страницы по 16 Кбайт каждая. Адреса (смещения) страниц равны 0, 4000h, s000h и осоооь.
Функция 42h Get EMS Memory size позволяет определить общее и свободное пространство expanded memory. Входные параметры у нее отсутствуют. Общий размер памяти возвращается в регистре dx, а размер свободного пространства – в bx. Обе величины указаны в виде количества страниц, размер страницы равен 16 Кбайт.
Обычно не вся внешняя память ПК используется как expanded memory. Часть ее занимает DOS и другие резидентные программы. Кроме того, при установке EMM (в файле config.sys) может быть указан размер доступного для него пространства ОЗУ. Поэтому не следует ожидать, что находящееся в регистре dx количество страниц всегда соответствует размеру старшей памяти ПК.
Для выполнения задачи важно знать размер свободной части памяти, т. е. количество страниц, указанное в регистре bx. При программировании задачи необходимо предусмотреть проверку доступного размера памяти и выбор дальнейших действий в зависимости от его значения.
Функция 43h Allocate Memory and Open EMM handle запрашивается для выделения требуемого пространства расширенной памяти. Входным параметром является необходимое количество страниц, указываемое в регистре bx. При успешном выполнении функции в регистре dx возвращается EMM Handle – идентификатор выделенного блока, который используется при запросах других функций драйвера. Его обязательно надо сохранить.
Два специальных кода ошибок означают, что запрошено слишком много страниц. Код 87h выдается, если общее пространство expanded memory меньше запрошенного размера, а код 88h означает, что недостаточно свободного пространства памяти. Если вы предварительно проверяли свободную память с помощью функции 42h, то эти две ошибки не должны возникать, в противном случае надо прекратить выполнение задачи.
Выделенное пространство закреплено за задачей, но перед записью или чтением данных надо отображать его конкретную часть на рабочий сегмент, значение которого возвращает функция 4ih. Как уже говорилось ранее, в этом сегменте размещается 4 страницы. Для отображения 16 Кбайт ОЗУ на одну из этих страниц предназначена функция 44h.
Функция 44h Map Memory связывает физическую страницу с логической. Входными параметрами являются номера физической (ai) и логической (bx) страниц и EMM handle (dx). Номер физической страницы может изменяться от 0 до 3, а номер логической страницы – от 0 до n-i, где n – количество страниц, выделенное функцией 43h.
Возможные ошибки имеют следующие коды: 83h – неверно задан идентификатор блока (EMM handle), 8Ah – логическая страница вне диапазона значений, выделенных функцией 43h, 8Bh – недопустимая физическая страница.
После отображения логическая страница доступна для использования. Для работы с полным сегментом (65 536 байт) функция 44h выполняется 4 раза. При этом не обязательно указывать физические и логические страницы в порядке увеличения их номеров.
Функция 45h Release Memory освобождает пространство памяти, выделенное для задачи функцией 43п. Входным параметром является идентификатор блока, указываемый в регистре dx. Отказ от выполнения функции может быть связан только с его неправильным заданием.
Важно
Данная функция обязательно должна вызываться перед завершением выполнения задачи, в противном случае выделенная для завершенной задачи память будет недоступна для других задач вплоть до перезагрузки системы.
Функция 46h Get EMM version number позволяет определить версию менеджера EMM. Входные параметры отсутствуют, номер версии в двоично-десятичном коде возвращается в регистре ai. Например, версии 6.2 соответствует КОД 62п.
Таким образом, при использовании стандартного набора функций дра EMM задача получает возможность резервирования нужного простран в дополнительной памяти ПК и размещения в нем данных.