JUMPS
LOCALS @@
.model tiny
; размеры экрана в пикселях
SCR_WIDTH EQU 320
SCR_HEIGHT EQU 200
; размеры допустимой области в центре экрана
RC_WIDTH EQU 80
RC_HEIGHT EQU 80
.code
org 100h
start:
mov ax,13h ; режим VGA 320x200, 256 цветов
int 10h
xor ax,ax ; инициализируем мышь
int 33h ; если AX=0FFFFh на выходе, то драйвер мыши установлен
inc ax
jnz @@exit
; закрашиваем прямоугольник RC_WIDTH x RC_HEIGHT в центре экрана для наглядности
; этот способ очень медленный, но скорость нам здесь несущественна
mov ax,0C01h ; поставить синюю точку
mov bh,0 ; видеостраница
mov dx,SCR_HEIGHT/2 - RC_HEIGHT/2
@@next_line:
mov cx,SCR_WIDTH/2 - RC_WIDTH/2
@@next_pixel:
int 10h
inc cx
; Такое вычисление: SCR_WIDTH/2 - RC_WIDTH/2 + RC_WIDTH
; вместо SCR_WIDTH/2 + RC_WIDTH/2
; связано с тем, что, в общем случае, ширина (высота) может быть нечетной.
; В данном случае (ширина и высота четные), эти выражения дают одинаковый результат.
cmp cx,SCR_WIDTH/2 - RC_WIDTH/2 + RC_WIDTH
jb @@next_pixel
inc dx
cmp dx,SCR_HEIGHT/2 - RC_HEIGHT/2 + RC_HEIGHT
jb @@next_line
; ----- конец закраски прямоугольника
mov ax,0Ch ; 000Ch - устанавливаем обработчик событий от мыши
mov cx,1 ; отслеживаем только движение мыши
mov dx,offset mouse_handler
int 33h
mov al,1 ; ax=1 - показываем курсор мыши
int 33h
call mouse_move_to_center
xor ax,ax
int 16h
mov ax,0Ch
xor cx,cx ; сбрасываем обработчик мыши
int 33h
@@exit:
mov ax,3 ; восстанавливаем текстовый режим 80x25
int 10h
int 20h ; выходим из программы
mouse_handler PROC FAR
; CX - горизонтальная позиция
; DX - вертикальная позиция
; нам не нужно сохранять/восстанавливать регистры, т.к. за нас это делает драйвер
shr cx,1 ; в режиме 320x200 X-координата мыши удвоена
cmp cx,SCR_WIDTH/2 - RC_WIDTH/2
jb @@move
cmp cx,SCR_WIDTH/2 - RC_WIDTH/2 + RC_WIDTH
jae @@move
cmp dx,SCR_HEIGHT/2 - RC_HEIGHT/2
jb @@move
cmp dx,SCR_HEIGHT/2 - RC_HEIGHT/2 + RC_HEIGHT
jb @@exit
@@move:
call mouse_move_to_center
@@exit:
ret
mouse_handler ENDP
mouse_move_to_center PROC
mov ax,4
mov cx,SCR_WIDTH ; в режиме 320x200 X-координата мыши удвоена
mov dx,SCR_HEIGHT/2
int 33h
ret
mouse_move_to_center ENDP
end start
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.