Dos7book
.pdf
Глава 8: Вызовы обработчиков прерываний
При возврате в регистре AH – код завершения из таблицы A.06-1, если флаг CF сброшен, то дисковод свободен,
если флаг CF установлен, то дисковод занят.
Примечание 1: прежде чем |
вызывать INT 15\AH=52h, надо |
с помощью |
INT 13\AH=41h определить, поддерживается ли эта функция в |
||
данном компьютере. |
|
|
Примечание 2: по умолчанию BIOS устанавливает "заглушку", которая на вызовы |
||
INT 15\AH=52h |
всегда отвечает CF=0. Вызовы |
INT 15\AH=52h |
перехватывает программа кэширования, и только тогда ответ будет отражать реальное состояние процесса обмена данными.
8.01-70 INT 15\AX=5301h – активизация управления электропитанием.
В момент включения компьютера программное управление электропитанием (APM) не активизируется автоматически. При работе компьютера в реальном
режиме для активизации управления электропитанием необходим вызов обработчика прерывания INT 15\AX=5301h.
При вызове: |
|
AX |
= 5301h |
BX |
= 0000h (идентификатор APM-расширения системы BIOS). |
При неудаче флаг CF установлен, в AH – код завершения (A.06-1). Если флаг CF сброшен, то миссия завершена успешно.
Примечание 1: обработчик прерывания INT 15\AX=5301h заставляет систему APM эмулировать спецификации APM версии 1.0. Если нужно вызывать операции, не определенные в версии 1.0, то их следует заранее разблокировать с помощью INT 15\AX=530Eh (8.01-72).
8.01-71 INT 15\AX=5307h – переключение режимов электропитания.
Программное выключение наиболее распространенных компьютеров конструктивного исполнения ATX выполняется путем перевода их блока электропитания в дежурный режим. При этом электропитание продолжает подаваться только на те узлы, которые обеспечивают возможность автоматического включения компьютера. Разумеется, программное выключение невозможно без аппаратной поддержки со стороны блока электропитания и материнской платы.
При вызове: |
|
|
AX |
= 5307h |
|
BX |
= 0001h |
(идентификатор всех APM-управляемых устройств) |
CX |
= 0003h |
(код запроса программного выключения) |
При неудаче флаг CF установлен, в AH – код завершения (A.06-1),
– 369 –
Глава 8: Вызовы обработчиков прерываний
а при удачном завершении все остальное не имеет значения.
Примечание 1: операция выключения определена в спецификации APM версии 1.2.
Если система управления электропитанием эмулирует операции версии 1.0 (примечание 1 к 8.01-70), то возможность программного
выключения электропитания необходимо сначала разблокировать с помощью INT 15\AX=530Eh (8.01-72).
Примечание 2: в устаревших компьютерах конструктивного исполнения AT вызов данной операции допустим, но игнорируется.
8.01-72 INT 15\AX=530Eh – запрос версии управления электропитанием.
Чтобы обеспечить совместимость с имеющимися операционными системами, в спецификации управления электропитанием (APM) заложена возможность эмуляции более новыми версиями APM BIOS тех совокупностей операций, которые были способны исполнять старые версии APM. Программа, которой предстоит управлять электропитанием, должна заранее запросить у APM BIOS эмуляцию желаемой версии APM, а потом принять к исполнению возвращаемое APM BIOS сообщение о том, какую ближайшую версию APM данная APM BIOS способна
воспроизвести. |
|
При вызове: |
|
AX |
= 530Eh |
BX |
= 0000h (идентификатор APM-расширения системы BIOS) |
CX |
– версия APM, эмуляция которой запрашивается (примечание 1) |
При возврате:
при неудаче флаг CF установлен, в AH – код завершения (A.06-1), если флаг CF сброшен, то в AX – версия APM, которой будет
соответствовать предоставляемое множество операций.
Примечание 1: в регистре CX целую и дробную части номера версии APM надо записывать в разные байты. В частности, для запроса версии 1.2 надо указать CX=0102h. В таком же формате APM BIOS возвратит номер фактически эмулируемой версии в регистре AX.
Примечание 2: данная операция определена начиная со спецификации APM версии 1.1. Если возвращен код завершения AH=80h или AH=86h, а вызов INT 15\AX=5301h (8.01-70) завершился как-либо иначе, значит, BIOS данного компьютера реализует только APM версии 1.0.
8.01-73 INT 15\AH=83h,86h – управление счетом времени в таймере BIOS
При вызове:
AX = 8300h – запустить счет и отметить его окончание изменением состояния маркерного байта (примечание 3)
– 370 –
Глава 8: Вызовы обработчиков прерываний
AX |
= 8600h |
– запустить счет и остановить вызывающий процесс |
|
до окончания счета |
|
CX |
– старшие 16 бит 32-битовой задержки в микросекундах |
|
DX |
– младшие 16 бит 32-битовой задержки в микросекундах |
|
ES:BX– указатель на маркерный байт (только для AX = 8300h) |
||
При возврате: |
|
|
флаг CF сброшен при успешном завершении |
||
флаг CF установлен при ошибке или запуске, когда счет уже идет |
||
AH |
– код завершения из таблицы A.06-1. |
|
Примечание 1: вероятный шаг счета времени – 977 микросекунд.
Примечание 2: чтобы прервать уже начатый счет, надо вызвать INT 15\AH=8301h. Примечание 3: обычно маркерный байт – это байт 0040:00A0h (A.12-1). Некоторые системы BIOS по завершении счета устанавливают в единицу его
старший бит, другие записывают в маркерный байт число 80h. Примечание 4: из "окна DOS" системы Windows таймер BIOS недоступен.
8.01-74 |
INT 15\AH=84h – считывание состояния джойстика. |
||
При вызове: |
|
|
|
|
AH |
= 84h |
|
|
DX |
= 0000h |
– считать состояния переключателей |
|
|
= 0001h |
– считать сигналы положения манипуляторов |
При неудачном завершении флаг CF установлен, в AH – код завершения (A.06-1). Если после исполнения подфункции DX=0000h флаг CF сброшен, то состояния
|
переключателей возвращаются в битах 4 – 7 регистра AL. |
Если после исполнения подфункции DX=0001h флаг CF сброшен, то |
|
AX |
– значение x-координаты 1-го манипулятора |
BX |
– значение y-координаты 1-го манипулятора |
CX |
– значение x-координаты 2-го манипулятора |
DX |
– значение y-координаты 2-го манипулятора |
Примечание 1: при типичном сопротивлении датчиков 250 кОм возвращаемые значения координат обычно находятся в пределах 0000h – 01A0h.
Примечание 2: если игровой порт в компьютере отсутствует, то подфункция DX=0001h возвращает нулевые значения координат, а подфункция DX=0000h возвращает AL=00h, что соответствует разомкнутому состоянию переключателей.
– 371 –
Глава 8: Вызовы обработчиков прерываний
8.01-75 INT 15\AH=85h – вызов по нажатию клавиши SysRq
Когда пользователь нажимает клавишу SysRq, обработчик прерывания INT 09 вызывает INT 15\AH=85h. Для INT 15\AH=85h обработчик прерывания должен быть поставлен драйвером видеокарты с тем, чтобы обеспечить распечатку выводимого на экран изображения в том формате, в котором работает видеокарта. Но если этот обработчик не поставлен, то сработает "заглушка", которая заранее ставится системой BIOS: она просто возвратит управление вызывающей программе так, как если бы вызов был удовлетворен.
При вызове: |
|
|
AH |
= 85h |
|
AL |
= 00h |
– вызов при нажатии на клавишу SysRq |
|
= 01h |
– вызов при отпускании клавиши SysRq |
флаг CF при вызове должен быть сброшен Если вызов удовлетворен, то флаг CF сброшен и AH = 00h.
При неудаче флаг CF установлен, в AH – код завершения (A.06-1).
8.01-76 INT 15\AH=87h – копирование с доступом в расширенную память
Обработчик прерывания INT 15\AH=87h осуществляет копирование блоков данных размером до 64 кбайт в пределах линейно адресуемой памяти до 16 Мбайт.
Копирование осуществляется в защищенном режиме при блокированных аппаратных прерываниях, так что готовить таблицу прерываний перед вызовом INT 15\AH=87h не нужно. Тем не менее для копирования посредством INT 15\AH=87h нужно заранее подготовить таблицу GDT из шести дескрипторов согласно показанному здесь шаблону:
Резервируемый дескриптор: |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
Резервируемый дескриптор: |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
Дескриптор сегмента-источника: |
ss ss aa aa aa |
93 |
00 00 |
|||||
Дескриптор сегмента назначения: |
ss ss dd dd dd |
93 |
00 00 |
|||||
Резервируемый дескриптор: |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
Резервируемый дескриптор: |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
В показанном шаблоне знаком "a" отмечено поле линейного адреса сегмента источника, знаком "d" – поле линейного адреса сегмента назначения, а знаком "s" – поля размера сегментов. Поскольку размер копируемого участка памяти задается в регистре CX количеством копируемых двухбайтовых слов, постольку размеры сегментов, выражаемые в байтах, должны быть не меньше, чем (2•CX)–1. И в полях размеров, и в полях адресов первыми следуют младшие байты, а последними
– старшие. Байты атрибутов и в дескрипторе-источнике, и в дескрипторе
– 372 –
Глава 8: Вызовы обработчиков прерываний
назначения должны быть равны 93h. Более детальные пояснения структуры дескрипторов даны в приложении A.12-2.
Резервируемые дескрипторы, заполненные нулями, обработчик прерывания INT 15\AH=87h задействует потом для обслуживания операций защищенного режима. По завершении копирования процессор будет переведен обратно в реальный режим, и будет восстановлено состояние, обеспечивающее продолжение исполнения вызывающей программы.
При вызове: |
|
AH |
= 87h |
CX |
– число копируемых слов, не более 7FFFh |
ES:SI – указатель на подготовленную таблицу GDT.
При неудачном завершении флаг CF установлен, в AH – код завершения (A.06-1). Если флаг CF сброшен, то миссия завершена успешно.
Примечание 1: из-за исполнения копирования при блокированных аппаратных прерываниях пользование INT 15\AH=87h может привести к пропуску вызовов от внешних устройств. Копирование с доступом в расширенную память посредством драйвера HIMEM.SYS (A.12-4) этим недостатком не обладает.
Примечание 2: драйвер HIMEM.SYS перехватывает прерывание INT 15\AH=87h и не дает прикладным программам доступ к обработчику, который установлен системой BIOS. Тем не менее драйвер HIMEM.SYS позволит пользоваться прерыванием INT 15\AH=87h для доступа к ограниченному участку расширенной памяти, если этот участок зарезервирован заранее указанием параметра /INT15 (5.04-01).
8.01-77 |
INT 15\AH=88h – размер расширенной памяти до 16 Мбайт |
|
При вызове: |
|
|
|
AH |
= 88h |
При неудачном завершении флаг CF установлен, в AH – код завершения (A.06-1). |
||
Если флаг CF сброшен, то миссия завершена успешно, и тогда |
||
|
AX |
– размер памяти в килобайтах, имеющейся за пределом 100000h, |
|
|
то есть сверх 1 Мегабайта. |
Примечание 1: если адресное пространство сверх 1 Мегабайта не является непрерывным, то будет показан размер до первого промежутка.
Примечание 2: обработчик прерывания INT 15\AH=88h считывает сведения о размере памяти из байтов 30h и 31h CMOS-памяти системы BIOS.
Примечание 3: вызовы обработчика прерывания INT 15\AH=88h, устанавливаемого системой BIOS, перехватываются драйверами HIMEM.SYS и EMM386.EXE.
– 373 –
Глава 8: Вызовы обработчиков прерываний
Примечание 4: для выяснения размера памяти сверх 16 Мбайт следует использовать INT 15\AX=E801h\E881h (8.01-79) или INT 15\AX=E820h (8.01-80).
8.01-78 INT 15\AH=89h – переключение процессора в защищенный режим.
Обработчик прерывания INT 15\AH=89h осуществляет процесс перехода в защищенный режим, включая операции занесения селекторов сегментов в
сегментные регистры и перепрограммирования контроллеров прерываний для работы с таблицей прерываний защищенного режима.
Чтобы исполнение вызывающей программы продолжилось после переключения процессора в защищенный режим, нужно заранее подготовить глобальную таблицу дескрипторов (GDT) и таблицу прерываний (IDT) для защищенного режима. Таблица IDT заполняется 8-байтовыми дескрипторами адресов перехода ("вентилями") для вызова обработчиков прерываний защищенного режима. Размер и линейный адрес расположения таблицы IDT записываются в дескриптор сегмента IDT, входящий в состав таблицы GDT.
Таблица GDT, подготавливаемая для обработчика прерывания INT 15\AH=89h, включает восемь 8-байтовых сегментных дескрипторов, причем их расположение должно соответствовать следующему шаблону:
Резервируемый дескриптор: Дескриптор сегмента GDT: Дескриптор сегмента IDT:
Дескриптор сегмента DS: Дескриптор сегмента ES: Дескриптор сегмента SS: Дескриптор сегмента CS:
Резервируемый дескриптор:
00 00 00 00 00 00 00 00
3F 00 aa aa aa 00 00 00 FF 03 aa aa aa F2 00 00 ss ss aa aa aa 92 0s aa ss ss aa aa aa 92 0s aa ss ss aa aa aa 92 0s aa ss ss aa aa aa 9A 0s 00 00 00 00 00 00 00 00 00
В показанном шаблоне знаком "a" отмечены поля линейного адреса каждого сегмента, а знаком "s" – поля размера сегментов. Резервируемые дескрипторы заполняют нулями. В качестве примера в шаблоне показаны конкретные значения байта атрибутов, а также размера для сегментов GDT и IDT. Детальная расшифровка структуры дескрипторов приведена в приложении A.12-2.
При вызове: |
|
AH |
= 89h |
BL |
– номер прерывания для IRQ 0 (примечание 2) |
BH |
– номер прерывания для IRQ 8 (примечание 2) |
ES:SI – указатель на заполненную таблицу GDT
При неудаче флаг CF установлен, в AH – код завершения (A.06-1).
– 374 –
Глава 8: Вызовы обработчиков прерываний
При успешном переходе в защищенный режим флаг CF сброшен, AH = 00h, в
сегментные регистры процессора занесены селекторы сегментов из таблицы GDT. Значение в регистре BP может быть изменено.
Примечание 1: чтобы после перехода в защищенный режим исполнение программы продолжилось со следующей команды, дескриптор сегмента CS в составе таблицы GDT должен указывать на тот же сегмент, который определен сегментным адресом в регистре CS при реальном режиме.
Примечание 2: назначаемые номера прерываний в регистрах BL и BH должны быть кратны 8 (младшие 3 бита обнулены). Запросам по линиям IRQ 1 – IRQ 7 будут назначены следующие 7 номеров прерываний вслед за номером в регистре BL, а запросам по линиям IRQ 9 – IRQ F – следующие 7 номеров вслед за номером в регистре BH. При назначении номеров нужно учитывать, что номера до 1Fh могут быть задействованы исключениями, вызываемыми процессором.
Примечание 3: вследствие перепрограммирования контроллеров прерываний и
изменения формата адресации после перехода в защищенный режим становится невозможен прямой вызов всех обработчиков прерываний, предназначенных для использования в реальном режиме.
8.01-79 |
INT 15\AX=E801h,E881h – размер расширенной памяти. |
|
При вызове: |
|
|
|
AX |
= E801h или E881h |
При неудачном завершении флаг CF установлен. Если флаг CF сброшен, то |
||
|
AX |
– размер расширенной памяти в области между 1 Мбайт и 16 |
|
|
Мбайт (в килобайтах) |
|
BX |
– размер расширенной памяти в области сверх 16 Мбайт (в |
|
|
64-килобайтных блоках) |
|
CX |
– размер конфигурированной памяти в области между 1 Мбайт и |
|
|
16 Мбайт (в килобайтах) |
|
DX |
– размер конфигурированной памяти в области сверх 16 Мбайт |
|
|
(в 64-килобайтных блоках) |
Примечание 1: если при удачном завершении AX = BX = 0000h, то полный размер расширенной памяти следует считывать из регистров CX и DX.
Примечание 2: вызов INT 15\AX=E881h, в отличие от INT 15\AX=E801h,
правильно отображает величины свыше 4 Гбайт, выводя старшие значащие цифры в разрядах 16 – 31 32-разрядных регистров EBX и EDX. Способ доступа к ним из программ реального режима показан в разделе 7.02-06.
– 375 –
Глава 8: Вызовы обработчиков прерываний
Примечание 3: функции INT 15\AX=E801h\E881h не поддерживаются устаревшими версиями BIOS, разработанными до 1995 года.
8.01-80 INT 15\AX=E820h – карта распределения оперативной памяти.
Карта распределения представляет собой последовательность 20-байтных дескрипторов, каждый из которых описывает одну из областей памяти, выделенную с определенной целью системой BIOS. Каждый дескриптор начинается с 8-байтового стартового адреса, далее следует 8-байтовая длина соответствующей области памяти, и кончается дескриптор 4-байтовым кодом назначения области памяти (примечание 1). За один вызов считывается один дескриптор, так что INT 15\AX=E820h приходится вызывать несколько раз. Первый вызов требует установления в регистре EBX нулевого (00000000h) адреса считывания карты памяти, а возвращает ненулевое значение, необходимое для следующего вызова.
Окончание цикла вызовов отмечается либо возвратом нулевого значения в регистре EBX, либо установлением флага CF.
При вызове:
AX = E820h
EBX – адрес считывания карты памяти
ECX – размер буфера для дескриптора, не менее 20 байт
EDX = 534D4150h – сигнатура "SMAP"
ES:DI – указатель на буфер для записи дескриптора
При неудачном завершении значение в EAX отлично от сигнатуры 534D4150h, флаг CF установлен, в AH – код завершения (A.06-1).
При успешном завершении EAX = 534D4150h "SMAP", и тогда: EBX – следующий адрес считывания карты памяти ECX – фактическая длина записанных в буфер данных ES:DI – указатель на заполненный буфер
Примечание 1: определены следующие коды назначения областей памяти: 01h – память, предоставляемая операционной системе; 02h – память, резервированная BIOS (системная ROM);
03h – области таблиц ACPI (после считывания свободные); 04h – области энергонезависимой системной памяти ACPI.
Области, характеризуемые другими кодами, следует считать резервированными системой BIOS. Интервалы адресного пространства, не включенные в карту распределения памяти, аппаратно не задействованы примененным комплектом микросхем.
Примечание 2: некоторые системы BIOS требуют, чтобы при вызове старшие разряды 16 – 31 регистра EAX были обнулены (EAX = 0000E820h).
– 376 –
Глава 8: Вызовы обработчиков прерываний
Способ доступа к EAX и другим 32-разрядным регистрам из программ реального режима показан в разделе 7.02-06.
Примечание 3: некоторые системы BIOS игнорируют значение в регистре ECX и всегда возвращают 20 байт данных.
Примечание 4: если вызов INT 15\AX=E820h компьютером не поддерживается, то рекомендуется попытаться вызвать INT 15\AX=E801h (8.01-79), а в случае повторной неудачи – INT 15\AH=88h (8.01-77).
8.01-81 INT 16\AH=03h – темп и задержка повторения для клавиатуры
При вызове: |
|
|
AX |
= 0300h |
– установить значения, принимаемые по умолчанию |
|
= 0305h |
– установить темп из BL, задержку из BH |
|
= 0306h |
– вывести действующие значения темпа и задержки |
BL |
– (для AX=0305h): код темпа повторения (примечание 1) |
|
BH |
– (для AX=0305h): код задержки (примечание 2) |
|
При возврате: |
|
|
BL |
– код установленного темпа повторения (примечание 1) |
|
BH |
– код установленной задержки (примечание 2) |
|
AH |
– содержимое может быть не сохранено |
|
Примечание 1: допустимые значения кода темпа от 00h до 1Fh соответствуют темпам повторения от 30 раз в секунду до 2 раз в секунду.
Примечание 2: допустимые значения кода задержки от 00h до 03h соответствуют значениям задержки от 0.25 секунды до 1 секунды.
8.01-82 INT 16\AH=05h – введение кода нажатия клавиши в буфер клавиатуры
При вызове: |
|
AH |
= 05h |
CH |
– скэн-код нажатия клавиши из таблицы A.02-1 |
CL |
– код ASCII соответствующего знака из таблицы A.02-1 |
При возврате: |
|
AL |
– код завершения из таблицы A.06-1 |
AH |
– содержимое может быть не сохранено |
Примечание 1: старые версии BIOS не поддерживают эту функцию.
Примечание 2: введение некоторых кодов (например, кода клавиши Enter) в буфер
клавиатуры может вызвать исполнение соответствующих функций Примечание 3: с помощью INT 16\AH=05h нельзя вводить коды "функциональных"
клавишей (Shift, Ctrl, Alt и т.п.).
– 377 –
Глава 8: Вызовы обработчиков прерываний
8.01-83 INT 16\AH=10h – получение кода клавиши из буфера клавиатуры
Обработчик прерывания INT 16\AH=10h обслуживает наиболее распространенные модели 101\108-клавишных клавиатур, а также совместимые клавиши на других клавиатурах. Он изымает коды клавиши из буфера клавиатуры и записывает их в регистры AH и AL, причем ожидает нажатия любой клавиши, если буфер клавиатуры в момент вызова пуст.
При вызове: |
|
AH |
= 10h |
При возврате: |
|
AH |
– скэн-код клавиши из таблицы A.02-1 |
AL |
– код ASCII соответствующего знака из таблицы A.02-1 |
Примечание 1: обработчик прерывания INT 16\AH=20h делает то же самое плюс реагирует на дополнительные клавиши, которые имеются только на редко используемых 122-клавишных клавиатурах.
Примечание 2: в очень старых компьютерах с 84\86-клавишными клавиатурами
для исполнения той же функции необходимо вызывать
INT 16\AH=00h. В более "свежих" компьютерах INT 16\AH=00h
действует так же и не реагирует на те клавиши, которых в старых клавиатурах нет.
8.01-84 INT 16\AH=11h – определение кода клавиши в буфере клавиатуры
Обработчик вызовов INT 16\AH=11h обслуживает наиболее распространенные модели 101\108-клавишных клавиатур, а также совместимые клавиши на других клавиатурах. Он не удаляет коды клавишей из буфера клавиатуры, а копирует их в регистры AH и AL, и не ждет нажатия клавиши, когда буфер пуст.
При вызове: |
|
AH |
= 11h |
При возврате: |
|
если флаг ZF установлен, то буфер клавиатуры пуст. |
|
если флаг ZF сброшен, то |
|
AH |
– скэн-код из таблицы A.02-1 |
AL |
– код ASCII из таблицы A.02-1 |
Примечание 1: обработчик прерывания INT 16\AH=21h делает то же самое плюс реагирует на дополнительные клавиши, которые имеются только на редко используемых 122-клавишных клавиатурах.
Примечание 2: в старых компьютерах с 84\86-клавишными клавиатурами для исполнения той же функции необходимо вызывать INT 16\AH=01h.
– 378 –
