Удобства, которые предоставляет пользователям компьютеров манипулятор «мышь», трудно переоценить, но… Ведь даже само наше Солнце не без пятен, что уж говорить о созданном «в незапамятные времена» MOUSE. СОМ-драйвере!
По мере приобретения опыта многие пользователи компьютеров ЕС1840 или ЕС1841 начинают предъявлять к «мышке» повышенные требования. В частности, к недостаточно высокой скорости перемещения курсора. А обоснованность своих все возрастающих претензий подтверждают наглядным примером: для перемещения курсора в Norton Commander через весь экран приходится «отвоевывать» на рабочем столе много места. Что же, все это верно. Как, впрочем, справедливо и другое. Чувствительность у «мышки» можно, оказывается, изменить, воспользовавшись (см. Касаткин А. И. Системное программирование. Минск, Высшая школа, 1993, с. 195.) функцией:
AX=000Fh.
Драйвер MOUSE.COM создает при загрузке прерывание 33h.
Функция 0Fh данного прерывания как раз и позволяет устанавливать желаемую чувствительность драйвера. Необходимо лишь в регистр АХ занести 0Fh, в СХ — чувствительность «мышки» по горизонтали, а в DX — чувствительность по вертикали. Вдобавок после загрузки MOUSE.COM в регистры СХ и DX заносится какое-либо целое число. Причем чем меньшее число (а минимальное здесь может быть равно 1) содержится в этих двух регистрах, тем больше у «мышки» чувствительность.
Сказанное выше иллюстрируется программой:
.MODEL TINY
.CODE
ORG 100H
Begin:
mov ax,0Fh
mov cx,1
mov dx,1
int 33h
end Begin.
Следует, однако, отметить, что такая программа изменяет чувствительность «мышки» только на время ее работы.
Предлагаемая читателям-пользователям ЕС1840 (ЕС1841) программа перехватывает прерывание 1Ch (пользовательский таймер) и остается резидентной. Как показала практика, она с успехом работает в Norton Commander и других программах, поддерживающих работу с «мышкой».
A mouse.asm Copyright 1995 by AYP | |||
.MODEL TINY | |||
.СОDЕ | |||
ORG 100H | |||
begin | |||
jmp init | ;Перейти на начало ;инициализации ;резидентной части | ||
int 1 ch proc far | ;Процедура обработ ;ки прерывания 1 Ch | ||
push ax | ;Сохранить рабочие ;регистры в стеке | ||
push bx | |||
push cx | |||
push dx | |||
push di | |||
push si | |||
push bp | |||
mov ax.000Fh | ;Изменить чувстви- ;тельность мыши | ||
mov cx,1 | ;на максимальную | ||
mov dx,1 | |||
int 33h | ;Установить чувстви- ;тельность | ||
pop bp | ;Восстановить ра- ;бочие регистры | ||
pop si | |||
pop di | |||
pop dx | |||
pop cx | |||
pop bx | |||
mov a1,20h | ;Необходимое ;действие для вы- ;хода из | ||
out 20h,a1 | ;обработчика пре- ;рывания | ||
pop ax iret | |||
int 1 сhendp | |||
init | ;Инициализация ;резидентной части | ||
mov ah,09 | ;Напечатать заго- ;ловок программы | ||
lea | dx.cop | ||
int | 21h | ||
mov ах,0 | ;Инициализация ;мыши | ||
int | 33h | ||
cmp ах,0 | ;Мышь присутствует? | ||
jne resid | ;Да — продолжить | ||
mov ah,09 | ;Нет — выдать сооб- ;щение | ||
lea | dx.mess | ||
int | 21 h | ||
ret | ;и выйти | ||
mess | db | ’Нет мыши!!!’ ,10,13,’$’ | |
resid | |||
cli | ;3апрет преры- ;ваний | ||
mov dx,offset int 1 ch | |||
mov ax,251 Ch | ;Изменить вектор ;прерывания 1 Ch | ||
int | 21 h | ||
sti | ;Разрешить пре- ;рывания | ||
mov dx, off set init | |||
int 27h | ;Завершить про- ;грамму и остаться ;резидентной | ||
cop | db | ’AMOUSE-драйвер ’чувствительности мыши.’ 10,13 | |
db db db db | ’Copyright 1995 by’,10,13 ’ Assotiation’, 10,13 ’Young’,10,13 ’ ’Programmers’, 10,13,’$’ | ||
end | begin |
При загрузке программы происходит инициализация «мышки» и проверка ее присутствия. Если «мышка», как говорится, налицо, программа, завершая свое выполнение, остается резидентной. Более того, часть резидентной программы сначала сохраняет рабочие регистры в стеке, чтобы не нарушать работу компьютера. А затем изменяет чувствительность «мышки» и восстанавливает рабочие регистры.
Текст программы, написанный на языке Турбо-Ассемблер, приводится.
В.КОВАЛЕНКО,
г. Минск