Поддерживаемые функции DPMI INT 31h
PMODE/W дублирует поднабор DPMI функций защищенного режима. Эти
функции доступны ТОЛЬКО в защищенном режиме через прерывание INT 31h.
Они обеспечивают дескрипторные услуги, услуги расширенной памяти,
услуги прерываний, услуги трансляции и некоторые другие вещи. Функция
вызывается установкой кода функции в регистр AX, установкой каких-либо
других регистров для функции, и выполнением прерывания INT 31h. По
возвращению, флаг переноса будет очищен, если функция была выполнена
успешно. Если флаг переноса установлен, функция выполнена неудачно.
Все другие регистры сохраняются, если не определено иначе. В
дополнение к функциям, перечисленным здесь, функции 0600h, 0601h,
0702h и 0703h будут возвращены с очищенным флагом переноса, чтобы
остаться совместимыми с кодом, который использует эти специфические
функции DPMI.
Функция 0000h - Распределение Дескрипторов
Функция 0001h - Освобождение дескриптора
Функция 0002h - Сегмент в дескриптор
Функция 0003h - Увеличение значения селектора
Функция 0006h - Получение базового адреса сегмента
Функция 0007h - Установка базового адреса сегмента
Функция 0008h - Установка предела сегмента
Функция 0009h - Установка прав доступа к дескриптору
Функция 000Ah - Создание Алиаса Дескриптора
Функция 000Вh - Получение дескриптора
Функция 000Сh - Установка дескриптора
Функция 0100h - Распределение блока памяти DOS
Функция 0101h - Освобождение блока памяти DOS
Функция 0102h - Изменение блока памяти DOS
Функция 0200h - Получение вектора прерываний реального режима
Функция 0201h - Установка вектора прерываний реального режима
Функция 0202h - Получение вектора обработчика исключений процессора
Функция 0203h - Установка вектора обработчика исключений процессора
Функция 0204h - Получение вектора прерываний защищенного режима
Функция 0205h - Установка вектора прерываний защищенного режима
Функция 0300h - Моделирование прерываний реального режима
Функция 0301h - Вызов Процедуры Реального режима С Далекой Возвращаемой Границы
Функция 0302h - Вызов Процедуры Реального режима IRET Frame
Функция 0303h - Распределение адреса отзыва реального режима
Функция 0304h - Освобождение адреса отзыва реального режима
Функция 0305h - Получение состояния адресов хранения/записи
Функция 0306h - Получение адресов переключателя режима
Функция 0400h - Получение версии
Функция 0500h - Получение информации о свободной памяти
Функция 0501h - Распределение блока памяти
Функция 0502h - Освобождение блока памяти
Функция 0503h - Изменение размеров блока памяти
Функция 0800h - Физическое Отображение Адреса
Функция 0801h - Свободное отображение физического адреса памяти
Функция 0900h - Получение и выключение состояния виртуальных прерываний
Функция 0901h - Получение и включение состояния виртуальных прерываний
Функция 0902h - Получение состояния виртуальных прерываний
Функция EEFFh - Получение информации расширителя DOS
Функция 0000h - Распределение Дескрипторов
Распределяет один или более дескрипторов в дескрипторной таблице
клиента. Распределенный дескриптор(ы) должен быть инициализирован
приложением с другими функциональными запросами.
Вход:
AX = 0000h
CX = количество дескрипторов для распределения
Выход:
Если выполнение успешно:
очистить флаг переноса
AX = базовый селектор
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- Если затребовано более одного дескриптора, то функция возвращает базовый селектор, ссылающийся на первый из непрерывного массива дескрипторов. Значение селектора для последующих дескрипторов в массиве, может быть вычислено прибавлением значения, возвращенного INT 31h функцией 0003h.
- Распределенный дескриптор(ы) будет установлен поверх доступных для записи данных, с существующим разрядным набором и базой и пределом ноля. Уровень привилегии дескриптора(ов) будет соответствовать уровню привилегии сегмента кода клиента.
Функция 0001h - Освобождение дескриптора
Освобождение дескриптора.
Вход:
AX = 0001h
BX = селектор для освобождаемого дескриптора
Выход:
Если выполнение успешно:
очистить флаг переноса
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- Каждый дескриптор, распределенный с INT 31h функцией 0000h должен быть освобожден индивидуально данной функцией. Даже если он было предварительно распределен как часть непрерывного массива дескрипторов.
- Под DPMI 1.0/VCPI/XMS/raw, любые сегментные регистры, которые содержат освобождаемый селектор, обнуляются этой функцией.
Функция 0002h - Сегмент в дескриптор
Преобразовывает сегмент реального режима в дескриптор защищенного
режима.
Вход:
AX = 0002h
BX = сегмент реального режима
Выход:
Если выполнение успешно:
очистить флаг переноса
AX = селектор
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- Многократные запросы одного и того же сегмента реального режима
возвращают тот же самый селектор. Возвращенный дескриптор никогда не
должен быть изменен или освобожден.
Функция 0003h - Увеличение значения селектора
Функция 0000h может распределять непрерывный массив дескрипторов, но
возвращать только селектор для первого дескриптора. Значение,
возвращенное этой функцией, может использоваться для вычисления
селекторов последующих дескрипторов в массиве.
Вход:
AX = 0003h
Выход:
Всегда выполняется успешно:
очистить флаг переноса
AX = увеличить значение селектора
Примечания:
- Значение селектора всегда увеличивается на два.
Функция 0006h - Получение базового адреса сегмента
Возвращает 32-битный линейный базовый адрес из дескрипторной таблицы
для указанного сегмента.
Вход:
AX = 0006h
BX = селектор
Выход:
Если выполнение успешно:
очистить флаг переноса
CX:DX = 32-битный линейный базовый адрес сегмента
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- Клиентские программы должны использовать команду LSL, чтобы
запросить ограничения для дескриптора.
Функция 0007h - Установка базового адреса сегмента
Устанавливает 32-битную линейный базовый адрес поля в дескрипторе для
указанного сегмента.
Вход:
AX = 0007h
BX = селектор
CX:DX = 32-битный линейный базовый адрес сегмента
Выход:
Если выполнение успешно:
очистить флаг переноса
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- Под DPMI 1.0/VCPI/XMS/raw, любой сегментный регистр, который
содержит селектор, указанный в регистре BX, будет перезагружен. DPMI
0.9 также может делать это, но гарантий нет. Мы надеемся, что Вы
имеете достаточно ума, чтобы не пытаться изменить текущие значения
дескрипторов CS или SS.
Функция 0008h - Установка предела сегмента
Устанавливает область ограничений в дескрипторе для указанного
сегмента.
Вход:
AX = 0008h
BX = селектор
CX:DX = предел 32-биного сегмента
Выход:
Если выполнение успешно:
очистить флаг переноса
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- Значение для функции в CX:DX - длина байта сегмента-1. Пределы
сегмента, большие или равные 1M должны быть выровненной страницей. То
есть они должны иметь нижний набор на 12 бит.
- Эта функция имеет неявный эффект на "G" бит в дескрипторе
сегмента. Клиентские программы должны использовать команду LSL, чтобы
выполнить запрос предела для дескриптора.
- Под DPMI 1.0/VCPI/XMS/raw, любой сегментный регистр, который
содержит селектор, указанный в регистре BX, будет перезагружен. DPMI
0.9 также может делать это, но гарантий нет. Мы надеемся, что Вы
имеете достаточно ума, чтобы не пытаться изменить текущие значения
дескрипторов CS или SS.
Функция 0009h - Установка прав доступа к дескриптору
Изменяет область прав доступа в дескрипторе для указанного сегмента.
Вход:
AX = 0009h
BX = селектор
CX = access rights/type word
Выход:
Если выполнение успешно:
очистить флаг переноса
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- Данные access rights/type word, проходящие к функции в CX, имеют
следующий формат:
Бит: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
---------------------------------------------------------------
|G| B/D | 0 | ? | ? |1| DPL | 1 | C/D | E/C | W/R |A|
---------------------------------------------------------------
G - 0=byte granular, 1=page granular
B/D - 0 = по умолчанию 16 бит, 1 = по умолчанию 32 бит
DPL - должен быть равен CPL вызывающего
C/D - 0 = данные, 1 = код
E/C - данные: 0 = верхнее расширение, 1 = нижнее расширение
код: должен быть 0 (несоответствующий)
W/R - данные: 0 = чтение, 1 = чтение/запись
код: должен быть 1 (читаемый)
A - 0 = недоступен, 1 = доступен
0 - должен быть 0
1 - должен быть 1
? - игнорируется
- Клиентские программы должны использовать команду LAR, чтобы
исследовать права доступа дескриптора.
- Под DPMI 1.0/VCPI/XMS/raw, любой сегментный регистр, который
содержит селектор, указанный в регистре BX, будет перезагружен. DPMI
0.9 также может делать это, но гарантий нет. Мы надеемся, что Вы
имеете достаточно ума, чтобы не пытаться изменить текущие значения
дескрипторов CS или SS.
Функция 000Ah - Создание Алиаса Дескриптора
Создает новый дескриптор данных, который имеет ту же самую базу и
предел как указанный дескриптор.
Вход:
AX = 000ah
BX = селектор
Выход:
Если выполнение успешно:
очистить флаг переноса
AX = селектор данных (алиас)
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- Селектор, указанный в функции, может быть или дескриптором данных
или дескриптором кода. Созданный алиас дескриптора - это всегда
верхнее расширение доступных для записи данных сегмента.
- Алиас дескриптора, возвращенный этой функцией, не будет проводить
изменения в первоначальный дескриптор.
Функция 000Вh - Получение дескриптора
Копирует вход дескрипторной таблицы для указанного селектора в
8-байтовый буфер.
Вход:
AX = 000bh
BX = селектор
ES:EDI = селектор:смещение 8-байтного буфера
Выход:
Если выполнение успешно:
очистить флаг переноса
буфер, указанный в ES:EDI, содержит дескриптор
Если выполнение неуспешно:
установить флаг переноса
Функция 000Сh - Установка дескриптора
Копирует содержание 8-байтового буфера в дескриптор для указанного
селектора.
Вход:
AX = 000ch
BX = селектор
ES:EDI = селектор:смещение 8-байтного буфера, содержащего дескриптор
Выход:
Если выполнение успешно:
очистить флаг переноса
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- access rights/type word дескрипторов в смещении 5 в пределах
дескриптора имеют тот же формат и ограничениям, что и access
rights/type parameter CX для функции Set Descriptor Access rights (0009h).
- Под DPMI 1.0/VCPI/XMS/raw, любой сегментный регистр, который
содержит селектор, указанный в регистре BX, будет перезагружен. DPMI
0.9 также может делать это, но гарантий нет. Мы надеемся, что Вы
имеете достаточно ума, чтобы не пытаться изменить текущие значения
дескрипторов CS или SS или дескриптора буфера.
Функция 0100h - Распределение блока памяти DOS
Распределяет нижнюю память через функцию DOS 48h и распределяет ее
дескриптор.
Вход:
AX = 0100h
BX = параграфы для распределения
Выход:
Если выполнение успешно:
очистить флаг переноса
AX = адрес сегмента реального режима
DX = селектор защищенного режима для блока памяти
Если выполнение неуспешно:
установить флаг переноса
AX = Код ошибки DOS
BX = Размер самого большого доступного блока
Функция 0101h - Освобождение блока памяти DOS
Освобождает нижний блок памяти, предварительно распределенный функцией
0100h.
Вход:
AX = 0101h
DX = селектор защищенного режима для блока памяти
Выход:
Если выполнение успешно:
очистить флаг переноса
Если выполнение неуспешно:
установить флаг переноса
AX = Код ошибки DOS
Функция 0102h - Изменение блока памяти DOS
Изменяет размеры низкого блока памяти, предварительно распределенного
функцией 0100h.
Вход:
AX = 0102h
BX = размер нового блока в параграфе
DX = селектор защищенного режима для блока памяти
Выход:
Если выполнение успешно:
очистить флаг переноса
Если выполнение неуспешно:
установить флаг переноса
AX = Код ошибки DOS
BX = Размер самого большого доступного блока
Функция 0200h - Получение вектора прерываний реального режима
Возвращает сегмент:смещение реального режима для указанного вектора
прерываний.
Вход:
AX = 0200h
BL = номер прерывания
Выход:
Всегда успешно:
очистить флаг переноса
CX:DX = сегмент:смещение обработчика прерываний реального режима
Примечания:
- Значение, возвращенное в CX - это адрес сегмента реального режима,
а не селектор защищенного режима.
Функция 0201h - Установка вектора прерываний реального режима
Устанавливает сегмент:смещение реального режима для указанного вектора
прерываний.
Вход:
AX = 0201h
BL = номер прерывания
CX:DX = сегмент:смещение обработчика прерываний реального режима
Выход:
Всегда успешно:
очистить флаг переноса
Примечания:
- Значение, прошедшее в CX, должно быть адресом сегмента реального
режима, а не селектором защищенного режима. Следовательно, программа
обработки прерывания должна или постоянно находиться в памяти DOS
(ниже границы 1M) или клиент должен распределить адрес отзыва
реального режима.
Функция 0202h - Получение вектора обработчика исключений процессора
Возвращает адрес текущего обработчика исключений защищенного режима
для указанного номера исключения.
Вход:
AX = 0202h
BL = номер исключения (00h-1fh)
Выход:
Если выполнение успешно:
очистить флаг переноса
CX:EDX = селектор:смещение обработчика исключений
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- PMODE/W обрабатывает исключения под окружением clean/XMS/VCPI.
Под окружением DPMI обработка исключения обеспечивается DPMI.
- PMODE/W только заманивает в ловушку исключения от 0 до 14.
Заданное по умолчанию поведение должно закончить выполнение и делать
дамп отладки. PMODE/W закончит на исключениях 0, 1, 2, 3, 4, 5 и 7,
вместо прохождения их до обработчиков реального режима как DPMI
состояние спецификаций.
Функция 0203h - Установка вектора обработчика исключений процессора
Устанавливает адрес обработчика для исключения или ошибки ЦЕНТРАЛЬНОГО
ПРОЦЕССОРА, позволяя приложению защищенного режима прервать исключения
процессора.
Вход:
AX = 0203h
BL = номер исключения (00h-1fh)
CX:EDX = селектор:смещение обработчика исключений
Выход:
Если выполнение успешно:
очистить флаг переноса
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- PMODE/W обрабатывает исключения под окружением clean/XMS/VCPI. Под
окружением DPMI обработка исключения обеспечивается DPMI.
- PMODE/W только заманивает в ловушку исключения от 0 до 14.
Заданное по умолчанию поведение должно закончить выполнение и делать
дамп отладки. PMODE/W закончит на исключениях 0, 1, 2, 3, 4, 5 и 7,
вместо прохождения их до обработчиков реального режима как DPMI
состояние спецификаций.
- Если Вы желаете подключить одно из нижних 8 прерываний, Вы должны
подключить его как исключение. Оно не будет вызываться, если Вы
подключаете его с функцией 0205h.
Функция 0204h - Получение вектора прерываний защищенного режима
Возвращает адрес текущей программы обработки прерываний защищенного
режима для указанного прерывания.
Вход:
AX = 0204h
BL = номер прерывания
Выход:
Всегда успешно:
очистить флаг переноса
CX:EDX = селектор:смещение обработчика прерываний защищенного режима
Примечания:
- Значение, возвращенное в CX - правильный селектор защищенного
режима, а не адрес сегмента реального режима.
Функция 0205h - Установка вектора прерываний защищенного режима
Устанавливает адрес программы обработки прерываний защищенного режима
для указанного прерывания.
Вход:
AX = 0205h
BL = номер прерывания
CX:EDX = селектор:смещение обработчика прерываний защищенного режима
Выход:
Если выполнение успешно:
очистить флаг переноса
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- Значение, прошедшее в CX, должно быть правильным селектором
защищенного режима, а не адресом сегмента реального режима.
- Если Вы желаете подключить одно из нижних 8 прерываний, Вы должны
подключить его как исключение. Оно не будет вызываться, если Вы
подключаете его с функцией 0205h.
Функция 0300h - Моделирование прерываний реального режима
Моделирует прерывание в реальном режиме. Функция предает управление
по адресу, указанному вектором прерываний реального режима. Обработчик
реального режима должен возвращаться с помощью выполнения IRET.
Вход:
AX = 0300h
BL = номер прерывания
BH = должен быть 0
CX = Количество слов для копирования из стека защищенного режима в
стек реального режима
ES:EDI = селектор:смещение структуры данных регистра реального режима в
следующем формате:
Смещение Длина Содержимое
00h 4 EDI
04h 4 ESI
08h 4 EBP
0ch 4 зарезервировано, игнорируется
10h 4 EBX
14h 4 EDX
18h 4 ECX
1ch 4 EAX
20h 2 Состояние флагов процессора
22h 2 ES
24h 2 DS
26h 2 FS
28h 2 GS
2ah 2 IP (зарезервировано, игнорируется)
2ch 2 CS (зарезервировано, игнорируется)
2eh 2 SP
30h 2 SS
Выход:
Если выполнение успешно:
очистить флаг переноса
ES:EDI = селектор смещения измененной структуры данных регистра
защищенного режима
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- CS:IP в структуре данных регистра реального режима игнорируется
этой функцией. Соответствующая программа обработки прерывания будет
вызываться основанной на значении, прошедшем в BL.
- Если области SS:SP в структуре данных регистра реального режима -
ноль, то стек реального режима будет обеспечиваться хозяином. Иначе
реальный режим SS:SP будет установлен на указанные значения прежде,
чем программа обработки прерывания вызывается.
- Флаги, указанные в структуре данных регистра реального режима
будут вставлены в таблицу IRET программы обработки прерывания
реального режима. Программа обработки прерывания будет вызываться с
прерыванием и очищенными флагами трассировки.
- Значения, помещенные в сегмент позиции регистра структуры данных
должны быть допустимыми для реального режима. То есть значения должны
быть адресами параграфа, а не селекторами защищенного режима.
- Целевой обработчик реального режима должен возвратиться со стеком
в том же самом состоянии, как когда он вызывался. Это означает, что
код реального режима может переключать стеки во время его выполнения,
но должен возвратиться на том же самом стеке, которым он был вызван и
должен возвратиться с IRET.
- Когда эти функции возвращают значения, структура данных регистра
реального режима будет содержать значения, которые были возвращены
программой обработки прерывания реального режима. Значения CS:IP и
SS:SP не будут изменены в структуре данных.
- Это - ответственность вызывающего удалить любые параметры, которые
были помещены в стек защищенного режима.
Функция 0301h - Вызов Процедуры Реального режима С Далекой Возвращаемой Границы
Моделирует ДАЛЬНИЙ ВЫЗОВ к процедуре реального режима. Вызываемая
процедура должна возвратиться, выполняя команду RETF.
Вход:
AX = 0301h
BH = должен быть 0
CX = Количество слов для копирования из стека защищенного режима в
стек реального режима
ES:EDI = селектор:смещение структуры данных регистра реального режима в
следующем формате:
Смещение Длина Содержимое
00h 4 EDI
04h 4 ESI
08h 4 EBP
0ch 4 зарезервировано, игнорируется
10h 4 EBX
14h 4 EDX
18h 4 ECX
1ch 4 EAX
20h 2 Состояние флагов процессора
22h 2 ES
24h 2 DS
26h 2 FS
28h 2 GS
2ah 2 IP
2ch 2 CS
2eh 2 SP
30h 2 SS
Выход:
Если выполнение успешно:
очистить флаг переноса
ES:EDI = селектор смещения измененной структуры данных регистра
защищенного режима
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- CS:IP в структуре данных регистра реального режима определяет
адрес процедуры реального режима для вызова.
- Если области SS:SP в структуре данных регистра реального режима -
ноль, то стек реального режима будет обеспечиваться хозяином. Иначе
реальный режим SS:SP будет установлен на указанные значения прежде,
чем процедура вызывается.
- Значения, помещенные в сегмент позиции регистра структуры данных
должны быть допустимыми для реального режима. То есть значения должны
быть адресами параграфа, а не селекторами защищенного режима.
- Целевой обработчик реального режима должен возвратиться со стеком
в том же самом состоянии, как когда он вызывался. Это означает, что
код реального режима может переключать стеки во время его выполнения,
но должен возвратиться на том же самом стеке, которым он был вызван и
должен возвратиться с RETF и не должен очистить стек от каких-либо
параметров, которые пропущены для него в стек.
- Когда эти функции возвращают значения, структура данных регистра
реального режима будет содержать значения, которые были возвращены
процедурой реального режима. Значения CS:IP и SS:SP не будут изменены
в структуре данных.
- Это - ответственность вызывающего удалить любые параметры, которые
были помещены в стек защищенного режима.
Функция 0302h - Вызов Процедуры Реального режима IRET Frame
Моделирует ДАЛЬНИЙ ВЫЗОВ с флагами, помещенными в стек процедуры
реального режима. Процедура реального режима должна возвратиться,
выполняя команду IRET или RETF 2.
Вход:
AX = 0302h
BH = должен быть 0
CX = количество слов для копирования из стека защищенного режима в
стек реального режима
ES:EDI = селектор:смещение структуры данных регистра реального режима в
следующем формате:
Смещение Длина Содержимое
00h 4 EDI
04h 4 ESI
08h 4 EBP
0ch 4 зарезервировано, игнорируется
10h 4 EBX
14h 4 EDX
18h 4 ECX
1ch 4 EAX
20h 2 Состояние флагов процессора
22h 2 ES
24h 2 DS
26h 2 FS
28h 2 GS
2ah 2 IP
2ch 2 CS
2eh 2 SP
30h 2 SS
Выход:
Если выполнение успешно:
очистить флаг переноса
ES:EDI = селектор смещения измененной структуры данных регистра
защищенного режима
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- CS:IP в структуре данных регистра реального режима определяет
адрес процедуры реального режима для вызова.
- Если области SS:SP в структуре данных регистра реального режима -
ноль, то стек реального режима будет обеспечиваться хозяином. Иначе
реальный режим SS:SP будет установлен на указанные значения прежде,
чем процедура вызывается.
- Флаги, указанные в структуре данных регистра реального режима
будут вставлены в таблицу IRET процедуры реального режима. Процедура
будет вызываться с прерыванием и очищенными флагами трассировки.
- Значения, помещенные в сегмент позиции регистра структуры данных
должны быть допустимыми для реального режима. То есть значения должны
быть адресами параграфа, а не селекторами защищенного режима.
- Целевой обработчик реального режима должен возвратиться со стеком
в том же самом состоянии, как когда он вызывался. Это означает, что
код реального режима может переключать стеки во время его выполнения,
но должен возвратиться на том же самом стеке, которым он был вызван и
должен возвратиться с IRET или с ошибочными флагами из стека с RETF 2
и не должен очистить стек от каких-либо параметров, которые пропущены
для него в стек.
- Когда эти функции возвращают значения, структура данных регистра
реального режима будет содержать значения, которые были возвращены
процедурой реального режима. Значения CS:IP и SS:SP не будут изменены
в структуре данных.
- Это - ответственность вызывающего удалить любые параметры, которые
были помещены в стек защищенного режима.
Функция 0303h - Распределение адреса отзыва реального режима
Возвращает сегмент:смещение уникального реального режима, известного
как "отзыв реального режима", который передает управление от реального
режима к процедуре защищенного режима. Адреса Отзыва, полученные с
этой функцией можно пропускать в соответствии с программой защищенного
режима к приложению реального режима, программе обработки прерывания,
драйверу устройства, TSR, и т.д ... так, чтобы программа реального
режима могла вызывать процедуры в пределах программы защищенного
режима.
Вход:
AX = 0303h
DS:ESI = селектор:смещение процедуры защищенного режима для вызова
ES:EDI = селектор:смещение 32-битного буфера для реально режима
регистра структуры данных используемого при обращении к
отзывающей процедуре.
Выход:
Если выполнение успешно:
очистить флаг переноса
CX:DX = сегмент:смещение отзыва реального режима
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- Дескриптор может быть распределен для каждого отзыва для удержания
реального режима SS дескриптором. Отзывы Реального режима -
ограниченный системный ресурс. Клиент должен освободить отзыв,
который он больше не использует.
Функция 0304h - Освобождение адреса отзыва реального режима
Освобождает адрес отзыва реального режима, который был предварительно
распределен функцией 0303h.
Вход:
AX = 0304h
CX:DX = селектор:смещение процедуры защищенного режима для
освобождения
Выход:
Если выполнение успешно:
очистить флаг переноса
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- Отзывы Реального режима - ограниченный системный ресурс. Клиент
должен освободить любой отзыв, который он больше не использует.
Функция 0305h - Получение состояния адресов хранения/записи
Возвращается адрес двух процедур, используемых для хранения и
перезаписи состояния регистров текущей задачи в режиме (защищенном
или реальном) который в настоящее время не выполняется.
Вход:
AX = 0305h
Выход:
Всегда успешно:
очистить флаг переноса
AX = размер буфера в байтах, необходимый для хранения состояния
BX:CX = сегмент:смещение процедуры реального режима, используемой
для хранения/записи состояний
SI:EDI = селектор:смещение процедуры защищенного режима для
хранения/записи состояний
Примечания:
Функция 0306h - Получение адресов переключателя режима
Возвращает адреса, которые могут быть запрошены для переключения
режима низкого уровня.
Вход:
AX = 0306h
Выход:
Всегда успешно:
очистить флаг переноса
BX:CX = сегмент:смещение реального для процедуры переключения
защищенного режима
SI:EDI = селектор:смещение защищенного для процедуры переключения
реального режима
Примечания:
Функция 0400h - Получение версии
Возвращает версию DPMI Спецификации, осуществленной DPMI хостом.
Клиент может использовать эту информацию, чтобы определить какие
функции являются доступными.
Вход:
AX = 0400h
Выход:
Всегда успешно:
очистить флаг переноса
AH = двоичное число - старшая версия DPMI (VCPI/XMS/raw возвращает
00h)
AL = двоичное число - младшая версия DPMI (VCPI/XMS/raw возвращает
5ah)
BX = флаги:
Биты Значения
0 0 = хост - 16 бит (PMODE/W никогда не выполняется под
одной из них)
1 = хост - 32 бит
1 0 = CPU возвращается к режиму V86 для отклоненных
прерываний
1 = CPU возвращается к реальному режиму для
отклоненных прерываний
2 0 = виртуальная память не поддерживается
1 = виртуальная память поддерживается
3-15 резерв
CL = тип процессора:
03h = 80386
04h = 80486
05h = 80586
06h-ffh = резерв
DH = текущее значение базового мастера PIC прерываний (low 8 IRQs)
DL = текущее значение базового слуги PIC прерываний (high 8 IRQs)
Примечания:
- Главные и младшие номера версии двойные, не BCD. Так DPMI 0.9
выполнения возвратилось бы АН как 0 и AL как 5ah (90).
Функция 0500h - Получение информации о свободной памяти
Возвращает информацию о количестве доступной памяти. С тех пор как
клиентские приложения DPMI могут выполняться в многозадачной среде,
информация, возвращенная этой функцией должна рассматриваться как
консультация.
Вход:
AX = 0500h
ES:EDI = селектор:смещение 48-байтного буфера
Выход:
Если выполнение успешно:
очистить флаг переноса
буфер заполняется следующей информацией
Смещение Длина Содержание
00h 4 Самый большой доступный свободный блок в байтах
04h 2ch Другие области, снабженные только DPMI
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- Только первая область структуры, как гарантируют, будет содержать
правильное значение. Любые области, которые не поддержаны хостом,
будут установлены на -1 (0ffffffffh), чтобы указать, что информация -
не доступна.
Функция 0501h - Распределение блока памяти
Распределяет блок расширенной памяти.
Вход:
AX = 0501h
BX:CX = размер блока в байтах (не должен быть равен 0)
Выход:
Если выполнение успешно:
очистить флаг переноса
BX:CX = Линейный адрес распределенного блока памяти
SI:DI = дескриптор блока памяти (используется для измерения и
свободного блока)
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- Распределенный блок, как гарантируют, будет иметь по крайней мере
DWORD выравнивание.
- Эта функция не распределяет никакие дескрипторы для блока памяти.
Это - ответственность клиента, чтобы распределять и инициализировать
любые дескрипторы, необходимые, чтобы обратиться к памяти с
дополнительными функциональными запросами.
Функция 0502h - Освобождение блока памяти
Освобождает блок памяти, предварительно распределенный с функцией
(0501h)
Вход:
AX = 0502h
SI:DI = дескриптор блока памяти
Выход:
Если выполнение успешно:
очистить флаг переноса
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- Никакие дескрипторы не освобождены этим запросом. Это -
ответственность клиента свободному на любые дескрипторы, что это
предварительно распределило, чтобы отобразить блок памяти. Дескрипторы
должны быть освобождены перед блоками памяти.
Функция 0503h - Изменение размеров блока памяти
Изменяет размер блока памяти, предварительно распределенного с
функцией (0501h) Allocate Memory Block.
Вход:
AX = 0503h
BX:CX = новый размер блока памяти в байтах (не должен быть равен 0)
SI:DI = дескриптор блока памяти
Выход:
Если выполнение успешно:
очистить флаг переноса
BX:CX = Новый линейный адрес блока памяти
SI:DI = Новый дескриптор блока памяти
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- После этих успешных функциональных возвращений, предыдущий
дескриптор для блока памяти недопустим и не должен использоваться больше.
- Это - ответственность клиента модифицировать любые дескрипторы,
которые отображают блок памяти с новым линейным адресом после
изменения размеров блока.
Функция 0800h - Физическое Отображение Адреса
Преобразовывает физический адрес в линейный адрес. Эта функция
позволяет клиенту обращаться к устройствам, отображенным в
определенном физическом адресе памяти.
Вход:
AX = 0800h
BX:CX = физический адрес памяти
SI:DI = размер области для отображения в байтах
Выход:
Если выполнение успешно:
очистить флаг переноса
BX:CX = Линейный адрес, который может использоваться для доступа к
физической памяти
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- Это - ответственность вызывающего распределять и инициализировать
дескриптор для доступа к памяти.
- Клиенты не должны использовать эту функцию, чтобы обратиться к
памяти ниже границы НА 1 МБАЙТА.
Функция 0801h - Свободное отображение физического адреса памяти
Освобождает отображение физических к линейным адресам, который был
предварительно получен с функцией 0800-ой.
Вход:
AX = 0801h
BX:CX = Линейный адрес, возвращенный физическим адресом, отображающим
запрос
Выход:
Если выполнение успешно:
очистить флаг переноса
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- Клиент должен вызвать эту функцию, когда это закончено, используя
устройство, предварительно отображенное к линейным адресам с функцией
0801h.
Функция 0900h - Получение и выключение состояния виртуальных прерываний
Отключает виртуальный флаг прерывания и возвращает предыдущее его
состояние.
Вход:
AX = 0900h
Выход:
Всегда успешно:
очистить флаг переноса
AL = 0, если виртуальные прерывания были предварительно
отключены
AL = 1 если виртуальные прерывания были предварительно
включены
Примечания:
- АН не изменяется этой функцией. Поэтому предыдущее состояние может
быть восстановлено, просто выполняя другой INT 31h.
- Клиент, который не должен знать предшествующее состояние
прерывания, может выполнять команду CLI скорее чем запрос этой
функции. Команда может быть заманена в ловушку DPMI хостом и должна
быть принята, чтобы быть очень медленно.
Функция 0901h - Получение и включение состояния виртуальных прерываний
Включает виртуальный флаг прерывания и возвращает предыдущее его
состояние.
Вход:
AX = 0901h
Выход:
Всегда успешно:
очистить флаг переноса
AL = 0, если виртуальные прерывания были предварительно
отключены
AL = 1 если виртуальные прерывания были предварительно
включены
Примечания:
- АН не изменяется этой функцией. Поэтому предыдущее состояние может
быть восстановлено, просто выполняя другой INT 31h.
- Клиент, который не должен знать предшествующее состояние
прерывания, может выполнять команду STI скорее чем запрос этой
функции. Команда может быть заманена в ловушку DPMI хостом и должна
быть принята, чтобы быть очень медленно.
Функция 0902h - Получение состояния виртуальных прерываний
Возвращает текущее состояние флага виртуальных прерываний.
Вход:
AX = 0902h
Выход:
Всегда успешно:
очистить флаг переноса
AL = 0, если виртуальные прерывания отключены
AL = 1 если виртуальные прерывания включены
Примечания:
- Эта функция должна использоваться вместо команды PUSHF, чтобы
исследовать флаг прерывания, потому что команда PUSHF возвращает
физический флаг прерывания скорее чем виртуальный флаг прерывания.
На некоторых DPMI хостах, физический флаг прерывания будет всегда
допускаться, даже когда аппаратные прерывания не пропускают через
клиенту.
Функция EEFFh - Получение информации расширителя DOS
Возвращает информацию о расширителе DOS.
Вход:
AX = EEFFh
Выход:
Если выполнение успешно:
очистить флаг переноса
EAX = 'PMDW' (504D4457h)
ES:EBX = селектор:смещение строки авторских прав ASCIIZ
CH = тип системы защищенного режима (0=raw, 1=XMS, 2=VCPI,
3=DPMI)
CL = тип процессора (3=386, 4=486, 5=586)
DH = версия СТАРШЕГО расширителя (binary)
DL = версия МЛАДШЕГО расширителя (binary)
Если выполнение неуспешно:
установить флаг переноса
Примечания:
- В PMODE/W's выполнении этой функции, значение, возвращенное в ES
эквивалентно 4G селектору данных, возвращенный в DS при запуске.
- Эта функция всегда успешна под PMODE/W.