通过程序集x86访问鼠标

时间:2014-04-13 14:07:48

标签: assembly dos bios

我在DOS模拟器(dosbox)上使用assembly-x86。 我想在视频模式下使用图形鼠标,但我无法找到访问它的方法,以便找到它的位置并对点击做出反应。

我找到了几个使用int 33h的例子,但他们对代码没有正确的解释。

我可以使用哪种中断或端口来访问它,我在哪里可以找到其所有功能的文档?

1 个答案:

答案 0 :(得分:1)

但是没有使用鼠标驱动程序:对于PS2鼠标(以及主板BIOS中具有USB延迟启用的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