但不使用鼠标驱动程序:对于 PS2 鼠标(以及在主板 bios 中启用 USB lagacy 的 USB 鼠标),我喜欢使用 bios 中断 15h AX=0C20?h 来使用 irq像 Cutemouse 这样的处理程序,但没有用它构建 TSR。
但是这个IRQhandler(在下面的例子中)需要稍微修改一下,所以我们必须添加一些指令来将鼠标值存储到一个已知的ram位置,这样我们的主程序就可以获取鼠标移动和鼠标来自该位置的点击次数。
另外,我们的主程序必须将鼠标指针绘制到帧缓冲区本身,所以我们必须根据我们使用的视频模式(4、8、15、16、24或32)来计算位置的地址每个像素的位数和扫描线的长度以及颜色字段 RGB 或 BGR 的位置。
使用自己的 PS2 鼠标处理程序的示例(不绘制鼠标指针):
; main routine
call CHECKPS2
jc NOMOUSE
call PS2ON
jc NOMOUSE
; -------------------
; place your code here
; -------------------
call PS2OFF
mov ax, 0C201h ; Reset PS2
int 15h
NOMOUSE:
; -------------------
; sub routines
; -------------------
checkPS2:
int 11h ; get equipment list
test al, 3
jz noPS2 ; jump if PS/2-Mouse not indicated
mov bh,3
mov ax, 0C205h
int 15h ; initialize mouse, bh=datasize
jc noPS2
mov bh,3
mov ax, 0C203h
int 15h ; set mouse resolution bh
jc noPS2
mov ax, cs
mov es, ax
mov bx, OFFSET PS2dummy
mov ax, 0C207h
int 15h ; mouse, es:bx=ptr to handler
jc noPS2
xor bx, bx
mov es, bx ; mouse, es:bx=ptr to handler
mov ax, 0C207h
int 15h
ret
noPS2:
stc
ret
PS2dummy:
retf
;---------------------------------------------------------
enablePS2:
call disablePS2
mov ax, cs
mov es, ax
mov bx, OFFSET IRQhandler
mov ax, 0C207h ; es:bx=ptr to handler
int 15h
mov bh,1 ; set mouse on
mov ax, 0C200h
int 15h
ret
;-------------------------------
disablePS2:
xor bx, bx ; set mouse off
mov ax, 0C200h
int 15h
xor bx, bx
mov es, bx
mov ax, 0C207h ; es:bx=ptr to handler
int 15h
ret
;---------------------------------------------------------------------------
IRQhandler:
assume ds:nothing,es:nothing
cld
push ds
push es
pusha
mov ax, cs
mov ds, ax
mov bp,sp
mov al,[bp+24+6] ; buttons
mov bl,al
shl al,3 ; CF=Y sign bit
sbb ch,ch ; signed extension 9->16 bit
cbw ; extend X sign bit
mov al,[bp+24+4] ; AX=X movement
mov cl,[bp+24+2] ; CX=Y movement
xchg bx,ax
neg cx ; reverse Y movement
popa
pop es
pop ds
retf