Главная » Ассемблер, Железо » Непосредственная работа с мышью PS/2-типа

0

Мышь PS/2 подключаются не к последовательному порту, а к разъему дополнительного устройства PS/2. Мышь обслуживается тем же контроллером материнской платы, что и клавиатура, то есть получает команды и передает данные через те же порты ввода-вывода. Отличие заключается в том, что при приеме пакета данных от мыши контроллер вырабатывает прерывание IRQ12. Это прерывание необходимо закрепить за мышью с помощью процедуры BIOS SETUP, иначе оно может быть захвачено каким-либо другим устройством и станет для мыши недоступным.

Мышь PS/2 может находиться в одном из указанных ниже режимов работы.

•    Потоковый режим — мышь выдает пакет данных, если произошло изменение координат устройства, нажатие или отпускание кнопки. Максимальная скорость передачи данных определяется установленной частотой дискретизации.

•    Режим дистанционного управления — мышь осуществляет передачу пакета данных только по запросу со стороны компьютера, то есть по команде считывания данных Read Data.

•    Эхо-режим — любой байт данных, переданный компьютером (кроме ECh и FFh), мышь отсылает обратно.

После включения напряжения питания или получения команды Reset мышь ожидает примерно 0,5 секунды и посылает компьютеру последовательность байтов: ААh, OOh. Затем по умолчанию устанавливается инкрементальный потоковый режим, масштабирование 1:1, темп передачи 100 пакетов данных в секунду. После этого мышь

отключается и больше никаких операций не производит, пока компьютер не передаст команду Enable (которая активизирует мышь). Список команд, выполняемых мышью PS/2, приводится в табл. 5.9.

Таблица 5.9. Команды, выполняемые мышью PS/2

Код

Команда

Выполняемое дейстаие

E6h

Reset Scaling

Отменить масштабирование перемещения

E7h

Set Scaling 2:1

Установить масштабирование перемещения для увеличения чувствительности мыши (см. табл 5 10)

E8h

Set Resolution

Установить разрешение

E9h

Status Request

Получить информацию о состоянии устройства

EAh

Set Stream Mode

Установить потоковый режим

EBh

Read Data

Выдать пакет данных

ECh

Reset Wrap Mode

Отменить эхо-режим

EDh

Set Wrap Mode

Установить эхо-режим

FOh

Set Remote Mode

Установить режим дистанционного управления

F2h

Read Device Type

Определить тип устройства

F3h

Set Sampling Rate

Установить частоту дискретизации

F4h

Enable

Разрешить передачу данных от мыши

F5h

Disable

Остановить передачу данных от мыши

F6h

Set Default

Установить значение параметров работы мыши, используемое по умолчанию

FEh

Resend

Повторить передачу данных

FFh

Reset

Осуществить сброс и произвести самотестирование устройства

Рассмотрим перечисленные команды более подробно.

•    Команда E6h (Reset Scaling) отменяет режим масштабирования перемещения (устанавливает масштаб 1:1).

•    Команда E7h (Set Scaling 2:1) устанавливает режим масштабирования перемещения 2:1 для увеличения чувствительности мыши (табл. 5.10).

Таблица 5.10. Масштабирование перемещения в режиме 2:1

Реальное перемещение

Информация о перемещении,

 

 

выдаваемая мышью

 

0

0

 

1

1

 

Реальное перемещение

Информация о перемещении, выдаваемая мышью

2

1

3

3

4

6

5

9

N(>6)

2N

•    Команда EBh (Set Resolution) служит для установки используемого разрешения, код которого передается в следующем за командой байте данных и определяет число отсчетов на миллиметр (OOh — 1 отсчет, Olh — 2 отсчета, 02h — 4 отсчета, 03h — 8 отсчетов).

•    Команда E9h (Status Request) вызывает выдачу специального трех- байтного пакета данных, содержащего информацию о статусе устройства (то есть о текущих значениях параметров работы): формат первого байта показан в табл. 5.11, второй байт содержит код разрешения, третий — код частоты дискретизации.

Таблица 5.11. Формат первого байта статуса

Номер бита

Значение

0

Состояние правой кнопки (0 — отпущена, 1 — нажата)

1

Состояние средней кнопки (0 — отпущена, 1 — нажата)

2

Состояние левой кнопки (0 — отпущена, 1 — нажата)

3

Зарезервирован (всегда 0)

4

Масштабирование (0 — режим 1:1,1 — режим 2:1)

5

Передача данных (0 — запрещена, 1 — разрешена)

6

Режим (0 — потоковый, 1 — дистанционного управления)

7

Зарезервирован (всегда 0)

•    Команда EDh (Set Wrap Mode) переводит мышь в эхо-режим. В эхо- режиме мышь отсылает обратно в компьютер каждый переданный ей байт данных (кроме ECh и FFh). Применяется данный режим для тестирования интерфейса мыши. Отменить его можно посылкой команды ECh или FFh.

•    Команда FOh (Set Remote Mode) позволяет установить режим дистанционного управления: мышь будет передавать пакеты данных только по запросу со стороны компьютера (но команде EBh).

•    Команда F2h (Read Device Туре) предназначена для определения типа подключенного координатного устройства. Мышь должна выдавать в ответ на эту команду однобайтный код OOh.

•    Команда F3h (Set Sampling Rate) служит для установки частоты дискретизации. Следующий за ней байт данных должен содержать код, задающий максимальное количество пакетов данных, которое может быть передано за одну секунду (табл. 5.12).

Таблица 5.12. Коды для установки частоты дискретизации

Код

Частота дискретизации, пакет/с

OAh

10

14h

20

28h

40

3Ch

60

50h

80

64h

100

C8h

200

выполняет повторную передачу предыдущего пакета данных. Однако сигнал помехи, способный вызвать сбой при передаче данных от мыши, должен быть настолько мощным, что, скорее всего, нарушит и внутренние установки параметров встроенного в мышь микроконтроллера, поэтому при обнаружении ошибки лучше подать команду сброса и все параметры переустановить.

•    Команда FFh (Reset) используется при обнаружении серьезных сбоев в работе мыши. По этой команде выполняется процедура сброса, самотестирования и выдачи идентификационной последовательности байтов (как при включении напряжения питания).

Рассмотрим примеры работы с мышью PS/2. В листинге 5.3 приведены две подпрограммы общего назначения. Процедура Wait8042Buf- ferEmpty выполняет операцию ожидания поступления сигнала очистки входного буфера контроллера клавиатуры (ее нужно вызывать перед началом операции записи байта в буфер), а процедура Wait- MouseData — операцию ожидания поступления данных от мыши.

Листинг 5.3. Процедуры общего назначения C0DESEG

I[1] ОЖИДАНИЕ ОЧИСТКИ ВХОДНОГО БУФЕРА 18042 * ;* При выходе из процедуры:*

;* флаг ZF установлен – нормальное завершение. * ;* флаг ZF сброшен – ошибка тайм-аута.*

•  А А АА ААААА AAA1 А А А Л А ‘А’ А1 А А А А А1 А Л А А1 А’А А1 А А Л А А А’А А1 А А А А’А"А"А

proc Wait8042BufferEmpty near push CX

mov CX.OFFFFh :задать число циклов ожидания

@@kb:

in AL,64h ;получить статус test AL.lOb :буфер i8042 свободен? loopnz

@@kb .-если нет. то цикл pop CX

;Если при выходе из подпрограммы сброшен ;флаг ZF – ошибка

ret;возврат в подпрограмму

endp Wait8042BufferEmpty

;* ОЖИДАНИЕ ПОСТУПЛЕНИЯ ДАННЫХ ОТ МЫШИ *

• A A A A A A A A A A AAA А’ А А А А А А А А А’А А’ А’ А-А А А’А’ А’ А А А А’А"А"А

proc WaitMouseData near push CX

mov CX.OFFFFh :задать число циклов ожидания

@ftnouse:

in AL.64h :опросить регистр статуса

Листинг 5.3 (продолжение)

test AL,100000b :данные поступили? loopz

@@mouse ;если нет, то цикл pop СХ

;Если при выходе из подпрограммы установлен

;флаг ZF – ошибка

ret

endp WaitMouseOata ENDS

В листинге 5.4 показан пример программы (SetPS2MouseParameters), изменяющей характеристики работы мыши PS/2 (разрешение и частоту дискретизации). Как упоминалось выше, пакет данных, описывающий состояние мыши, состоит из трех байт: байта статуса, байта разрешения и байта частоты дискретизации. Старые и новые значения характеристик отображаются на экран в виде таблицы (в двоичном коде). Для запуска программы пригоден любой АТ- совместимый персональный компьютер с подключенной мышью PS/2-типа.

ПРИМЕЧАНИЕ

Если в момент запуска программы-примера на компьютере уже установлен драйвер мыши PS/2, то после завершения работы программы драйвер сам восстановит нужные ему значения параметров.

Листинг 5.4. Управление параметрами работы мыши типа PS/2

IDEAL

Р386

LOCALS

MODEL MEDIUM

: Подключить файл мнемонических обозначений : кодов управляющих клавиш и цветовых кодов

Include "listl_03.inc" : Подключить файл макросов

Include "listl_04.inc"

SEGMENT sseg para stack ‘STACK’

DB 400h DUP(?)

ENDS

DATASEG

: Текстовые сообщения Txtl

DB YELLOW.0.18

DB "Управление параметрами работы мыши типа PS/2",0

DB LIGHTGREEN,10.0,"Состояние".0

DB LIGHTGREEN,10,16,"Статус",0

DB LIGHTGREEN,10.32,"Разрешение".0

DB LIGHTGREEN,10,48,"Дискретизация",0

DB LIGHTCYAN.12.0."Исходное:",0

DB LIGHTCYAN.14,0."Установленное:".0

DB YELLOW.24,22

DB "Нажмите любую клавишу на клавиатуре".0

Errl

DB 11,22,"Ошибка обмена данными с мышью PS/2!",0

ENDS

CODESEG

;* Основной модуль программы *

‘к "kit ink idddcicic idckick ‘tcicit"iddcickk Л? "irfcit

PROC SetPS2MouseParameters

mov AX.DGROUP

mov DS.AX

mov [CS:MainDataSeg].AX

: Установить текстовый режим и очистить экран

mov АХ.З int 10h

: Скрыть курсор – убрать за нижнюю границу экрана

mov [ScreenStri ng].25

mov [ScreenColumn].0 call SetCursorPosition

: Вывести текстовые сообщения на экран MShowColorText В,Txtl

; ЗАПРЕТИТЬ ГЕНЕРАЦИЮ ПРЕРЫВАНИЯ IRQ12

: Прочитать внутренний регистр команд i8042 call Wai t8042BufferEmpty

mov AL,020h out 64h,AL in AL,60h

: Сохранить содержимое регистра команд в АН

mov AH.AL

; Записать внутренний регистр команд i8042 call Wait8042BufferEmpty

mov AL,060h out 64h,AL

; Запретить сигнал прерывания от иыши

mov AL.AH and AL.11111101b out 60h,AL

: ПРОЧИТАТЬ ИСХОДНОЕ СОСТОЯНИЕ МЫШИ

: Установить белый цвет символов и черный фон

mov [TextColorAndBackground].OFh

: Установить начальную позицию для вывода данных на экран

mov [ScreenStri ng].12

Листинг 5.4(продолжение)’

mov [ScreenColumn],16

; Послать команду считывания состояния ныши call Wait8042BufferEmpty

mov AL,0D4h ;послать мыши байт данных out 64h,AL call Wait8042BufferEmpty

mov AL,0E9h ;команда считывания состояния out 60h,AL

; Получить от мыши код подтверждения приема команды call WaitMouseData

jz

@@DataInputError ;данные не поступили in AL,60h

; Получено подтверждение приема команды? cmp AL.OFAh

jnz

@@OataInputError ;нет подтверждения приема : Принять информацию от мыши

; Получить первый байт состояния call WaitMouseData jz

@@OataInputError in AL,60h call ShowBinByte

add [ScreenColumn],8

; Получить второй байт состояния call WaitMouseData jz

@@DataInputError in AL,60h call ShowBinByte

add [ScreenColumn],8

; Получить третий байт состояния call WaitMouseData jz

@@DataInputError in AL,60h call ShowBinByte

add [ScreenColumn],8

; УСТАНОВИТЬ РАЗРЕШЕНИЕ

; Послать команду установки разрешения call Wait8042BufferEmpty

mov AL,0D4h ;послать мыши байт данных out 64h,AL call Wait8042BufferEmpty

mov AL,0E8h ;команда установки разрешения out 60h.AL : Получить от иыши код подтверждения приема конанды call WaitMouseData

jz

@@OataInputError : данные не поступили in AL.60h

: Получено подтверждение приема команды? cmp AL.OFAh

jnz@@DataInputError ;нет подтверждения : Послать код разрешения

callWait8042BufferEmpty

movAL,0D4h

out64h,AL

callWai t8042Bu fferEmpty

movAL,1 ;код разрешения 1 точка/ми

out60h,AL

; Получить код подтверждения приема команды

callWaitMouseData

jz@@DataInputError ;данные не поступили

inAL,60h

; Получено подтверждение приема команды?

cmpAL.OFAh

jnz@@DataInputError ;нет подтверждения

; УСТАНОВИТЬ ЧАСТОТУ ДИСКРЕТИЗАЦИИ

; Послать команду установки частоты дискретизации саП Wait8042BufferEmpty

mov AL,0D4h .послать мыши байт данных out 64h,AL call Wait8042BufferEmpty

mov AL,0F3h установить частоту out 60h,AL

; Получить код подтверждения приема команды саП WaitMouseData

jz

@@DataInputError :данные не поступили in AL,60h

: Получено подтверждение приема команды? cmp AL.OFAh

jnz

@@DataInputError ;нет подтверждения

; Послать код частоты дискретизации саП WaitB042BufferEmpty

mov AL,0D4h out 64h,AL call Wait8042BufferEmpty

mov AL.0C8h ;выдавать 200 пакетов в секунду out 60h,AL

; Получить код подтверждения приема команды call WaitMouseData

jz

@@DataInputError ;данные не поступили in AL,60h

: Получено подтверждение приема команды? cmp AL.OFAh

jnz

@@DataInputError ;нет подтверждения

; ПРОЧИТАТЬ НОВОЕ СОСТОЯНИЕ МЫШИ

mov [ScreenString],14

mov [ScreenColumn],16 : Послать команду считывания состояния мыши

Листинг 5.4(продолжение)

call Wai t8042BufferEmpty

mov AL,0D4h

out 64h,AL

call Wait8042BufferEmpty

mov AL,0E9h

out ‘ 60h.AL

; Получить код подтверждения приема команды call WaitMouseData

jz

@@DataInputError ;данные не поступили in AL,60h

; Получено подтверждение приема команды? cmp AL.OFAh

jnz

@@DataInputError ;нет подтверждения

; Принять информацию от мыши

; Получить первый байт состояния call WaitMouseData jz PPDatalnputError in AL.60h call ShowBinByte

add [ScreenColumn],8

; Получить второй байт состояния call WaitMouseData jz PPDatalnputError in AL,60h call ShowBinByte

add [ScreenColumn],8

; Получить третий байт состояния call WaitMouseData jz P@DataInputError in AL.60h call ShowBinByte

add [ScreenColumn],8

; РАЗРЕШИТЬ ГЕНЕРАЦИЮ ПРЕРЫВАНИЯ IRQ12

; Прочитать внутренний регистр команд i8042 call Wait8042BufferEmpty

mov AL,020h out 64h,AL in AL,60h

: Записать внутренний регистр команд i8042

mov AH,AL

call Wait8042BufferEmpty

mov AL,060h out 64h,AL

mov AL.AH

or AL.lOb разрешить прерывание от мыши out 60h,AL

jmp short

@@End

; Ожидать нажатия любой клавиши на клавиатуре (a@End: саП GetChar

; Переустановить текстовый режии и очистить экран

mov АХ,3 int 10h

; Выход в DOS

mov AH,4Ch int 21h

; Обработка ошибок PPOatalnputError:

MFatalError Errl ENDP SetPS2MouseParameters ENDS

; Подключить процедуры вывода данных на экран

Include "listl_02.inc"

; Подключить процедуры очистки выходного буфера

; контроллера клавиатуры и ожидания поступления

; данных от ныши

Include "list5_03.inc"

END

В листинге 5.5 приведена программа PS2MouseStart, устанавливающая новый (пользовательский) обработчик прерывания от мыши PS/2. Прежде чем установить обработчик при помощи процедуры SetPS2MouseInterrupt, основная программа посылает мыши команду разрешения передачи данных, одновременно проверяя тем самым наличие мыши и ее исправность (если мышь не отвечает кодом подтверждения, значит, она не подключена).

Программа обработки прерывания PS2MouseInterrupt принимает пакеты данных от мыши и после приема каждого трехбайтного пакета определяет состояние кнопок и приращение значений координат курсора. Для вывода курсора на экран используется процедура Show- NewMouseCursorPosition, которая инвертирует байт атрибута символа в позиции курсора (запоминая предварительно старое значение атрибута и восстанавливая его при перемещении курсора). Основная программа контролирует (в цикле) состояние левой кнопки мыши и завершает свою работу при нажатии на нее, восстанавливая предварительно старый вектор прерывания при помощи процедуры Re- store01dPS2MouseInterrupt. Для запуска программы пригоден любой АТ-совместимый персональный компьютер с подключенной мышью PS/2-типа.

Листинг 5.5. Установка нового обработчика прерывания мыши PS/2, отображающего указатель в текстовом режиме инверсией атрибута символа

IDEAL

Р386

LOCALS

MODEL MEDIUM

; Подключить файл мнемонических обозначений

; кодов управляющих клавиш и цветовых кодов

Include "listl_03.inc"

; Подключить файл макросов

Include "listl_04.inc"

SEGMENT sseg para stack ‘STACK’

DB 400h DUP(?)

ENDS

ScreenLength equ 80 ScreenWidth equ 25

DATASEG

; Область сохранения старого вектора прерывания мыши DldPS2MouseInterrupt0ffset DW ? DIdPS2MouseInterruptSegment DW ?

; Номер принимаемого от мыши байта MouseByteNumber

DB 0

; Трехбайтовая структура данных, передаваемая мышью

FirstByte

DB 0

SecondByte

DB 0

Thi rdByte

DB 0

; Текущее состояние кнопок

ButtonsStatus

DB 0

: Текущие координаты курсора мыши

XCoordinate DW 0

YCoordinate DW 0

: Предыдущая позиция курсора мыши

DldXCoordinate DW 0

DldYCoordinate DW 0

: Старое значение фона символа

DldCharBackground

DB OFh

: Текстовые сообщения

Txtl

DB LIGHTGREEN,0,28,"Тест для мыши PS/2-типа",0

DB WHITE,12,14,"Отображение курсора "

DB "мыши инверсией атрибута символа".0

DB YELLOW,24,21

DB "Для выхода нажмите левую клавишу мыши",0 Errl

DB 11.22,"Ошибка обмена данными с мышью PS/2!",0 ENDS

CODESEG

;* Основной модуль программы *

PROC PS2MouseStart

mov AX.DGROUP

mov DS.AX

mov [CS:Mai nDataSeg],AX : Установить текстовый режим и очистить экран

mov АХ,3 int 10h

; Скрыть текстовый курсор – убрать за

; нижнюю границу экрана

mov [ScreenStri ng],25

mov [ScreenColumn],0 call SetCursorPosition

; Вывести текстовые сообщения на экран MShowColorText 3,Txtl

; ЗАПРЕТИТЬ ГЕНЕРАЦИЮ ПРЕРЫВАНИЯ IRQ12

; Прочитать внутренний регистр команд 18042 call Wai tB042BufferEmpty

mov AL,020h out 64h,AL in AL,60h

; Сохранить содержимое регистра команд в АН

mov AH.AL

; Записать внутренний регистр команд iB042 call WaitB042BufferEmpty

mov AL,060h out 64h,AL

; Запретить сигнал прерывания от мыши

mov AL.AH and AL,11111101b out 60h,AL

: РАЗРЕШИТЬ ПЕРЕДАЧУ ДАННЫХ ОТ МЫШИ call WaitB042BufferEmpty

mov AL.0D4h ;послать мыши байт данных out 64h,AL call WaitB042BufferEmpty

mov AL,0F4h разрешить передачу данных out 60h,AL

; Получить код подтверждения приема команды call WaitMouseData

jz

@@DataInputError ;данные не поступили in AL,60h

; Получено подтверждение приема команды? cmp AL.OFAh

jnz

@@DataInputError- ;нет подтверждения

Листинг 5.5(продолжение)

; РАЗРЕШИТЬ ГЕНЕРАЦИЮ ПРЕРЫВАНИЯ IRQ12

; Прочитать внутренний регистр команд 18042 call Wait8042BufferEmpty

mov AL,020h out 64h,AL in AL,60h

; Записать внутренний регистр команд i8042

mov AH.AL

cal1 Wai tB042BufferEmpty

mov AL.060h out 64h,AL

; разрешить сигнал прерывания от мыши

mov AL.AH or AL.10b out 60h,AL

; УСТАНОВИТЬ НОВЫЙ ОБРАБОТЧИК ПРЕРЫВАНИЯ

; Обнулить позицию курсора мыши

mov [XCoordinate],0

mov [YCoordinate],О

mov [01dXCoordinate],0

mov [OldYCoordinateLO

; Отобразить курсор мыши первый раз

call ShowNewMouseCursorPosition

; Установить новый обработчик прерывания

call SetPS2MouseInterrupt

; Цикл, пока не нажата левая кнопка

@@Next: test [ButtonsStatus],lb jz №Next

jmp short

@@End

; ЗАВЕРШЕНИЕ РАБОТЫ ПРОГРАММ!

; Восстановить прежний обработчик прерывания

@@End: call RestoreddPS2MouseInterrupt : Переустановить текстовый режим и очистить экран

mov АХ.З int 10h

; Выход в DOS

mov AH.4Ch int 21h

: Обработка ошибок PPDatalnputError:

MFatalError Errl ENDP PS2MouseStart

proc PS2MouseInterrupt far

sti;разрешить маскируемые прерывания pusha

pushDS

movAX,[CS:Mai nDataSeg]

movDS,AX

callWait8042BufferEmpty юнистка буфера

inAL.60h:получить скан-код

; Выбирать порядковый нонер принимаемого байта cmp [MouseByteNumber],О

je

@@SaveFirstByte cmp [MouseByteNumber].1

je

@@SaveSecondByte cmp [MouseByteNumber],2

je

@@SaveThirdByte jmp

@@Error : Записать первый байт посылки

@@SaveFirstByte:

test AL.1000b :первый байт посылки? jz

@@Error :сбой синхронизации

mov [FirstByte],AL

inc [MouseByteNumber] jmp

@@EndMouseInterrupt : Записать второй байт посылки

@@SaveSecondByte:

mov [SecondByte],AL

inc [MouseByteNumber] jmp

@@EndMouseInterrupt : Записать третий байт посылки

@@SaveThirdByte:

mov [ThirdByte],AL

mov [MouseByteNumber].0

; (пакет данных от ныти принят полностью)

; Записать новое значение байта состояния кнопок

mov AL.[FirstByte] and AL.0111b

mov [ButtonsStatus].AL

; Вычислить новую Х-координату курсора

; Занести в АХ перемещение по X

mov АН,0 ;дублируем знак во все разряды АН

mov AL,[FirstByte] test AL,10000b jz

@@M0

mov AH.OFFh : Занести в AL младший байт

@@M0:

mov AL.[SecondByte]

: Вычислить новое значение координаты : курсора по X

Листинг 5.5 (продолжение)

addАХ,[XCoordinate] "

cmpАХ.О

jge@@М1

movАХ,О

jmp short (Э@М2

@@М1: cmpAX.ScreenLength

jl@@М2

movАХ.ScreenLength-1

Ш2: mov[XCoordinate], АХ

; Вычисляем новую Y-координату курсора

; Занести в АХ перемещение по Y

mov АН,0 :дублируем знак во все разряды АН

mov AL,[FirstByte] test AL,100000b jz

@@M3

mov AH.OFFh

; Занести в AL младший байт ШЗ:

mov AL, [ThirdByte]

: Вычислить новое значение координаты курсора

; по Y (Y-координата мыши PS/2 направлена : противоположно экранной) neg АХ

add АХ,[YCoordinate] cmp АХ,0 jge

@@М4

mov АХ,0

jmp short (?@М5

@@М4: cmp AX.ScreenWidth jl

@@М5

mov AX,ScreeriWidth-l

@@M5:

mov [YCoordinate],AX

; Показать курсор в новой позиции

call ShowNewMouseCursorPosition

jmp short

@@EndMouseInterrupt

; Обнаружен сбой в порядке передачи информации от мыши

@@Error:

mov [MouseByteNumber].0

; Нориальное завершение прерывания,

@@EndMouseInterrupt: cli

; разрешение прерываний с меньшими приоритетами

mov AL.20h

out OAOh.AL ;команда EOI в i8059-2 out 20h,AL ;команда EOI в i8059-l pop DS

popa iret

endp PS2MouseInterrupt

* УСТАНОВИТЬ НОВЫЙ BEKTDP ПРЕРЫВАНИЯ МЫШИ *

PROC SetPS2MouseInterrupt NEAR pusha

push ES

mov AX.O

mov ES.AX

; Запомнить прежний вектор обработчика

; прерывания мыши

mov AX.[ES:74h*4]

mov [DldPS2MouseInterruptDffset],AX

mov AX,[ES:74h*4+2]

mov [DldPS2MouseInterruptSegment],AX

; Установка нового вектора прерывания cli запретить прерывания

mov АХ,offset PS2MouseInterrupt

mov [ES:74h*4].AX

mov AX.CS

mov [ES:74h*4+2],AX sti разрешить прерывания : Размаскировать прерывание IRQ12 in AL.OAlh and AL,11101111b

jmp short $+2 ;задержка

jmp short $+2 ;задержка out OAlh.AL pop ES popa ret

ENDP SetPS2MouseInterrupt

* ВОССТАНОВИТЬ СТАРЫЙ BEKTDP ПРЕРЫВАНИЯ МЫШИ *

• А А А1 А А’А’А’^ЛЛ A A A A AA’A’AA A A’ A A A’A1 А’ ‘А’ А’ А А А1 А к A"A"A"A А Л ‘Л1 Л А Л A A A1

PROC Restore01dPS2MouseInterrupt NEAR pusha push ES

mov AX.O

mov ES.AX

; Восстановить прежний вектор обработчика прерывания cli

mov АХ,[01dPS2MouseInterruptDffset]

mov [ES:74h*4],AX

mov AX,[01dPS2MouseInterruptSegment]

mov [ES:74h*4+2],AX

Листинг 5.5(продолжение) sti

pop ES

рора

ret

ENDP Restored!dPS2MouseInterrupt

;* ОТОБРАЖЕНИЕ КУРСОРА МЫШИ ПУТЕМ ИНВЕРСИИ * ;* АТРИБУТА СИМВОЛА В ПОЗИЦИИ КУРСОРА *

PROC ShowNewMouseCursorPosition NEAR pus ha

push ES

; Настроить ES на текстовый буфер

mov AX.OBBOOh

mov ES.AX

; Вычислить адрес предыдущей позиции курсора мыши

mov АХ,[01dYCoordi nate]

mov DX,160 mul DX

add AX.[01dXCoordi nate]

add AX.[01dXCoordinate]

inc AX

: Занести смещение в индексный регистр

mov DI,АХ

: Восстановить исходный атрибут символа

mov AL,[01dCharBackground]

mov [ES:DI],AL

; Вычислить адрес новой позиции курсора мыши

mov AX.[YCoordinate]

mov DX,160 mul DX

add AX,[XCoordinate]

add AX,[XCoordinate]

inc AX

; Занести смещение в индексный регистр

mov DI.АХ

: Сохранить значение атрибута символа

mov AL.[ES:DI]

mov [01dCharBackground],AL

: Инвертировать атрибут символа (кроме

: старшего разряда)

xor [byte ptr ES:DI].1111111b

; Запомнить координаты курсора

mov AX,[XCoordinate]

mov [01 dXCoordi nate] ,AX

mov AX. [YCoordi nate]

mov [01dYCoordinate],AX

pop ES popa

ENDP ShowNewMouseCursorPosition ENDS

: Подключить процедуры вывода данных на экран

Include "listl_02.inc"

; Подключить процедуры очистки выходного буфера : контроллера клавиатуры и ожидания поступления : данных от мыши

Include "list5_03.inc"

END

ПРИМЕЧАНИЕ

Для успешного запуска примеров из листингов 5.4 и 5.5 необходимо, чтобы к компьютеру была подключена мышь PS/2-типа. Кроме того, в BIOS SETUP должно быть разрешено использование мыши PS/2 и за мышью должно быть закреплено прерывание IRQ12.

Источник: Кулаков В. К90 Программирование на аппаратном уровне: специальный справочник (+дискета). 2-е издание. — СПб.: Питер, 2003. — 847 е.: ил.

По теме:

  • Комментарии