📄 pcmouse.asm
字号:
;FILENAME:PCMOUSE.ASM
;内容: 操纵鼠标,显示坐标
STACK SEGMENT
DB 64 DUP (?)
STACK ENDS
DATA SEGMENT
LEN_DATA EQU 34 ;显示长度
XCOORD DW 0 ;二进制的X坐标
YCOORD DW 0 ;二进制的Y坐标
ASCVAL DW ? ;ASCII域
DISPDATA LABEL BYTE ;屏幕显示域:
BEGMESG DB 'Mouse Position: ' ;
XMSG DB 'X =' ; X的信息
XASCII DW ? ; X的ASCII值
DB ' '
YMSG DB 'Y=' ; Y的信息
YASCII DW ? ; Y的ASCII值
DISPEND DB ' '
DATA ENDS
; .386
; ........................
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, ES:DATA,SS:STACK
A10MAIN PROC FAR
MOV AX, DATA ; 初始化DS和ES地址
MOV DS,AX
MOV ES,AX ;
CALL Q10CLEAR ; 清屏
CALL B10INITZ ; 初始化鼠标
CMP AX, 00 ; 已安裴鼠标?
JE A90 ; 否,迟出
A20: CALL C10POINTR ; 取鼠标指针
CMP BX,01 ; 按下健?
JE A80 ; 是,退出
MOV AX, XCOORD ; X转换为
CALL D10CONVRT ; ASCII
MOV AX, ASCVAL
MOV XASCII, AX
MOV AX, YCOORD ; Y转换为
CALL D10CONVRT ; ASCII
MOV AX, ASCVAL
MOV YASCII, AX ; 显示X和Y
CALL E10DISPLY ;
JMP A20 ; 重复
A80: MOV AX, 02H ; 请求隐蔽指针
INT 33H
A90: CALL Q10CLEAR ; 消屏
MOV AX, 4C00H ; 处理结束
INT 21H
A10MAIN ENDP
;======================
B10INITZ PROC NEAR ; 使用AX
MOV AX, 00H ; 请求初始化鼠标
INT 33H ;
CMP AX, 00 ; 鼠标已安装
JE B90 ; 否,退出
MOV AX, 01H ; 显示鼠标指针
INT 33H
B90: RET ; 返回调用程序
B10INITZ ENDP
;====================== 以下为获取鼠标指针位置:
C10POINTR PROC NEAR ; 使用AX,BX,CX,DX
C20: MOV AX, 03H ; 取指针位置
INT 33H ;
CMP BX, 00000001B ; 左键按下?
JE C90 ; 是,表示退出
; SHR CX, 03
PUSH AX ; 像素坐标除8
MOV AX,CX
MOV CL,3
SHR AX,CL
MOV CX,AX
; SHR DX, 03
PUSH CX
MOV AX,DX
MOV CL,3
SHR AX,CL
MOV DX,AX
POP CX
POP AX
CMP CX, XCOORD ; 指针位置
JNE C30 ; 改变?
CMP DX, YCOORD ;
JE C20 ;
C30: MOV XCOORD, CX ; 否,重复操作
MOV YCOORD, DX ; 是,保存新位置
C90: RET ; 返回调用程序
C10POINTR ENDP
;====================== 以下为二进制的X或Y位置转换为ASCII:
; AX已设置输入数据=二进制的X或Y
D10CONVRT PROC NEAR ; 使用CX,SI
MOV ASCVAL, 2020H ; 清除ASCII域
MOV CX, 10 ; 设置除数
LEA SI, ASCVAL+ 1 ; 装入ASCVAL地址
CMP AX, CX ; 位置与10比较
JB D20 ; 低于10,跳转
DIV CL ; 高于10,除以10
OR AH, 30H ; 转换成ASCII
MOV [SI], AH ; 存入最右边字节
DEC SI ; ASCVAL地址减1
D20: OR AL, 30H ; 变为ASCII
MOV [SI] ,AL ; 存入最左边字节
RET ; 返回调用程序
D10CONVRT ENDP
;================ ; 显示X,Y位置
E10DISPLY PROC NEAR ; 使用AX,BX,BP,CX,DX
MOV AX,1300H ; 请求显示
MOV BX,0031H ; 页:属性
LEA BP,DISPDATA ; 串地址
MOV CX,LEN_DATA ; 字符数
MOV DX,0018H ; 屏幕行:列
INT 10H ;
RET ; 返回调用程序
E10DISPLY ENDP
;================ 清屏,设置属性
Q10CLEAR PROC NEAR ; 使用AX,BX,BP,CX,DX
MOV AX,0600H ; 请求清屏
MOV BH, 30H ; 颜色
MOV CX,00 ; 全屏
MOV DX,184FH
INT 10H
RET ; 返回调用程序
Q10CLEAR ENDP
CODE ENDS
END A10MAIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -