【问题标题】:Accessing the mouse via assembly x86通过程序集 x86 访问鼠标
【发布时间】:2014-04-13 14:07:47
【问题描述】:

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

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

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

【问题讨论】:

  • 有一些关于 int 33h 的文档:stanislavs.org/helppc/int_33.htmlcomputing.dcu.ie/~ray/teaching/CA296/notes/ca296-mouse.pdf 您使用的视频模式是什么?
  • 相关中断函数应该在ctyme.com/intr/int-33.htm描述
  • 你应该知道 MS-DOS 本身并不知道中断 33h。您必须在 MS-DOS 系统上安装鼠标驱动程序才能使用该中断。请记住,您的 DOS 模拟器可能不支持该中断。有关文档,请参阅 Michael 评论中的链接。
  • 除了上面引用的 Ralph Brown 的中断列表之外,PC 游戏程序员百科全书可能包含有用的信息。

标签: assembly dos bios


【解决方案1】:

但不使用鼠标驱动程序:对于 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

【讨论】:

    猜你喜欢
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2023-03-23
    • 1970-01-01
    • 2011-05-08
    相关资源
    最近更新 更多