
Dos7book
.pdf
Глава 8: Вызовы обработчиков прерываний
установлены биты 01h и 03h в управляющем регистре CR0 (A.11-4). Чтобы запретить вызов INT 07 префиксом WAIT, нужно сбросить бит 01h.
Для реализации любой миссии прерывания INT 07 необходимо загрузить соответствующий обработчик. Обычно устанавливаемый по умолчанию обработчик прерывания INT 07 просто возвращает управление следующей команде в вызывающей программе.
8.01-09 INT 08 – INT 0F: обслуживание запросов IRQ 0 – IRQ 7
В реальном режиме работы компьютера эта группа обработчиков прерываний обслуживает запросы, поступающие по линиям IRQ 0 – IRQ 7 от разных устройств к первому контроллеру прерываний. Некоторые линии запроса предназначены для определенных устройств, указанных в четвертой колонке таблицы, но остальные готовы принять запрос от любого устройства, если оно сконфигурировано для посылки запроса именно по этой линии и поддерживается драйвером, загружающим обработчик соответствующего прерывания.
Помимо того, современные процессоры фирмы Intel вызывают некоторые прерывания из этой же группы для обслуживания особых ситуаций (исключений), не связанных с запросами внешних устройств. Те особые ситуации, которые могут приводить к вызову прерываний INT 08 – INT 0F при работе процессоров в реальном режиме, перечислены в примечаниях к приведенной ниже таблице. Контроллер прерываний не регистрирует вызовы, генерируемые процессором. Если командой OUT (7.03-66) послать байт 0Ah в порт 20h контроллера прерываний, то из этого же порта командой IN (7.03-26) можно будет считать байт, в котором
поступление запроса по каждой линии отмечено установлением в единицу соответствующего бита, показанного в колонке 3 приведенной ниже таблицы. По этому признаку внешние вызовы можно отличить от вызовов "по инициативе" процессора.
Генерируемые процессором вызовы передают через стек в качестве адреса возврата адрес не следующей команды, а той, из-за которой исключение возникло.
Это дает возможность повторить операцию после устранения причины исключения, но, с другой стороны, такие вызовы нельзя отсылать команде IRET, потому что компьютер зависнет в бесконечном цикле возвратов и вызовов. Если обработчик прерывания не может устранить причину исключения, то повторение необходимо предотвратить либо прекращением исполнения программы, либо корректировкой находящегося в стеке адреса возврата. Кроме того, на время
обслуживания каждого генерируемого процессором вызова надо блокировать поступление конкурирующего вызова через контроллер прерываний путем посылки командой OUT (7.03-66) в порт 21h байта маски с установленным в единицу битом блокируемой линии, показанным в колонке 3 приведенной ниже таблицы.
– 339 –

Глава 8: Вызовы обработчиков прерываний
Вызов |
Линия |
Маска |
Источник запросов |
Примечания |
INT 08 |
IRQ 0 |
бит 0 |
Системный таймер |
*1 |
INT 09 |
IRQ 1 |
бит 1 |
Контроллер клавиатуры |
*2 |
INT 0A |
IRQ 2 |
бит 2 |
2-й контроллер прерываний |
*3 |
INT 0B |
IRQ 3 |
бит 3 |
|
*4 |
INT 0C |
IRQ 4 |
бит 4 |
Порт COM-1 |
*5 |
INT 0D |
IRQ 5 |
бит 5 |
|
*6 |
INT 0E |
IRQ 6 |
бит 6 |
Контроллер флоппи-диска |
*7 |
INT 0F |
IRQ 7 |
бит 7 |
Параллельный порт LPT-1 |
|
Примечание 1: вызовы обработчика прерывания INT 08 следуют регулярно 18.2 раза в секунду для обеспечения счета времени. Для обслуживания пользовательских программ обработчик прерывания INT 08, в свою очередь, вызывает INT 1C (8.01-96). Процессор может также вызывать INT 08 в ситуации "двойного отказа", которая обычно должна выводить компьютер в перезагрузку.
Примечание 2: обработчик прерывания INT 09 реагирует на каждую клавишу, обслуживает буфер клавиатуры и готовит коды, приведенные в приложении A.02-1, которые доступны программам через прерывание INT 16. Однако очевидные действия следуют только в ответ на некоторые клавишные комбинации, перечисленные в разделе 1.01.
Примечание 3: второй контроллер прерываний обслуживает линии запроса IRQ 8 – IRQ 15 и вызывает прерывания INT 70 – INT 77 (8.03-75).
Примечание 4: предпочтительным источником запросов по линии IRQ 3 является последовательный порт COM-2, если он имеется в компьютере.
Примечание 5: процессоры могут вызывать прерывание INT 0C при выходе стека за границу выделенного ему сегмента.
Примечание 6: процессоры могут вызывать прерывание INT 0D при попытках адресации за пределы границ сегментов кода или данных.
Примечание 7: процессоры могут вызывать прерывание INT 0E при попытках обращения к "закрытым" страницам памяти (адреса которых в буфере TLB отсутствуют).
Примечание 8: путем перепрограммирования контроллера прерываний отображение внешних вызовов IRQ 0 – IRQ 7 на INT 08 – INT 0F может быть заменено иным, чтобы они не поступали к тем же обработчикам, которые обслуживают генерируемые процессором исключения. Такое перепрограммирование обычно выполняют при
подготовке к переключению процессора в защищенный режим согласованно с формированием таблицы прерываний для защищенного режима.
– 340 –

Глава 8: Вызовы обработчиков прерываний
8.01-10 |
INT 10\AH=00h – переключение видеорежима |
|
При вызове: |
|
|
|
AH |
= 00h |
|
AL |
– код задаваемого видеорежима из приложения A.10-1 |
При возврате: |
|
содержимое AL может быть изменено
Примечание 1: эта операция переводит любые видеокарты, в том числе новые, в видеорежимы, совместимые со старыми видеокартами VGA. Для перевода в видеорежимы SVGA нужно вызывать INT 10\AX=4F02h.
Примечание 2: код установленного видеорежима записывается в область данных BIOS, показанную в приложении A.10-6, по адресу 0040:0049h.
Примечание 3: координированное переключение видеорежима вместе со сменой параметров управления манипулятором типа "мышь" обеспечивается вызовом драйвера "мыши" через прерывание
INT 33\AX=0028h (8.03-52).
Примечание 4: переключение видеорежимов сопровождается гашением экрана дисплея на 1 – 2 секунды, дискомфортным для зрительного восприятия. Потому лишних переключений желательно избегать.
По той же причине для очистки экрана лучше пользоваться вызовом INT 10\AH=06h (8.01-15).
8.01-11 |
INT 10\AH=01h – размер курсора в текстовых видеорежимах |
||
При вызове: |
|
|
|
|
AH |
= 01h |
|
|
CH |
– биты 0 |
– 4: - номер верхней граничной строки курсора |
|
CL |
– биты 0 |
– 4: – номер нижней граничной строки курсора |
Примечание 1: строки считают в пределах знакоместа сверху вниз. Установленные
номера верхней и нижней строк курсора записаны в область данных BIOS, показанную в приложении A.10-6, по адресу 0040:0060h. Размер знакоместа записан там же по адресу 0040:0085h, но его также можно получить с помощью INT 10\AX=1130h.
Примечание 2: если установить в единицу бит 5 в регистре CH, то можно сделать курсор невидимым.
8.01-12 INT 10\AH=02h – изменение положения курсора
При вызове: |
|
AH |
= 02h |
BH |
– номер экранной страницы (примечания 1 и 2 к 8.01-14) |
DH |
– номер ряда (счет от верхнего ряда с номера 00h) |
– 341 –

Глава 8: Вызовы обработчиков прерываний
DL – номер колонки (счет от левой колонки с номера 00h)
Примечание 1: на каждой экранной странице положение курсора задается отдельно.
Примечание 2: до 8 пар координат курсора для разных экранных страниц записываются в область данных BIOS, показанную в приложении
A.10-6, начиная с адреса 0040:0050h.
8.01-13 |
INT 10\AH=03h – определение размера и положения курсора |
|
При вызове: |
|
|
|
AH |
= 03h |
|
BH |
– номер экранной страницы (примечания 1 и 2 к 8.01-14) |
При возврате: |
|
|
|
CH |
– номер верхней граничной строки курсора |
|
CL |
– номер нижней граничной строки курсора |
|
DH |
– номер ряда (счет от верхнего ряда с номера 00h) |
|
DL |
– номер колонки (счет от левой колонки с номера 00h) |
|
Содержимое регистра AX может быть не сохранено. |
|
8.01-14 |
INT 10\AH=05h – выбор активной экранной страницы |
|
При вызове: |
|
|
|
AH |
= 05h |
|
AL |
– номер запрашиваемой экранной страницы |
Примечание 1: если запрашиваемый номер больше номера последней экранной страницы в данном видеорежиме, то выбор не будет подтвержден функцией INT 10\AH=0Fh. Количество экранных страниц для видеорежимов VGA можно узнать из таблицы, возвращаемой функцией INT 10\AX=1B00h (приложение A.10-2, смещение 29h), а для видеорежимов SVGA – из таблицы, возвращаемой функцией
INT 10\AX=4F01h (приложение A.10-7, смещение 1Dh).
Примечание 2: экранные страницы нумеруются от 00h, номер последней страницы на единицу меньше числа имеющихся экранных страниц. Наиболее часто используемый текстовый видеорежим 03h предоставляет 4 экранных страницы от 00h до 03h.
Примечание 3: переключение экранных страниц согласованно с перенаправлением курсора манипулятора "мышь" на выбранную страницу выполняет обработчик прерывания INT 33\AX=001Dh (8.03-47),
устанавливаемый драйвером "мыши".
– 342 –

Глава 8: Вызовы обработчиков прерываний
8.01-15 INT 10\AH=06h-07h – прокрутка экранного окна
Прокруткой принято называть перемещение текста вверх или вниз в пределах всего экрана или только "окна", то есть прямоугольной области, составляющей часть воспроизводимого на экране изображения. Строки, выдвигаемые из-под кромки "окна", не содержат текста и заполняются пробелами заданного цвета. Эта же процедура при AL=00h позволяет очистить от текста и заполнить заданным цветом любой прямоугольный участок изображения, в том числе и весь экран.
При вызове: |
|
|
|
AH |
= 06h |
– направление прокрутки вверх, |
|
|
= 07h |
– направление прокрутки вниз |
|
AL |
– интервал прокрутки в строках (или 00h, чтобы очистить окно) |
||
BH |
– биты 4 – 7: цвет заполнения (столбцы 1 и 4 таблицы A.10-5) |
||
CH |
– ряд, CL |
– колонка левого верхнего угла окна |
|
DH |
– ряд, DL |
– колонка нижнего правого угла окна |
Примечание 1: эта процедура действует только в текстовых видеорежимах. Примечание 2: эта процедура затрагивает только ту экранную страницу, которая
является активной в данный момент.
Примечание 3: некоторые версии BIOS при исполнении данной процедуры могут изменять содержимое регистров BP и DS.
8.01-16 INT 10\AH=08h – чтение знака из позиции курсора
При вызове: |
|
AH |
= 08h |
BH |
– номер экранной страницы (примечания 1 и 2 к 8.01-14) |
При возврате: |
|
AH |
– цвет, как в приложении A.10-5 (только в текстовых режимах) |
AL |
– считанный знак в коде ASCII |
Примечание 1: в графических видеорежимах правильно распознаются только знаки белого цвета. Если знак не распознан, то AL=00h.
8.01-17 INT 10\AH=09h-0Ah – запись знака в позицию курсора
При вызове: |
|
AH |
= 09h |
AL |
– код ASCII того знака, который надлежит записать |
BH |
– номер экранной страницы (примечания 1 и 2 к 8.01-14) |
BL |
– байт цвета, показанный в приложении A.10-5. |
CX |
– число, сколько раз подряд надо записать указанный знак. |
– 343 –

Глава 8: Вызовы обработчиков прерываний
Примечание 1: индицируются все знаки, включая 0Dh (CR), 0Ah (LF), 08h (BS) и другие служебные символы, упоминаемые в разделе A.02-08.
Примечание 2: в графических видеорежимах с количеством цветов менее 256, при установленном бите 7 в регистре BL запись знака осуществляется посредством исполнения операции "исключающее ИЛИ" (XOR).
Примечание 3: в графических видеорежимах число в регистре CX не должно быть больше, чем число знаков, которые можно разместить справа от позиции курсора в том же ряду.
Примечание 4: обработчик прерывания INT 10\AH=0Ah записывает знаки так же, но игнорирует байт цвета в BL. Введенные знаки будут иметь цвет такой же, как у остального текста.
Примечание 5: позиция курсора не смещается независимо от количества повторов записи знака.
Примечание 6: если установлен графический 256-цветный видеорежим (например, 13h), то в BH следует указывать байт цвета фона, а в BL – байт цвета знака.
8.01-18 INT 10\AH=0Bh – цвет фона или рамки
Для графических видеорежимов эта процедура задает цвет фона, а для текстовых видеорежимов – цвет рамки экрана.
При вызове: |
|
AH |
= 0Bh |
BX |
– биты 2, 1, 0 = красный, зеленый, синий соответственно |
Примечание 1: рамка экрана на многих современных LCD-дисплеях отображается неправильно (в виде полоски) или вообще не отображается.
8.01-19 |
INT 10\AH=0Ch – рисование точки |
|
При вызове: |
|
|
|
AH |
= 0Ch |
|
AL |
– байт цвета, показанный в приложении A.10-5. |
|
BH |
– номер экранной страницы (примечания 1 и 2 к 8.01-14) |
|
CX |
– номер столбца |
|
DX |
– номер строки |
Примечание 1: рисование точки выполняется только в графических видеорежимах. Примечание 2: в графических видеорежимах с количеством цветов менее 256, при установленном бите 7 в регистре AL запись точки осуществляется
посредством исполнения операции "исключающее ИЛИ" (XOR).
– 344 –

Глава 8: Вызовы обработчиков прерываний
Примечание 3: если установленный видеорежим поддерживает только одну экранную страницу, то содержимое регистра BH игнорируется.
Примечание 4: вызов INT 10\AH=0Ch удобен для рисования линий, но для
заполнения площадей изображения предпочтительна более быстрая прямая запись в видеопамять (8.01-39).
8.01-20 |
INT 10\AH=0Dh – считывание цвета точки |
|
|
При вызове: |
|
|
|
|
AH |
= 0Dh |
|
|
BH |
– номер экранной страницы (примечания 1 и 2 к 8.01-14) |
|
|
CX |
– номер столбца |
|
|
DX |
– номер строки |
|
При возврате: |
|
|
|
|
AL |
– байт цвета |
|
Примечание 1: считывание цвета точки выполняется только в |
графических |
||
|
|
видеорежимах. |
|
Примечание 2: если установленный видеорежим поддерживает |
только одну |
||
|
|
экранную страницу, то содержимое регистра BH игнорируется. |
8.01-21 INT 10\AH=0Eh – телетайпная запись знака
Обработчик прерывания INT 10\AH=0Eh заносит знак в текущую позицию курсора и затем перемещает курсор в следующее знакоместо. Если в заполняемом ряду знаков нет свободных знакомест, то курсор переводится в следующий ряд.
При вызове: |
|
AH |
= 0Eh |
AL |
– код ASCII знака, который надлежит записать |
BH |
– номер экранной страницы (примечания 1 и 2 к 8.01-14) |
BL |
– цвет знака (только в графических видеорежимах) |
Примечание 1: служебные коды, перечисленные в разделе A.02-08, включая 07h (BEL) и 08h (BS), не индицируются, а исполняются как команды.
Примечание 2: в текстовых режимах цвет знака остается тем же, каким он был установлен ранее для того же знакоместа.
8.01-22 |
INT 10\AH=0Fh – выяснение видеорежима |
|
При вызове: |
|
|
|
AH |
= 0Fh |
При возврате: |
|
|
|
AH |
– число знакомест в ряду или в строке |
|
|
– 345 – |

Глава 8: Вызовы обработчиков прерываний
AL |
– код видеорежима, объясняемый в приложении A.10-1 |
BH |
– номер экранной страницы (примечания 1 и 2 к 8.01-14) |
Примечание 1: если код видеорежима был задан с установленным битом 7 (не очищать экран), то и возвращен он будет с установленным битом 7.
Примечание 2: эта функция не определяет коды видеорежимов SVGA, и для всех текстовых видеорежимов SVGA возвращает либо AL=07h (монохромный видеорежим), либо AL=03h (цветной видеорежим).
8.01-23 INT 10\AX=1003h – переключение роли бита 7
В текстовых видеорежимах бит 7 в байте цвета (A.10-5) может быть использован либо для задания мерцания, либо в качестве бита яркости фона: это зависит от состояния управляющего бита, которое можно изменить вызовом
INT 10\AX=1003h.
При вызове: |
|
|
AX |
= 1003h |
|
BX |
– вид операции: |
|
|
= 0000h |
– разрешить управление яркостью фона |
|
= 0001h |
– разрешить управление мерцанием знаков. |
Примечание 1: состояние управляющего бита отображается битом 5 в байте по адресу 0040:0065h в области данных BIOS (A.10-6), а также битом 5 в байте со смещением 2Dh в блоке данных (A.10-2), возвращаемом обработчиком прерывания INT 10\AX=1B00h.
8.01-24 INT 10\AX=1010h – установка яркости цветов
Обработчик прерывания INT 10\AX=1010h записывает в регистр цифро-аналогового преобразователя уровни от 0 до 3Fh, определяющие яркости каждого из трех основных цветов в той комбинации цветов, за которую отвечает данный регистр.
При вызове: |
|
AX |
= 1010h |
BX |
– номер регистра цифро-аналогового преобразователя |
CH |
– новое значение уровня зеленого цвета |
CL |
– новое значение уровня синего цвета |
DH |
– новое значение уровня красного цвета |
Примечание 1: для записи уровней доступны все регистры цифро-аналогового преобразователя видеокарты, но не все из них задействованы: это
– 346 –

Глава 8: Вызовы обработчиков прерываний
зависит от установленного видеорежима. В частности, цвет фона в 16-цветных видеорежимах определяется регистрами 0 – 7.
8.01-25 INT 10\AX=1015h – считывание уровней яркости
Обработчик прерывания INT 10\AX=1015h считывает из регистра цифро-аналогового преобразователя видеокарты записанные там уровни, определяющие яркости каждого из трех основных цветов в той комбинации цветов, за которую отвечает запрошенный регистр.
При вызове: |
|
|
|
AX |
= 1015h |
|
BX |
– номер регистра цифро-аналогового преобразователя |
При возврате: |
|
|
|
CH |
– значение уровня зеленого цвета |
|
CL |
– значение уровня синего цвета |
|
DH |
– значение уровня красного цвета |
|
содержимое регистра AX может быть изменено. |
|
8.01-26 |
INT 10\AX=1018h – маска цвета |
|
При вызове: |
|
|
|
AX |
= 1018h |
|
BL |
– новая маска, которую надлежит установить |
Примечание 1: биты 0 – 2 маски включают синий, зеленый и красный цвета фона, биты 3 – 5 делают то же самое для знаков переднего плана. Состояние битов 6 и 7 безразлично. Нормальная маска должна быть байтом FFh: все цвета включены.
Примечание 2: команда CLS (3.05) не возвращает маску в нормальное состояние.
8.01-27 |
INT 10\AX=1100h – загрузка шрифта в текстовом видеорежиме |
|
При вызове: |
|
|
|
AX |
= 1100h |
|
BH |
– число байтов, представляющих в шрифте один знак. |
|
BL |
– идентификатор загружаемого блока (примечание 1 к 8.01-28) |
|
CX |
– число загружаемых или замещаемых знаков |
|
DX |
– смещение в блоке, начиная с которого надо загружать знаки |
ES:BP – указатель (адрес) загружаемой таблицы знаков
Примечание 1: предполагается, что полная таблица шрифта содержит FFh знаков.
– 347 –

Глава 8: Вызовы обработчиков прерываний
Примечание 2: каждый байт в коде знака представляет одну строку на экране, так что число байтов, представляющих каждый знак (число в регистре BH), равно числу строк в знакоместе.
Примечание 3: при загрузке шрифта устанавливается текстовый видеорежим, соответствующий загружаемому шрифту, но видеобуфер не очищается.
Примечание 4: если предстоит загружать несколько блоков шрифта, для них надо заранее, при загрузке DOS, выделить участки памяти с помощью драйвера DISPLAY.SYS (5.02-02), иначе можно будет пользоваться только выделяемым по умолчанию блоком с идентификатором 00h.
Примечание 5: обработчик прерывания INT 10\AX=1110h также загружает шрифт и требует те же исходные данные в регистрах, но переопределяет состояние видеоконтроллера. Вызывать INT 10\AX=1110h следует сразу после установки видеорежима и экранной страницы 0.
8.01-28 INT 10\AX=1103h – переключение шрифтов
Обработчик прерывания INT 10\AX=1103h переключает знакогенератор на другой шрифт, который должен быть заранее загружен в один из блоков памяти знакогенератора. Знакогенераторы EGA-совместимых и VGA-совместимых видеокарт позволяют активизировать два блока, давая тем самым возможность показывать знаки двух шрифтов одновременно. Выборка знака из того или другого шрифта будет зависеть от бита 3 в байте цвета, указываемом, в частности, в регистре BL при выводе знаков с помощью INT 10\AH=09h или INT 10\AH=0Eh.
При вызове: |
|
AX |
= 1103h |
BL |
– идентификатор блока шрифта в памяти знакогенератора |
Примечание 1: идентификатор блока шрифта представляет собой байт, в котором выделены 2 поля: одно составляют биты 4,1,0, а другое – биты 5,3,2. В каждое поле записывается номер от 0 до 7 блока памяти, содержащего загруженный шрифт. Если номера в обоих полях совпадают, то будет адресован один шрифт, и тогда бит 3 в байте цвета (A.10-5) будет определять яркость. В частности, в EGA-совместимых видеокартах, обслуживающих только 4 шрифта, их блоки адресуются идентификаторами 00h, 05h, 0Ah, 0Fh.
Примечание 2: возможность активизации двух шрифтов одновременно нужно проверять по значению 9-го байта в таблице статической функциональности (A.10-3), адрес которой можно получить посредством INT 10\AX=1B00h.
Примечание 3: для активизации двух шрифтов в поля идентификатора блока шрифта должны быть внесены разные номера блоков. При этом
– 348 –