鼠标中断实例6-7

来源:互联网 发布:万网域名邮箱解析 编辑:程序博客网 时间:2024/05/16 06:05

 .model small, c
.486
.stack 128
.data
 oldaddr dd ?
 msg label byte
 xmsg db 'x=' ;显示方式:X=** Y=**
 xasc dw ?
  db ' '
 ymsg db 'y='
 yasc dw ?
 count equ $ - msg 
.code
 clsscr proc ;清除整个屏幕
  mov ax, 0600h
  mov bh, 30h
  mov cx, 0
  mov dx, 184fh
  int 10h
  ret
 clsscr endp

 ;把两位十进制数Data转换成字符串放入以首地址Desc开始的缓冲区之中
 btoasc proc uses ax cx di data:word, desc:ptr byte
  mov ax, data
  mov di, desc
  mov word ptr[di], 2020h ;赋两个空格
  mov cl, 10
  div cl
  or al, 30h
  mov [di], al
  inc di
  or ah, 30h
  mov [di], ah
  ret
 btoasc endp

 ;把当前鼠标位置(CX,DX)显示在屏幕右上角,该子程序在本程序被设置为鼠标移动事
 ;件的中断处理程序,所以,只要鼠标一移动,该子程序马上就被执行。
 disppos proc far
  shr cx, 3
  shr dx, 3
 invoke btoasc, cx, addr xasc
 invoke btoasc, dx, addr yasc
  mov ah, 02h
  mov bh, 0
  mov dx, 046h
  int 10h ;设置字符串的显示位置
  mov ah, 40h
  mov bx, 01h
  mov cx, count
  lea dx, msg
  int 21h ;显示鼠标位置的字符串
  ret
 disppos endp
.startup
 call clsscr
 mov ax, 00
 int 33h ;鼠标复位及取状态
 .if ax != 00
  mov ax, 01h
  int 33h ;显示鼠标指针
  mov ax, cs
  mov es, ax
  lea dx, disppos
  mov ax, 14h
  mov cx, 1 ;把子程序DispPos设置成鼠标
  int 33h ;移动事件的中断服务程序
  mov word ptr oldaddr, dx
  mov word ptr oldaddr + 2, es ;保存原移动事件处理程序的入口地址
  .repeat
   mov ax, 03h
   int 33h
  .until bx==1 ;按下鼠标左键
  mov ax, 02h
  int 33h ;隐藏鼠标指针
 .endif
 mov dx, word ptr oldaddr
 mov es, word ptr oldaddr + 2
 mov cx, 1
 mov ax, 0ch
 int 33h ;恢复原鼠标移动的中断服务程序
 call clsscr
.exit 0
end