Dos7book
.pdf
Глава 8: Вызовы обработчиков прерываний
BH |
– 8-битовый поворот колеса прокрутки (примечание 1 к 8.03-33) |
BL |
– байт состояния кнопок (примечание 2 к 8.03-33) |
CX |
– горизонтальная X-координата (примечание 1 к 8.03-53) |
DX |
– вертикальная Y-координата (примечание 1 к 8.03-53) |
Примечание 1: поворот – это число со знаком, возвращаемое если колесо прокрутки у "мыши" имеется и если драйвер способен обслуживать такую
"мышь". Оба эти условия |
надо проверять |
вызовом |
функции |
INT 33\AX=0011h (8.03-43). |
Положительные |
значения |
поворота |
соответствуют направлению "к себе". Счетчик поворота
сбрасывается в нуль после каждого вызова функций
INT 33\AX=0003h, INT 33\AX=0005h и INT 33\AX=0006h (8.03-35).
Примечание 2: удержание нажатыми левой и правой кнопок "мыши" отмечается в
|
байте состояния установлением в единицу соответственно битов 0 и |
|
|
1. Средней кнопке соответствует бит 2, если установленный драйвер |
|
|
поддерживает работу с трехкнопочной "мышью". |
|
Примечание 3: в |
текстовых видеорежимах значения координат выражаются |
|
|
числами, кратными размеру знакоместа. |
|
8.03-34 |
INT 33\AX=0004h – изменение расположения курсора "мыши" |
|
При вызове: |
|
|
|
AX |
= 0004h |
|
CX |
– X-координата курсора (0000h – 0280h в видеорежиме 3) |
|
DX |
– Y-координата курсора (0000h – 00C0h в видеорежиме 3) |
Примечание 1: в |
текстовых видеорежимах координаты округляются до |
|
ближайшего меньшего значения, кратного размеру знакоместа.
Примечание 2: максимальные значения координат курсора для разных видеорежимов можно узнать с помощью INT 33\AX=0026h (8.03-51)
или с помощью INT 33\AX=0031h (8.03-54).
8.03-35 INT 33\AX=0005h–0006h – сообщения о кнопках и о колесе прокрутки
При вызове: |
|
|
AX |
= 0005h – запрос о нажатиях кнопок или о повороте колеса |
|
|
= 0006h |
– запрос об отпускании кнопок или о повороте колеса |
BX |
= 0000h |
– запрашивается сообщение о левой кнопке; |
|
= 0001h |
– запрашивается сообщение о правой кнопке; |
|
= 0002h |
– запрашивается сообщение о средней кнопке; |
При возврате: |
= FFFFh – запрос о повороте колеса прокрутки. |
|
|
|
|
AH |
– 8-битовое значение поворота колеса (примечание 1 к 8.03-33) |
|
– 449 –
Глава 8: Вызовы обработчиков прерываний
AL |
– байт состояния кнопок (примечание 2 к 8.03-33) |
BX |
– после запроса сообщения о кнопках: число нажатий или |
|
отпусканий запрошенной кнопки с момента посылки точно |
|
такого же предыдущего запроса; |
|
– после запроса о колесе прокрутки: 16-битовое значение |
|
поворота колеса прокрутки (примечание 1 к 8.03-33); |
CX |
– горизонтальная X-координата курсора в момент последнего |
|
запрошенного события (нажатия или отпускания кнопки или |
|
поворота колеса прокрутки); |
DX |
– вертикальная Y-координата курсора в момент последнего |
|
запрошенного события (нажатия или отпускания кнопки или |
|
поворота колеса прокрутки). |
Примечание 1: возврат значений BX = CX = DX = 0000h означает, что с момента
посылки точно такого же предыдущего запроса запрашиваемое событие не произошло ни одного раза.
8.03-36 |
INT 33\AX=0007h-0008h – границы перемещения курсора "мыши" |
||
При вызове: |
|
|
|
|
AX |
= 0008h |
– задание границ по вертикали |
|
|
= 0007h |
– задание границ по горизонтали, |
|
CX |
– наименьшее значение координаты (примечание 2 к 8.03-34) |
|
|
DX |
– наибольшее значение координаты (примечание 2 к 8.03-34) |
|
Примечание 1: если в момент вызова курсор "мыши" находился за задаваемым пределом, то он перемещается к соответствующей границе.
8.03-37 |
INT 33\AX=0009h – вид курсора "мыши" в графическом видеорежиме |
|
При вызове: |
|
|
|
AX |
= 0009h |
|
BX |
– горизонтальный сдвиг (от–16 до +16) вершины курсора |
|
CX |
– вертикальный сдвиг (от–16 до +16) вершины курсора |
ES:DX – указатель на пакет масок (примечание 1).
Примечание 1: пакет масок включает маску экрана и маску курсора. Маска экрана занимает 16 слов, начиная со смещения 00h, а маска курсора – тоже 16 слов, начиная со смещения 20h. Каждое слово в маске определяет 16 пикселов, расположенных горизонтально в ряд, причем наименее значимому биту соответствует самый правый пиксел. Маска экрана
накладывается на содержимое видеопамяти посредством поэлементной логической операции AND ("И"), а затем на
– 450 –
Глава 8: Вызовы обработчиков прерываний
полученный результат накладывается маска курсора посредством поэлементной логической операции XOR ("исключающее ИЛИ").
Примечание 2: действующий в данный момент сдвиг вершины курсора можно узнать посредством функции INT 33\AX=002Ah (8.03-53).
8.03-38 |
INT 33\AX=000Ah – вид курсора "мыши" в текстовом видеорежиме |
||
При вызове: |
|
|
|
|
AX |
= 000Ah |
|
|
BX |
= 0000h |
– программный вариант задания вида курсора |
|
|
= 0001h |
– аппаратный вариант задания вида курсора |
|
CX |
– маска экрана (BX=0000h) или начальная строка (BX=0001h) |
|
|
DX |
– маска курсора (BX=0000h) или конечная строка (BX=0001h). |
|
Примечание 1: если выбран программный вариант, то маска экрана накладывается
на содержимое видеопамяти посредством поэлементной логической операции AND ("И"), а затем на полученный результат
накладывается маска курсора посредством поэлементной логической операции XOR ("исключающее ИЛИ"). Старшие байты масок из регистров CH и DH накладываются на байт цвета в видеопамяти (A.10-5). В частности, при CX=0000h форма курсора соответствует знаку, код ASCII которого задан в регистре DL, цвет знака определяется битами 0 – 3 из DH согласно таблице A.10-5, цвет фона – битами 4 – 6 из DH, а от бита 7 в DH зависит мерцание. Если заданы ненулевые значения в битах 4 – 6 регистра CH, то цвет становится зависимым от содержимого видеопамяти, так что курсор получается хорошо заметным на любом фоне.
Примечание 2: если выбран аппаратно определенный вариант, то курсор имеет вид мерцающей полоски или мерцающего прямоугольника. В частности, при CX=0002h и DX=0003h полоска высвечивается над знаком в строке, а при CX=0003h, DX=0004h – под знаком как подчеркивание.
8.03-39 INT 33\AX=000Bh – показания счетчиков движения "мыши"
При вызове: |
|
AX |
= 000Bh |
При возврате: |
|
CX |
– смещение по горизонтали с момента предыдущего вызова |
DX |
– смещение по вертикали с момента предыдущего вызова |
Примечание 1: смещения курсора "мыши" измеряются в шагах ("mickeys"). Шаг смещения – это наименьшее воспринимаемое изменение положения
– 451 –
Глава 8: Вызовы обработчиков прерываний
"мыши". Драйверы фирмы Microsoft связывают положительное число шагов с направлением движения вниз и вправо. Соотношение
между величиной шага и размером пиксела можно изменять с помощью INT 33\AX=000Fh (8.03-41).
Примечание 2: INT 33\AX=0027h при вызове тоже требует указать только AX, и возвращает те же смещения в CX и DX, но сверх того возвращает в зависимости от варианта отображения курсора (8.03-38) в регистре AX – маску экрана или начальную строку курсора, а в регистре BX
– маску курсора или конечную строку курсора.
8.03-40 |
INT 33\AX=000Ch – вызов резидентной программы драйвером "мыши" |
|
При вызове: |
|
|
|
AX |
= 000Ch |
|
CX |
– условия вызова: |
бит 0: – при движении "мыши" бит 1: – при нажатии левой кнопки
бит 2: – при отпускании левой кнопки бит 3: – при нажатии правой кнопки бит 4: – при отпускании правой кнопки бит 5: – при нажатии средней кнопки бит 6: – при отпускании средней кнопки бит 7: – при повороте колеса прокрутки
ES:DX – адрес вызова программы командой CALL FAR (7.03-08)
Примечание 1: в регистре CX могут быть заявлены несколько условий, и тогда
вызов резидентной программы будет производиться при выполнении любого из этих условий. Состояния битов 8 – 15 в регистре CX не учитываются, а состояния битов 5 – 7 учитываются только теми драйверами, которые поддерживают соответствующие функции "мыши".
Примечание 2: при вызове программы драйвер оставляет в регистрах следующее:
AX |
– условия вызова (как в CX при вызове драйвера); |
BH |
– поворот колеса прокрутки (примечание 1 к 8.03-33) |
BL |
– байт состояния кнопок (примечание 2 к 8.03-33) |
CX |
– горизонтальная координата (примечание 2 к 8.03-34) |
DX |
– вертикальная координата (примечание 2 к 8.03-34) |
SI |
– смещение по горизонтали (примечание 1 к 8.03-39) |
DI |
– смещение по вертикали (примечание 1 к 8.03-39) |
Примечание 3: обработчик прерывания INT 33\AX=0014h заменяет ранее заданные условия вызова и адрес на новые, которые надо точно так же указать в регистрах CX и ES:DX. В отличие от INT 33\AX=000Ch,
– 452 –
Глава 8: Вызовы обработчиков прерываний
обработчик прерывания INT 33\AX=0014h возвращает в CX и в ES:DX замененные прежние значения условий вызова и адреса.
Примечание 4: если программа установила адрес вызова, то при ее завершении
установленный адрес должен быть дезактивирован посредством повторного вызова INT 33\AX=000Ch с CX=0000h.
Примечание 5: драйверы "мыши" фирмы Microsoft способны при разных условиях вызывать до четырех резидентных программ. Первая из них должна быть заявлена с помощью INT 33\AX=000Ch, а последующие – с
помощью INT 33\AX=0018h (8.03-45).
8.03-41 |
INT 33\AX=000Fh – чувствительность перемещений "мыши" |
||
При вызове: |
|
|
|
|
AX |
= 000Fh |
|
|
CX |
– число шагов на 8 |
пикселов по горизонтали (по умолчанию 8) |
|
DX |
– число шагов на 8 |
пикселов по вертикали (по умолчанию 16). |
8.03-42 INT 33\AX=0010h – локальный запрет отображения курсора.
При перемещении курсора "мыши" по экрану драйвер "мыши" восстанавливает изображение на каждом прежнем месте расположения курсора. Чтобы эти действия не мешали обновлению изображения, индикацию курсора "мыши" на обновляемом участке изображения желательно заранее запретить. В отличие от полного запрета посредством INT 33\AX=0002h (8.03-32), локальный запрет позволяет сделать мерцание курсора совсем незаметным. По завершении обновления заявленного участка индикацию курсора восстанавливают вызовом INT 33\AX=0001h (8.03-32).
При вызове: |
|
|
|
AX |
= 0010h |
|
CX |
– горизонтальная X-координата левого верхнего угла участка |
|
DX |
– вертикальная Y-координата левого верхнего угла участка |
|
SI |
– горизонтальная X-координата нижнего правого угла участка |
|
DI |
– вертикальная Y-координата нижнего правого угла участка |
8.03-43 |
INT 33\AX=0011h – проверка поддержки колеса прокрутки |
|
При вызове: |
|
|
|
AX |
= 0011h |
При возврате: |
|
|
|
AX |
= 574Dh – эта сигнатура подтверждает, что драйвер способен |
|
|
обслуживать "мышей" с колесом прокрутки (примечание 1) |
|
CX |
– установленное состояние бита 0 означает, что используемая |
|
|
"мышь" снабжена колесом прокрутки. |
|
|
– 453 – |
Глава 8: Вызовы обработчиков прерываний
Содержимое регистра BX может быть изменено.
Примечание 1: драйверы GMOUSE.COM (5.03-01) версии 9.06 и выше отвечают на вызов INT 33\AX=0011h возвратом сигнатуры AX = FFFFh. Она означает, что драйвер не обслуживает колесо прокрутки, но возвращает в регистре BX число активных кнопок "мыши".
8.03-44 |
INT 33\AX=0016h-0017h – сохранение состояния драйвера "мыши" |
||
При вызове: |
|
|
|
|
AX |
= 0016h |
– запись состояния драйвера в буфер |
|
|
= 0017h |
– восстановление состояния по данным из буфера |
|
BX |
– размер буфера для записи состояния (примечание 2). |
|
|
ES:DX – адрес буфера (при AX=0017h он должен быть заполнен) |
||
При возврате: |
|
|
|
|
ES:DX – адрес буфера с данными состояния драйвера "мыши". |
||
Примечание 1: восстановление состояния драйвера "мыши" должно происходить в том же видеорежиме, в котором сделана та запись состояния, по которой будет производиться восстановление.
Примечание 2: размер буфера для записи состояния драйвера "мыши" следует определить с помощью INT 33\AX=0015h: требуемый размер буфера в байтах будет возвращен в регистре BX.
8.03-45 INT 33\AX=0018h – вызов добавочных программ драйвером "мыши"
"Мышиные" драйверы фирмы Microsoft вызывают в зависимости от условий до 4-х резидентных программ. Первая из них должна быть заявлена с помощью
INT 33\AX=000Ch (8.03-40), а последующие – с помощью INT 33\AX=0018h.
При вызове: |
|
AX |
= 0018h |
CX |
– условия вызова: |
|
бит 0: – при движении "мыши" |
|
бит 1: – при нажатии левой кнопки |
|
бит 2: – при отпускании левой кнопки |
|
бит 3: – при нажатии правой кнопки |
|
бит 4: – при отпускании правой кнопки |
|
бит 5: – во время удержания клавиши SHIFT |
|
бит 6: – во время удержания клавиши CTRL |
|
бит 7: – во время удержания клавиши ALT |
ES:DX – адрес вызова программы командой CALL FAR (7.03-08) При успешном завершении AX = 0018h, при неудаче AX = FFFFh.
– 454 –
Глава 8: Вызовы обработчиков прерываний
Примечание 1: дополнительные программы вызываются только в случая нажатия на клавиатуре клавиш SHIFT, CTRL или ALT, так что хотя бы один из битов 5 – 7 в регистре CX должен быть установлен в единицу. Состояния старших битов 8 – 15 в регистре CX игнорируются. Остальные биты 0 – 4 в регистре CX учитываются по условию
"ИЛИ", как при INT 33\AX=000Ch (8.03-40, примечание 1).
Примечание 2: при вызове программы на исполнение драйвер "мыши" оставляет в регистрах величины, перечисленные в примечании 2 к 8.03-40.
Примечание 3: чтобы прекратить обращения к ранее заявленной резидентной программе, нужно вызвать INT 33\AX=0018h повторно с тем же кодом условий в регистре CX, но с адресом 0000:0000h в ES:DX.
Примечание 4: поддержка INT 33\AX=0018h введена фирмой Microsoft в драйверы "мыши" начиная с версии 6.0. Драйверы "мыши", поставляемые другими фирмами, могут не поддерживать INT 33\AX=0018h.
8.03-46 INT 33\AX=0019h – адрес обращения к резидентной программе.
В ответ на вызов INT 33\AX=0019h драйвер "мыши" возвращает адрес обращения к той дополнительной резидентной программе, которая уже заявлена через INT 33\AX=0018h (8.03-45) и должна реагировать на условия, определенные значением в регистре CX. По возвращаемым данным любая программа, которая заменяет адрес обращения, сможет потом восстановить функционирование первоначально загруженной дополнительной резидентной программы.
При вызове: |
|
|
|
AX |
= 0019h |
|
CX |
– поисковое слово условий вызова (8.03-45) |
Если не удалось найти такую резидентную программу, которая соответствует |
||
|
поисковому слову условий вызова, то при возврате CX = 0000h. |
|
Если подходящая резидентная программа найдена, то при возврате BX:DX – адрес |
||
|
обращения к ней, а CX – то слово условий вызова (8.03-45), с которым эта |
|
|
программа была первоначально заявлена. |
|
8.03-47 |
INT 33\AX=001Dh-001Eh – страница экрана для курсора "мыши" |
|
При вызове: |
|
|
|
AX |
= 001Dh – переадресация на другую экранную страницу |
|
|
= 001Eh – выяснение адресуемой курсором экранной страницы |
|
BX |
– номер новой страницы (только для INT 33\AX=001Dh) |
При возврате из INT 33\AX=001Eh: |
||
|
BX |
– номер адресуемой экранной страницы. |
– 455 –
Глава 8: Вызовы обработчиков прерываний
8.03-48 INT 33\AX=001Fh-0020h – включение и отключение драйвера "мыши"
При вызове:
AX = 001Fh – прекращение действия драйвера "мыши" = 0020h – возобновление действия драйвера "мыши"
При успешном завершении значение в AX сохраняется, при неудаче AX = FFFFh.
Примечание 1: вызов INT 33\AX=001Fh восстанавливает прежние указатели на обработчики прерываний INT 10 и INT 74, которые были установлены до загрузки драйвера "мыши".
Примечание 2: вызов INT 33\AX=0020h возвращает указатели, поставленные драйвером "мыши", только если они были сняты посредством
INT 33\AX=001Fh.
Примечание 3: при успешном завершении INT 33\AX=001Fh возвращает в регистрах ES:BX адрес обработчика прерывания INT 33, который был установлен до загрузки драйвера "мыши". Если записать этот адрес обратно в таблицу прерываний, то возможность вызова драйвера "мыши" через прерывания будет полностью исключена.
8.03-49 |
INT 33\AX=0021h – выяснение установлен ли драйвер "мыши" |
|
При вызове: |
|
|
|
AX |
= 0021h |
Если драйвер "мыши" не установлен, то при возврате обычно AX = 0021h. |
||
Если при возврате AX = FFFFh, то драйвер "мыши" установлен, и тогда |
||
|
BX |
– число кнопок "мыши", причем для двухкнопочной "мыши" |
|
|
может быть возвращено значение BX = FFFFh |
Примечание 1: MS-DOS7 заполняет свободные ячейки таблицы прерываний (до INT 3F) отсылками к команде IRET (7.03-30). Когда драйвер "мыши" не загружен, эта команда IRET просто возвращает неизмененное состояние регистра AX. Выяснить, установлен ли драйвер "мыши" и сразу же привести его в начальное состояние можно с помощью функции INT 33\AX=0000h (8.03-31). Функция INT 33\AX=0021h не устанавливает драйвер в начальное состояние, но тем не менее сбрасывает счетчик поворота колеса прокрутки.
8.03-50 INT 33\AX=0024h – выяснение типа "мыши" и номера линии IRQ
При вызове:
AX = 0024h
При неудаче AX = FFFFh. Если в AX любое другое значение, то BH.BL – номер версии драйвера "мыши"
– 456 –
Глава 8: Вызовы обработчиков прерываний
|
CH |
= 00h – "мышь" не подключена |
|
|
|
= 01h |
– "мышь" подключена через карту расширения |
|
|
= 02h |
– "мышь" для последовательного порта |
|
|
= 04h |
– "мышь" для порта PS/2, |
|
|
= 05h |
– "мышь" фирмы Hewlett-Packard |
|
CL |
– шестнадцатеричный номер линии IRQ для "мыши" (для |
|
|
|
"мышей", подключенных к порту PS/2, возвращается CL = 00h) |
|
8.03-51 |
INT 33\AX=0026h – предельные значения координат курсора "мыши" |
||
При вызове: |
|
|
|
|
AX |
= 0026h |
|
При неудаче в BX ненулевое значение. Если же при возврате BX = 0000h, то: |
|||
|
CX |
– максимальная X-координата в установленном видеорежиме |
|
|
DX |
– максимальная Y-координата в установленном видеорежиме |
|
Примечание 1: обработчик прерывания INT 33\AX=0026h выдает координаты для того случая, когда перемещение курсора "мыши" не ограничено
"окном". Иначе следует вызывать INT 33\AX=0031h(8.03-54).
Примечание 2: прежде чем определять максимальные значения координат, нужно с помощью INT 33\AX=0032h (8.03-55) выяснить, поддерживает ли установленный драйвер "мыши" функцию INT 33\AX=0026h.
8.03-52 INT 33\AX=0028h – изменение видеорежима драйвером "мыши"
Видеорежим определяет не только геометрические соотношения, но также форматы данных в видеопамяти. Чтобы обращения драйвера "мыши" к видеопамяти были бы скорректированы согласно установленному видеорежиму, нужно переключать видеорежимы посредством драйвера "мыши". Только тогда смена видеорежима не нарушит перемещение и отображение курсора "мыши".
При вызове: |
|
AX |
= 0028h |
CX |
– код нового видеорежима из таблицы A.10-1 |
DH |
– вертикальный размер знакоместа (примечание 1) |
DL |
– горизонтальный размер знакоместа (примечание 1) |
При успешном завершении CL = 00h. При неудаче в CL – ненулевое значение.
Примечание 1: чтобы установить принимаемый по умолчанию размер знакоместа для данного видеорежима, нужно при вызове задать DH = DL = 00h.
Если запрошенный видеорежим не поддерживает изменение размеров знакоместа, то значения в DH и в DL игнорируются.
– 457 –
Глава 8: Вызовы обработчиков прерываний
Примечание 2: вызов с CX=0000h не переустанавливает видеорежим, но сбрасывает флаг смены видеорежима. Этот флаг надо сбрасывать перед приведением драйвера "мыши" в начальное состояние.
Примечание 3: прежде чем переустанавливать видеорежим, нужно с помощью
INT 33\AX=0032h (8.03-55) выяснить, поддерживает ли установленный драйвер "мыши" функцию INT 33\AX=0028h.
Примечание 4: перечень видеорежимов, поддерживаемых драйвером "мыши",
можно получить посредством нескольких последовательных вызовов INT 33\AX=0029h. Первый вызов принимает CX=0000h и возвращает в CX код первого видеорежима. С этим кодом в CX производится следующий вызов и возвращает в CX код второго видеорежима, и так далее. Некоторые драйверы возвращают в DS:DX указатель на строку описания видеорежима, другие возвращают DS:DX=0000:0000h. Окончание цикла выдачи кодов отмечается возвратом CX=0000h.
8.03-53 |
INT 33\AX=002Ah – параметры отображения курсора "мыши" |
|
При вызове: |
|
|
|
AX |
= 002Ah |
При возврате: |
|
|
|
AX |
– число запретов отображения (INT 33\AX=0002h, 8.03-32). |
|
BX |
– сдвиг вершины курсора относительно X-координаты |
|
CX |
– сдвиг вершины курсора относительно Y-координаты |
|
DX |
– тип "мыши", как в CH после INT 33\AX=0024h (8.03-50). |
Примечание 1: координаты курсора определяют положение левой верхней угловой точки курсорного блока. Вершина курсора – это точка, куда указывает курсор. Ее сдвиг относительно левой верхней угловой точки может быть от–127 до +127 по обеим координатам.
Примечание 2: прежде чем выяснять параметры отображения курсора, нужно с помощью INT 33\AX=0032h (8.03-55) выяснить, поддерживает ли установленный драйвер "мыши" функцию INT 33\AX=002Ah.
8.03-54 INT 33\AX=0031h – пределы изменения координат курсора "мыши"
Обработчик прерывания INT 33\AX=0031h сообщает допустимые пределы изменения координат курсора "мыши", когда его перемещение ограничено "окном",
заданным посредством INT 33\AX=0007h-0008h (8.03-36).
При вызове:
AX = 0031h
При возврате:
– 458 –
