
Dos7book
.pdf
Глава 8: Вызовы обработчиков прерываний
При возврате состояние стека не изменяется, и тогда
|
AL |
– код ASCII соответствующей заглавной буквы. |
8.03-08 |
INT 2F\AX=1214h – сравнение четырехбайтовых указателей |
|
При вызове: |
|
|
|
AX |
= 1212h |
DS:SI – первый указатель
ES:DI – второй указатель При возврате:
флаг ZF установлен и флаг CF сброшен, если указатели одинаковы; флаг ZF сброшен и флаг CF установлен, если указатели различны.
8.03-09 INT 2F\AX=1216h – определение адреса блока описания в таблице SFT
Обработчик прерывания INT 2F\AX=1216h принимает номер запрашиваемого блока описания в таблицах SFT (A.01-4) и возвращает указатель на этот блок, предоставляя тем самым возможность доступа к нему.
При вызове: |
|
AX |
= 1216h |
BX |
– номер запрашиваемого блока описания в таблице SFT |
При успешном завершении флаг CF сброшен, значение в AX утрачено, и тогда |
|
ES:DI – указатель на блок описания в SFT, |
|
BX |
– относительный номер блока описания в той таблице SFT, в |
которой этот блок описания содержится.
Если при возврате флаг CF установлен, то миссия потерпела неудачу.
Примечание 1: вероятная причина неудачного завершения – запрос номера, превышающего предел, установленный командой FILES (4.12).
Примечание 2: указатель на номер блока описания в таблице SFT можно найти по известной номерной ссылке с помощью INT 2F\AX=1220h (8.03-11).
8.03-10 INT 2F\AX=121Eh – сопоставление имен файлов
При вызове:
AX = 121Eh
DS:SI – указатель на строку с именем первого файла; ES:DI – указатель на строку с именем второго файла; обе строки должны кончаться байтом 00h.
При возврате флаг ZF установлен, если имена эквивалентны. Флаг ZF сброшен, если имена разные.
– 439 –

Глава 8: Вызовы обработчиков прерываний
8.03-11 INT 2F\AX=1220h – указатель на байт в таблице JFT
Таблица JFT (Job File Table, примечание 3 к A.07-1) содержит номера блоков описания, находящихся в другой таблице – SFT (System File Table, A.01-4) и описывающих состояние открытых для доступа объектов – каналов или файлов. Доступ к этим объектам осуществляется по номерным ссылкам, известным вызывающей программе. Путь от номерной ссылки до соответствующего объекту блока описания начинается с вызова INT 2F\AX=1220h, возвращающего указатель на номер блока описания в таблице SFT. Затем по этому номеру с помощью INT 2F\AX=1216h (8.03-09) можно будет найти адрес соответствующего объекту блока описания в таблице SFT.
При вызове: |
|
AX |
= 1220h |
BX |
– номерная ссылка |
Если при возврате флаг CF сброшен, то
ES:DI – адрес того байта таблицы JFT, в котором записан искомый номер блока описания из таблицы SFT.
При неудаче флаг CF установлен, AL = 06h (- неверная номерная ссылка).
Примечание 1: значение FFh в том байте таблицы JFT, на который указывает возвращенный адрес в регистрах ES:DI, означает неактивное (закрытое) состояние запрошенной номерной ссылки.
8.03-12 INT 2F\AX=122Ch – путь к цепи драйверных заголовков
Вызов INT 2F\AX=122Ch позволяет проследить всю цепочку заголовков загруженных драйверов, потому что каждый заголовок начинается с 4-байтового указателя на следующий заголовок. Заголовок последнего драйвера начинается со слова FFFFh.
При вызове: |
|
|
|
AX |
= 122Ch |
При возврате: |
|
|
|
BX:AX – указатель на начало заголовка второго драйвера (первый |
|
|
|
драйвер – это драйвер виртуального устройства NUL, |
|
|
находящийся в "списке списков", A.01-2). |
8.03-13 |
INT 2F\AX=1500h – число имеющихся оптических дисководов |
|
При вызове: |
|
|
|
AX |
= 1500h |
|
BX |
= 0000h |
При успешном завершении в регистре AL сигнатура FFh (примечание 1), и тогда:
– 440 –

Глава 8: Вызовы обработчиков прерываний
BX |
– число имеющихся оптических дисководов |
CX |
– номер диска, присвоенный первому оптическому дисководу |
|
(0002h = C:, 0003h = D:, и т.д.). |
Примечание 1: возврат исходного состояния AL = 00h означает, что не загружен
резидентный модуль программы доступа к оптическим дискам (5.08-03 или 5.08-04), который должен отвечать на вызов функции
INT 2F\AX=1500h.
Примечание 2: обработчик прерывания INT 2F\AX=1500h "конфликтует" с драйвером GRAPHICS.COM и, помимо того, может ошибаться в букве первого оптического дисковода, когда установлен драйвер
INTERLNK.EXE.
8.03-14 INT 2F\AX=1501h – адреса драйверов оптических дисководов
При вызове:
AX = 1501h
ES:BX – указатель на буфер, по 5 байт на каждый дисковод При возврате:
ES:BX – указатель на буфер, заполненный данными: для каждого дисковода 1-й байт – номер обслуживаемого драйвером устройства, а следующие за ним 4 байта – адрес соответствующего драйверного заголовка. Длина блока данных определяется числом дисководов, которое можно узнать посредством функции INT 2F\AX=1500h (8.03-13).
Примечание 1: прежде чем вызывать обработчик прерывания INT 2F\AX=1501h,
входящий в состав резидентного модуля программы доступа к оптическим дискам (5.08-03 или 5.08-04), нужно сначала вызовом INT 2F\AX=150Bh (8.03-17) проверить, загружен ли и активен ли этот резидентный модуль.
Примечание 2: при работе в "окне DOS" операционной системы WINDOWS вызов INT 2F\AX=1501h возвращает AX=0000h и неверные адреса.
8.03-15 |
INT 2F\AX=1505h – чтение таблицы содержания оптического диска |
|
При вызове: |
|
|
|
AX |
= 1505h |
|
CX |
– номер оптического диска (0002h = C:, 0003h = D:, и т.д.) |
|
DX |
– индекс сектора (примечание 2) |
|
ES:BX – указатель на буфер размером 2048 байт |
|
При неудачном завершении флаг CF установлен, AH = 00h |
||
|
AL |
– вид ошибки: |
– 441 –

Глава 8: Вызовы обработчиков прерываний
=15h – неверно указан номер диска
=21h – дисковод занят или диск в нем отсутствует
Если флаг CF сброшен, то в буфере – таблица содержания, и тогда AL – тип дескриптора:
=01h – стандартный дескриптор тома;
=FFh – последний дескриптор тома;
=00h – все другие виды дескрипторов тома.
Примечание 1: прежде чем вызывать обработчик прерывания INT 2F\AX=1505h,
входящий в состав резидентного модуля программы доступа к оптическим дискам (5.08-03 или 5.08-04), нужно сначала вызовом INT 2F\AX=150Bh (8.03-17) проверить, загружен ли и активен ли этот резидентный модуль.
Примечание 2: оптический диск может содержать несколько дескрипторов тома, индекс сектора 0000h соответствует первому дескриптору, индекс сектора 0001h – второму дескриптору, и т.д.
8.03-16 |
INT 2F\AX=1508h-1509h – доступ к секторам оптического диска |
|
При вызове: |
|
|
|
AX |
= 1508h – операция считывания |
|
|
= 1509h – операция записи |
|
CX |
– номер оптического диска (0002h = C:, 0003h = D:, и т.д.) |
|
DX |
– число секторов, которые надо считать или записать |
|
ES:BX – указатель на буфер с данными или для данных |
|
|
SI:DI – номер сектора, с которого надо начать |
|
При неудачном завершении флаг CF установлен, и тогда причина неудачи |
||
|
AL |
= 0Fh – неверно указан номер диска |
= 15h – дисковод занят или диск в нем отсутствует.
Если флаг CF сброшен, то операция прошла успешно, после операции считывания буфер заполнен считанными данными.
Примечание 1: прежде чем вызывать обработчики прерываний INT 2F\AX=1508h и INT 2F\AX=1509h, входящие в состав резидентного модуля программы доступа к оптическим дискам (5.08-03 или 5.08-04), нужно сначала вызовом INT 2F\AX=150Bh (8.03-17) проверить, загружен ли и активен ли этот резидентный модуль.
Примечание 2: вызовы INT 2F\AX=1508h-1509h при работе в "окне DOS" системы Windows всегда возвращают AL = 15h (диск занят).
Примечание 3: ранние версии программ доступа к оптическим дискам (5.08-03 и 5.08-04) не поддерживали операцию записи. Кроме того, многие оптические дисководы аппаратно неспособны осуществлять запись.
– 442 –

Глава 8: Вызовы обработчиков прерываний
8.03-17 |
INT 2F\AX=150Bh – запрос об обслуживании диска. |
|
При вызове: |
|
|
|
AX |
= 150Bh |
|
CX |
– номер диска (0002h = C:, 0003h = D:, и т.д.). |
При возврате: |
|
|
|
BX |
= ADADh, – подтверждение активности резидентного модуля |
|
|
программы доступа к оптическим дискам (5.08-03 или 5.08-04). |
|
AX |
= 0000h – значит, запрошен диск, не обслуживаемый модулем |
|
|
программы доступа к оптическим дискам. |
8.03-18 |
INT 2F\AX=150Dh – номера оптических дисков |
|
При вызове: |
|
|
|
AX |
= 150Dh |
|
ES:BX – указатель на буфер, по одному байту на диск |
При возврате:
ES:BX – указатель на буфер, заполненный номерами дисков (02h = C:, 03h = D:, и т.д.). Конец списка номеров отмечен байтом 00h.
Примечание 1: прежде чем вызывать обработчик прерывания INT 2F\AX=150Dh,
входящий в состав резидентного модуля программы доступа к оптическим дискам (5.08-03 или 5.08-04), нужно сначала вызовом INT 2F\AX=150Bh (8.03-17) проверить, загружен ли и активен ли этот резидентный модуль.
8.03-19 INT 2F\AX=150Fh – считывание каталога оптического диска
При вызове: |
|
|
AX |
= 150Fh |
|
CH |
= 00h |
– считывать каталог "как он есть", без изменений |
|
= 01h |
– считывать, преобразуя в каноническую форму (A.09-6) |
CL |
– номер оптического диска (02h = C:, 03h = D:, и т.д.) |
|
ES:BX – указатель на строку с путем, кончающуюся байтом 00h |
||
SI:DI |
– адрес буфера, не менее 255 байт для прямого копирования. |
При неудачном завершении флаг CF установлен, AX = код завершения (A.06-1). При успешном завершении флаг CF сброшен, буфер SI:DI заполнен, и тогда
AX – формат диска:
=0000h – диск формата High Sierra,
=0001h – диск формата ISO 9660.
Примечание 1: прежде чем вызывать обработчик прерывания INT 2F\AX=150Fh,
входящий в состав резидентного модуля программы доступа к оптическим дискам (5.08-03 или 5.08-04), нужно сначала вызовом
– 443 –

Глава 8: Вызовы обработчиков прерываний
|
|
INT 2F\AX=150Bh (8.03-17) проверить, загружен ли и активен ли |
|
|
этот резидентный модуль. |
8.03-20 |
INT 2F\AX=160Ah – тест операционной среды OS Windows. |
|
При вызове: |
|
|
|
AX |
= 160Ah |
При возврате: |
|
|
|
AX |
= 0000h, если OS Windows отвечает на вызов INT 2F\AX=160Ah. |
|
BH:BL – версия OS Windows |
|
|
CX – вид установки (0002h = стандартный, 0003h = улучшенный) |
Примечание 1: возврат ненулевого значения в регистре AX не означает, что действие происходит вне "окна DOS" операционной системы Windows. Дело в том, что среди настроек OS Windows имеется флаг
"Prevent DOS programs from detecting Windows" (= не позволять программам DOS обнаруживать Windows). Когда этот флаг установлен, OS Windows не отвечает на вызов INT 2F\AX=160Ah.
8.03-21 INT 2F\AX=1687h – пробный запрос к серверу DPMI.
Серверы DPMI обслуживают исполнение программ в режиме V86 и по запросу активизируют функции прерывания INT 31. Эти функции дают программам возможность устанавливать свои обработчики прерываний защищенного режима, а
также запрашивать выделение дополнительных ресурсов у того драйвера или у той операционной системы, которыми организована работа в режиме V86. Серверы
DPMI для работы в среде DOS (QDPMI.SYS, CWSDPMI.EXE и др.) сейчас применяют редко, так как самый доступный сервер DPMI предоставлен операционной системой Windows в эмулируемой среде ее "окна DOS". Там пробный запрос к серверу DPMI всегда срабатывает, даже когда система Windows "не хочет" обнаруживать себя легально (примечание 1 к 8.03-20). Помимо прочего,
положительная реакция на пробный запрос является достаточным свидетельством того, что процессор компьютера работает в режиме V86. По перечисленным причинам к функции INT 2F\AX=1687h приходится обращаться, несмотря на то, что сервер DPMI в состав MS-DOS7 не входит, и пользование другими функциями DPMI в этой книге не рассматривается.
При вызове: |
|
AX |
= 1687h |
При возврате: |
|
AX |
= 0000h – подтверждение того, что сервер DPMI загружен |
BX |
– бит 0 = 1b означает поддержку 32-битовых программ |
CL |
– тип процессора (02h – 80286, 03h – 80386, 04h – 80486,...) |
– 444 –

Глава 8: Вызовы обработчиков прерываний
DH:DL – версия сервера DPMI
SI |
– число параграфов в блоке данных сервера DPMI |
ES:DI |
– адрес входа для активизации функций прерывания INT 31 |
Примечание 1: в отличие от среды, формируемой драйверами DPMI для DOS, в среде "окна DOS" операционной системы Windows нет доступа к таймеру BIOS (8.01-73) и к функциям VCPI (8.03-71 – 8.03-73).
Примечание 2: операционная система "Open DOS" фирмы Caldera отличается от всех других версий DOS тем, что в ней сервер DPMI включен в состав драйвера EMM386.EXE.
8.03-22 INT 2F\AX=4300h – тест доступности функций XMS-драйвера.
При вызове:
AX = 4300h
При возврате:
если AL = 80h, то XMS-драйвер (HIMEM.SYS, 5.04-01) установлен;
при любом другом значении AL функции XMS-драйвера недоступны.
8.03-23 INT 2F\AX=4310h – адрес вызова функций XMS-драйвера
Обработчик прерывания INT 2F\AX=4310h возвращает адрес для вызова командой CALL FAR (7.03-08) функций XMS- драйвера, перечисленных в таблице
A.12-3.
При вызове: |
|
|
|
|
AX |
= 4310h |
|
При возврате: |
|
|
|
|
ES:BX – адрес вызова XMS-драйвера (HIMEM.SYS, 5.04-01). |
||
Примечание 1: обработчик |
прерывания INT 2F\AX=4310h устанавливается |
||
|
|
драйвером HIMEM.SYS, поэтому нужно сначала проверить, |
|
|
|
загружен ли этот драйвер, посредством вызова INT 2F\AX=4300h |
|
|
|
(8.03-22). |
|
Примечание 2: для вызова |
INT 2F\AX=4310h и других функций драйвера |
||
|
|
HIMEM.SYS требуется наличие до 256 байт свободного |
|
|
|
пространства стека. |
|
8.03-24 |
INT 2F\AX=4B52h – операции драйвера KEYRUS.COM (5.02-05) |
||
При вызове: |
|
|
|
|
AX |
= 4B52h (= 'KR') |
|
|
BL |
– операция: |
|
|
|
= 00h – проверка, загружен ли драйвер KEYRUS.COM |
|
|
|
|
– 445 – |

Глава 8: Вызовы обработчиков прерываний
=4Ch – ввод знаков 0 – 127 (американского алфавита)
=90h – ввод знаков 128 – 255 (национального алфавита)
При возврате значение в ES утрачивается.
Если драйвер KEYRUS.COM установлен, то операция 00h возвращает:
|
AL |
= 82h |
|
BH:BL – номер версии драйвера KEYRUS.COM |
|
8.03-25 |
INT 2F\AX=AD00h – тест загрузки драйвера DISPLAY.SYS. |
|
При вызове: |
|
|
|
AX |
= AD00h |
При возврате: |
|
|
|
если AL = FFh, то драйвер DISPLAY.SYS (5.02-02) установлен. |
|
|
Состояние регистра BX может быть изменено. |
|
8.03-26 |
INT 2F\AX=AD01h-AD02h – активная кодовая страница |
Вызовы прерываний INT 2F\AX=AD01h-AD02h обслуживаются резидентным модулем драйвера DISPLAY.SYS (5.02-02). Перед обращением к нему необходимо с помощью INT 2F\AX=AD00h (8.03-25) убедиться, что он установлен.
При вызове: |
|
AX |
= AD01h – сменить кодовую страницу знакогенератора |
|
= AD02h – сообщить номер установленной кодовой страницы |
BX |
– новая кодовая страница (A.02-2), только при AX=AD01h. |
При успешном завершении флаг CF сброшен, подфункция AX=AD02h возвращает: BX – номер установленной кодовой страницы.
При неудаче флаг CF установлен, содержимое регистров AX и BX не сохраняется.
8.03-27 INT 2F\AX=AD03h – сведения о кодовых страницах знакогенератора
Вызов прерывания INT 2F\AX=AD03h обслуживается резидентным модулем драйвера DISPLAY.SYS (5.02-02). Перед обращением к нему необходимо с помощью INT 2F\AX=AD00h (8.03-25) убедиться, что он установлен.
При вызове: |
|
AX |
= AD03h |
ES:DI – указатель на буфер для блока данных |
|
CX |
– размер буфера в байтах (A.02-6) |
При неудаче флаг CF установлен. Вероятная причина: буфер слишком мал. При удачном завершении флаг CF сброшен, и тогда
ES:DI – указатель на блок данных, показанный в разделе A.02-6.
– 446 –

Глава 8: Вызовы обработчиков прерываний
8.03-28 |
INT 2F\AX=AD80h – тест доступности функций драйвера KEYB.COM. |
|
При вызове: |
|
|
|
AX |
= AD80h |
Если драйвер KEYB.COM (5.02-04) установлен, то AL = FFh, и тогда |
||
|
BH:BL – номер версии драйвера |
|
|
ES:DI |
– указатель на блок служебных данных драйвера. |
Содержимое регистра AH может быть изменено.
8.03-29 INT 2F\AX=AD81h – задание кодовой страницы для клавиатуры
Вызов прерывания INT 2F\AX=AD81h обслуживается резидентным модулем драйвера KEYB.COM (5.02-04). Перед обращением к нему необходимо с помощью INT 2F\AX=AD80h (8.03-28) убедиться в том, что он установлен.
При вызове: |
|
AX |
= AD81h |
BX |
– номер кодовой страницы |
При неудаче флаг CF установлен, AX = 0001h если кодовая страница недоступна. Если флаг CF сброшен, то миссия завершена успешно.
8.03-30 INT 2F\AX=AD82h-AD83h – раскладки клавиатуры
Вызовы функций INT 2F\AX=AD82h-AD83h обслуживаются резидентным модулем драйвера KEYB.COM (5.02-04). Перед обращением к нему необходимо с помощью INT 2F\AX=AD80h (8.03-28) убедиться в том, что он установлен.
При вызове: |
|
AX |
= AD82h – задать раскладку клавиатуры |
AX |
= AD83h – выяснить действующую раскладку клавиатуры |
BL |
– операция (только при AX = AD82h): |
|
= 00h – задать американскую раскладку |
|
= FFh – задать национальную раскладку |
При неудаче флаг CF установлен, вероятная причина – неверное значение в BL. При удачном завершении флаг CF сброшен, и тогда только после AX=AD83h:
BL = 00h – активна американская раскладка (знаки 32 - 127), = FFh – активна национальная раскладка (знаки 128 - 255).
8.03-31 INT 33\AX=0000h – установка начального состояния драйвера "мыши"
Приведение в начальное состояние означает установление таких значений параметров, которые принимаются по умолчанию. Счетчики смещений "мыши" и вращения ее колеса прокрутки сбрасываются в нуль, координаты курсора задаются
– 447 –

Глава 8: Вызовы обработчиков прерываний
на центр экрана, для отображения назначается экранная страница 0, и курсор делается невидимым (сделать его видимым можно с помощью INT 33\AX=0001h). Помимо прочего, вызов INT 33\AX=0000h позволяет определить, установлен ли драйвер "мыши", и если установлен, то какую именно "мышь" он обслуживает.
При вызове:
AX = 0000h
Если при возврате AX = 0000h, то драйвер "мыши" не установлен (примечание 2). Если при возврате AX = FFFFh, то драйвер "мыши" установлен, и тогда
CX = 0000h – применена не-двухкнопочная "мышь";
=0002h (и FFFFh тоже) – используется 2-кнопочная "мышь";
=0003h – 3-кнопочная "мышь" Mouse Systems или Logitech.
Примечание 1: если видеорежим был изменен, то перед установлением начального состояния нужно сбросить флаг смены видеорежима (примечание 2
к INT 33\AX=0028h, 8.03-52).
Примечание 2: MS-DOS7 заполняет свободные ячейки таблицы прерываний (до INT 3F) отсылками к команде IRET (7.03-30). Когда драйвер "мыши" не загружен, эта команда IRET просто возвращает неизмененное состояние регистра AX. Определить, установлен ли драйвер "мыши", не приводя его в начальное состояние, можно с помощью функции INT 33\AX=0021h (8.03-49).
8.03-32 INT 33\AX=0001h-0002h – переключение отображения курсора "мыши"
При вызове:
AX = 0001h – разрешить отображение курсора "мыши" = 0002h – запретить отображение курсора "мыши"
Примечание 1: запрещать отображение курсора "мыши" нужно при завершении работы любой программы, вызывавшей отображение курсора "мыши". Помимо того, полезно запрещать отображение курсора перед каждым изменением содержания изображения, но только это лучше делать локально посредством INT 33\AX=0010h (8.03-42).
Примечание 2: если вызывать INT 33\AX=0002h несколько раз, то потребуется столько же раз вызывать INT 33\AX=0001h, чтобы снова сделать курсор видимым. Число несброшенных запретов отображения можно выяснить с помощью INT 33\AX=002Ah (8.03-53).
8.03-33 INT 33\AX=0003h – положения кнопок, курсора и колеса прокрутки
При вызове:
AX = 0003h
При возврате:
– 448 –