Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Dos7book

.pdf
Скачиваний:
86
Добавлен:
09.02.2015
Размер:
5.1 Mб
Скачать

Глава 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-718.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 –

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]