Код: Выделить всё
; mousedr.asm
;Рисует на экране прямые линии, оканчивающиеся в позициях, которые указываются мышью.
;
.model tiny
.code
org 100h ; COM-файл.
.186 ; Для команжы shr cx, 3.
start:
mov ax, 12h
int 10h ; Видеорежим 640*480.
mov ax, 0 ; Инициализировать мышь.
int 33h
mov ax, 1 ; Показать курсор мыши.
int 33h
mov ax, 000Ch ; Установить обработчик событий мыши.
mov cx, 0002h ; Событие - нажатие левой кнопки.
mov dx, offset handler ; ES :D X - адрес обработчика.
int 33h
mov ah, 0 ; Ожидание нажатия любой клавиши.
int 16h
mov ax, 000Ch
mov cx, 0000h ; Удалить обработчик событий мыши.
int 33h
mov ax, 3 ; Текстоый режим.
int 10h
ret ; Конец программы.
; Обработчик событий мыши: при первом нажатии выводит точку на экран,
; при каждом дальнейшем вызове проводит прямую линию от предыдущей
; точки к текущей.
handler:
push 0A000h
pop es ; ES - начало видеопамяти.
push cs
pop ds ; DS - сегмент кода и данных этой программы.
push cx ; CX (X-координата) и DX(Y-координата)
push dx ; потребуются в конце.
mov ax, 2 ; Спрятать курсор мыши перед выводом на экран.
int 33h
cmp word ptr previous_X, -1 ; Если это первый вызов,
je first_point ; только вывести точку.
call line_bresenham ; Иначе - провести прямую.
exit_handler:
pop dx ; Восстановить CX и DX
pop cx
mov previous_X, cx ; и запомнить их как предыдущие
mov previous_Y, dx ; координаты.
mov ax, 1 ; Показать курсор мыши.
int 33h
retf ; Выход из обработчика - команда RETF.
first_point:
call putpixel1b ; Вывод одной точки (при первом вызове).
jmp short exit_handler