
- •Зміст роботи
- •Довідкові дані.
- •Управління режимами роботи вiдеоконтролера
- •Робота з мишкою
- •Int 33h ; регістрація адреси та умов виклику
- •Вимоги до процедури обробки подій:
- •Вимоги до основної програми.
- •Int 21h ; виклик функції dos
- •Завдання на лабораторну роботу згідно з таблицею 1.
- •Питання для перевірки
Int 33h ; регістрація адреси та умов виклику
pop es
Після задання функції 0сh виникає якісно нова ситуація - процедура prmaus буде викликатись не залежно від основної програми. Виклик процедури prmaus буде виконувати драйвер мишки і тільки в випадку виникнення вибраної події (в нашому прикладі при любому переміщенню мишки або при натисканні правої кнопки мишки). Таким чином досягається ефект незалежної і "одночасної" роботи двох програм - основної програми і процедури . При цьому процедура користувача (prmaus) буде викликатись драйвером мишки коли користувач за ПЕОМ виконає вручну відповідні дії з мишкою ( в нашому прикладі коли користувач перемістить мишку по коврику або натисне праву кнопку)
Вимоги до процедури обробки подій:
Процедура повинна бути типу far
В процедурі необхідно зберегти в стеку вміст регістрів ,що використовуються, з наступним відновленням вмісту регістрів перед поверненням
В процедурі необхідно встановити свої значення сегментних регістрів для даних оскільки драйвер мишки "не знає" з якими сегментами працює програма користувача
Приклад організації процедури prmaus
prmaus proc far
; збереження вмісту регістрів ds, es та РЗП
push ds
push es
pusha
;завантаження сегментних регістрів ds та es
push 0b800h ; сегментна адреса відеобуфера
pop es
push _data ;
pop ds
;основне тіло процедури:
;
popa
pop es
pop ds
ret
prmaus endp
Драйвер мишки передає процедурі обробки подій наступні параметри:
ax - умова виклику
bx - стан кнопок мишки:
біт 0 = 1 натиснута ліва кнопка
біт 1 = 1 натиснута права кнопка
біт 2 = 1 натиснута середня кнопка
сх - х - координата (по горизонталі екрану) курсору в пікселях (стовпчики)
dx - y - координата (по вертикалі) курсору в пікселях (рядки)
(щоб отримати координати в символах необхідно розділити вміст cx і dx на 8)
Вимоги до основної програми.
Основна програма виконує свій алгоритм і може синхронізувати свою роботу з процедурою обробки подій від мишки через спільні змінні. Розглянемо наступні приклади.
Приклад 1.
Одним із найпростіших алгоритмів основної програми є очікування введення довільного символу з клавіатури ПЕОМ з наступним закінченням роботи програми.
mov ah, 01h ; ввести символ з клавіатури ПЕОМ
Int 21h ; виклик функції dos
jmp exit
Приклад 2.
Основна програма в безкінечному циклі виводить на екран в десятковому форматі значення цілої змінної, яке постійно змінюється.
Структури даних програми користувача:
dvalue db 30 dup ('0',0fh) ;зарезервовано 30 десяткових розрядів змінної dvalue
;в розпакованому двійково-десятковому форматі
;з початковим значенням 0 та байтами атрибутів -
;білий колір цифри на чорному фоні
len dw 10 ;реальна кількість десяткових розрядів змінної dvalue
row dw 23 ;рядок екрану, де відображається змінна
col dw 40 ;початкова позиція (старший розряд) відображення
; dvalue в рядку
valadd db 1 ;значення, яке додається до dvalue
cont db 0ffh ;ознака продовження роботи
Відображення значення змінної dvalue на екран (вважається, що необхідні адреси сегментів в регістри DS та ES записані):
@write: ; відображення dvalue
сli ; заборона переривань, щоб мишка "не мішала"
mov si,offset dvalue
mov al,byte ptr row ; обчислення Nrow 802 + Ncolumn 2
mov ah,0
imul ax,(80*2)
add ax,col
add ax,col ; завершення обчислення
mov di,ax
mov cx,len
cld
rep movsw ;виведення на екран
sti ;переривання дозволяються
Додавання до dvalue значення valadd в розпакованому двійково-десятковому форматі
@9: ; додавання чергового значення :
mov si,len
shl si,1
sub si,2 ;визначення адреси молодшої цифри dvalue
mov ah,0 ;початкове значення перенесення в старший
;десятковий розряд
mov al, dvalue[si]
add al,valadd
aaa ;корекція при додаванні розпакованих
;двійково-десяткових чисел
or al,30h ;формування коду ASCII десяткової цифри
mov dvalue[si],al
@10:
dec si
dec si
mov al,ah
mov ah,0
add al,dvalue[si] ;додавання перенесення
aaa
or al,30h
mov dvalue[si],al
cmp si,0
jnz @10
mov al,cont ;аналіз ознаки продовження роботи програми
cmp al,0ffh
je @write
jmp exit
Таким чином, використовуючи доступ до даних основної програми, процедура обробки подій від мишки може "на льоту" читати та змінювати ці дані, створюючи різноманітні ефекти на екрані. Однією із таких змін повинна бути зміна значення змінної cont для забезпечення завершення роботи програми.
При завершенні програми перед поверненням в DOS необхідно повторити виклик функції драйвера мишки 0ch, але зі значенням cx=0. Завдяки цьому драйвер мишки припинить виклики процедури prmaus:
exit:
xor cx,cx ;cx=0
mov ax,0ch
;вважаємо що регістри es:dx містять логічну адресу процедури prmaus
int 33h ;процедура prmaus
;далі викликатись не буде
УВАГА. Якщо основна програма передасть управління DOS без виконання цієї послідовності команд, то драйвер мишки може продовжувати виклик процедури prmaus. В свою чергу DOS може записати на місце процедури prmaus якусь другу програму, що може привести до не передбачуваних наслідків, включаючи знищення файлів на дисках.