Кафедра МОП ЭВМ Драйвер управления расширенной памятью HIMEM,SYS, страница 14

На входе:                     АН = 0Eh;

DX = 16-битовый индекс (handle) ЕМВ.

На выходе:                   АХ = 000lh - если функция выполнена успешно,

0000h - если произошла ошибка;

ВН = содержимое счетчика блокировок ЕМВ;

BL = количество свободных индексов ЕМВ в системе;

DX = размер блока в килобайтах.

Ошибки:                      BL = 80h, 81h, A2h.

Эта функция используется для получения различной информации об используемых блокахЕМВ. Линейный адрес блока может быть получен с помощью функции 0Ch.

Изменить размер ЕМВ

На входе:                     АН = 0Fh;

DX = 16-битовый индекс (handle) незаблокированногоЕМВ, размер которогодолжен быть изменен;

ВХ = новый размер ЕМВ в килобайтах.

На выходе:                   АХ = 000lh - если функция выполнена успешно,

0000h -если произошла ошибка.

Ошибки:                      BL = 80h, 81h, AOh, Alh, A2h, ABh.

Функция изменяет размер не заблокированного ЕМВ. Если блок уменьшается в размерах, данные в старших адресах блока будут потеряны.

Запросить область UMB

Навходе:                     AH = 10h.

DX = размер запрашиваемого блока UMB в параграфах;

На выходе:                   AX = 000lh - если функция выполнена успешно,

0000h -если произошла ошибка.

Ошибки:                      BL = 80h, B0h, B1h.

Эта функция позволяет программе получить доступ к блокам UMB, лежащим в пределах первого мегабайта адресного пространства. Для использования этих блоков не требуется управлять линией А20.

Если Вам надо определить размер доступной области UMB, задайте при вызове этой функции DX = FFFFh.

Освободить область UMB

На входе:                     AH = 11h;

DX = сегмент освобождаемого UMB.

На выходе:                   AX = 000lh - если функция выполнена успешно,

0000h - если произошла ошибка.

Ошибки:                      BL = 80h, В2h.

После освобождения блока ЕМВ данные, которые там находились, будут потеряны.

3.4. Коды ошибок

Приведем таблицу кодов ошибок, возвращаемых функциями в регистре BL:

Код

Ошибка

00h

80h

81h

82h

8Eh

8Fh

90h

91h

92h

93h

94h

A0h

Alh

A2h

АЗh

A4h

A5h

A6h

A7h

A8h

A9h

AAh

ABh

Ach

ADh

B0h

Blh

B2h

Нет ошибки, нормальное завершение функция не реализована в текущей версии драйвера

Обнаружен драйвер VDISK.SYS, сэтим драйвером драйвер HIMEM.SYS несовместим

Ошибка при работе с линией А20

Общая ошибка драйвера

Катастрофическая ошибка драйвера

Область НМА не существует

Область НМА уже используется

Содержимое регистра DX меньше параметра /HMAMINОбласть НМА не распределена программе

Линия А20 все еще разблокирована

Вся расширенная память уже распределена

Больше нет свободных индексов ЕМВ

Неправильный индекс ЕМВ

Неправильный SourceHanale

Неправильный SourceOffset

Неправильный DestKandle

Неправильный DcstOffset

Неправильный Length

Неразрешенное перекрытие данных при выполнении операции пересылки данных

Произошла ошибка четности

ЕМВ не заблокирован

ЕМВ заблокирован

Переполнение счетчика блокировок ЕМВ

He удалось выполнить блокировку ЕМВ

Доступен UMB меньшего размера

Нет доступных блоков UMB

Задан неправильный сегмент UMB

3.5. Ограничения при использовании области НМA

К сожалению, на программы, использующие область НМА, накладываются значительные ограничения. Они связаны с тем, что MS-DOS версий 4.01 и более ранних, а также BIOS не были рассчитана на работу с адресами памяти выше границы 1 мегабайт. Приведем список этих ограничений.

• Нельзя передавать MS-DOS FAR-указатели на данные, размещенные в области НМА, т. к. функцииMS-DOS проверяютправильность таких указателей.

• Не рекомендуется использование области НМА для выполнения обмена данных с диском через прерывания MS-DOS, BIOS или другими способами.