
- •1. Управление памятью
- •1.1 Типы памяти
- •1.2 Стандартная память
- •Р ис. 2. Цепочка блоков памяти
- •1.3 Отображаемая память
- •1.4 Расширенная память
- •1.5 Высокая память
- •1.6 Верхняя память
- •2. Использование средств управления памятью
- •2.1. Общие положения
- •2.2. Драйвер himem.Sys: управление расширенной и высокой памятью
- •3. Использование драйвера himem.Sys для программирования.
- •3.1. Проверка подключения драйвера
- •3.2. Получение адреса управляющей программы
- •3.3. Описание функции драйвера h1mem.Sys
- •Локальное открывание линии а20
- •Локальное закрывание линии а20
- •Освободить область umb
- •3.4. Коды ошибок
- •3.5. Ограничения при использовании области нмa
- •4. Примеры использования драйвера himem.Sys.
Локальное открывание линии а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.