Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_01 (XMS) Управление XMA.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
423.94 Кб
Скачать

Локальное открывание линии а20

На входе: АН = 05h.

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

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

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

Эта функция предназначена только для тех программ, кото­рые непосредственно управляют расширенной памятью. Перед за­вершением работы программа должна закрыть линию А20 при помощи функции 06h.

Локальное закрывание линии а20

На входе: АН = 06h.

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

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

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

Функция отменяет разрешение линии А20, запрошенное пре­дыдущей функцией. Она предназначена только для тех программ, которые непосредственно управляют расширенной памятью.

Определение состояния линии А20

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

На выходе: AX = 0001h - если линия А20 открыта;

0000h - если линия А20 закрыта.

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

Функция выполняет попытку адресоваться за границу 1 мега­байта памяти и проверяет, не происходит ли при этом обращение в начало памяти (т. е. "свертка памяти").

Определение размера свободной расширенной памяти:

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

На выходе: AX = размер наибольшего свободного блока расширенной памяти в килобайтах;

DX = общий размер свободной расширенной памяти в килобайтах.

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

При определении размера свободной расширенной памяти в возвращаемое значение не включается 64 килобайта области НМА, даже если эта область не используется программами.

Получить блок ЕМВ

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

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

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

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

DX = 16-битовый индекс (handle) полученного блока ЕМВ.

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

Функция заказывает блок ЕМВ из пула свободной расширенной памяти. При успешном выполнении запроса функция возвращает индекс полученного блока, который должен использоваться программой для выполнения всех операций с блоком ЕМВ. Если блок ЕМВ программе больше не нужен, она должна освободить его с помощью функции OAh.

Количество блоков ЕМВ, которое может быть заказано, опре­деляется в командной строке драйвера H1MEM.SYS параметром /NUMHANDLES=. Значение по умолчанию - 32, максимальное значение - 128.

Освободить блок ЕМВ

На входе: AH = 0Ah.

DX = 16-битовый индекс (handle) полученного блока ЕМВ.

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

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

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

Функция освобождает блок ЕМВ, заказанный предыдущей функцией. При этом все данные, находившиеся в блоке, будут потеряны.

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

На входе: АН = Bh.

DS:SI = указатель на управляющую структуру, определяющую, откуда, куда и как будет выполняться копирование.

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

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

Ошибки: BL = 80h, 81h, 82h, A3h, A4h, A5h, A6h, A7h, A8h, A9h.

Управляющая структура:

ExtMemMoveStruct struct

Length dd ? ; количество посылаемых байтов

SourceHandle dw ? ; индекс исходного блока

SourceOffset dd ? ; смешение в исходном блоке

DestHandle dw ?; индекс блока назначения

DestOf-fset dd ? ; смещение блока назначения

ExtMemMoveStruct ends

Эта функция выполняет основную операцию с блоками ЕМВ - копирование данных. Данные могут пересылаться между обычной памятью и блоками ЕМВ, между различными блоками ЕМВ и даже внутри обычной памяти.

Поле Length управляющей структуры указывает количество пересылаемых байтов. Это количество должно быть четным.

Поля SourceHandle и DestHandle указывают соответственно индексы исходного и результирующего блоков ЕМВ. Если в качестве индекса задано значение 0000h, это означает, что в качестве источника или приемника данных используется обычная память.

Поля SourceOffset и DestOffset указывают 32-битовое смеще­ние в блоке ЕМВ или адрес в обычной памяти. В последнем слу­чае этот адрес имеет стандартный формат сегмент: смещение.

Функция копирования сама управляет линией А20, восстанав­ливая ее состояние после выполнения копирования. Поэтому про­грамме не требуется управлять линией А20.

Во время выполнения копирования разрешены прерывания.

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

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

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

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

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

DX:BX = 32-битовый линейный адрес заблокированного EМВ.

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

Функция блокирует ЕМВ и возвращает его базовый адрес как линейный 32-разрядный адрес. Для заблокированного ЕМВ невоз­можно выполнить операцию копирования. Полученный линейный адрес действителен только для заблокированного ЕМВ.

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

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

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

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

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

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

Функция разблокирует ЕМВ, заблокированный при вызове предыдущей функции. Полученный от нее линейный адрес стано­вится недействительным.

Получить информацию об индексе ЕМВ

На входе: АН = 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.