Assembly 显示鼠标光标

Assembly 显示鼠标光标,assembly,graphics,mouse,tasm,dosbox,Assembly,Graphics,Mouse,Tasm,Dosbox,我在DOSBox和Windows中使用TASM。我正在学习int33h中断。在正常文本模式下,我能够正确获得鼠标位置 但是当我进入图形模式时 ; 800x600 - 256 colors mov ax, 04F02h mov bx, 0103h int 10h 鼠标位置固定在中心,即(320100),因为鼠标分辨率为640x200。当我进入图形模式时,即使鼠标在移动,鼠标光标在cx和dx寄存器中的位置也不会改变 [编辑]: 我认为这是VESA模式的问题。 如何在VESA模式下获取鼠标光标?这是

我在DOSBox和Windows中使用TASM。我正在学习
int33h
中断。在正常文本模式下,我能够正确获得鼠标位置

但是当我进入图形模式时

; 800x600 - 256 colors
mov ax, 04F02h
mov bx, 0103h
int 10h
鼠标位置固定在中心,即(320100),因为鼠标分辨率为640x200。当我进入图形模式时,即使鼠标在移动,鼠标光标在
cx
dx
寄存器中的位置也不会改变

[编辑]:
我认为这是VESA模式的问题。

如何在VESA模式下获取鼠标光标?

这是与“cutemouse驱动程序”分离的一部分,但仅适用于PS2或USB(旧版启用)鼠标,不带串行端口,也不需要绘制鼠标指针:

      call CHECKPS2
      jc  short ERROR
      call PS2ON
      jc  short ERROR

      mov     bx, [X]
      mov     cx, [Y]
      mov     dx, [S]


;-------------------------------
ERROR:    call PS2OFF



;---------------------------------------------------------------
;       Sub-Routine
;---------------------------------------------------------------
CHECKPS2: int 11h                 ; get equipment list
      test    al, 3
      jz  short NOPS2         ; jump if PS/2-Mouse not indicated
      mov     bh, 3
      mov     ax, 0C205h
      int 15h                 ; initialize mouse, bh=datasize
      jc  short NOPS2
      mov     bh, 3
      mov     ax, 0C203h
      int 15h                 ; set mouse resolution bh
      jc  short NOPS2
      mov     ax, cs
      mov     es, ax
      mov     bx, OFFSET PS2TEST
      mov     ax, 0C207h
      int 15h                 ; mouse, es:bx=ptr to handler
      jc  short NOPS2
      xor     bx, bx
      mov     es, bx          ; mouse, es:bx=ptr to handler
      mov     ax, 0C207h
      int 15h
      ret

NOPS2:    stc
      ret
;---------------------------------------------------------
PS2ON:    call PS2OFF
      mov    ax, cs
      mov    es, ax
      mov    bx, OFFSET PS2IRQ
      mov    ax, 0C207h       ; es:bx=ptr to handler
      int 15h
      jc  short NOPS2
      mov     bh, 1           ; set mouse on
      mov     ax, 0C200h
      int 15h
      ret
;-------------------------------
PS2OFF:   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
;---------------------------------------------------------------------------
; PS2-Mousehandler
;---------------------------------------------------------------------------
PS2IRQ:   cld
      push    ds
      pusha
      mov     ax, @DATA
      mov     ds, ax
      mov     bp, sp
      mov     ax, [bp+22+6]   ; buttons
      mov     bx, [bp+22+4]   ; X movement
      mov     cx, [bp+22+2]   ; Y movement
      mov     [S], ax
      mov     [X], bx
      mov     [Y], cx
      popa
      pop     ds
PS2TEST:  retf
;----------------------------------------------
.DATA
S      DW 0 ;Bitfields for pointing device status:
        ;Bit(s)  Description     (Table 00525)
        ; 15-8   reserved (0)
        ; 7      Y data overflowed
        ; 6      X data overflowed
        ; 5      Y data is negative
        ; 4      X data is negative
        ; 3      reserved (1)
        ; 2      middle button pressed
        ; 1      right button pressed
        ; 0      left button pressed
X      DW 0
Y      DW 0

我认为鼠标光标在这种模式下不起作用。我也尝试过使用光标遮罩,在模式13h下,它可以工作,但在这个模式下它也不工作。请提供帮助使用DOSBox提供的固件,[显示鼠标光标]功能在800x600模式下不起作用,但[返回位置和按钮状态]起作用。你的目标是什么?显示光标?我创建了一个打鼹鼠游戏,所有的图形都被创建了,剩下的唯一问题是鼹鼠的点击。我想做的是,当点击发生时,我得到点击的位置,然后做一些计算来知道我点击了什么。咔嗒声正在工作,而不仅仅是在正确的位置。我还想展示一下cursorUpdate:我已经用鼠标左键和右键完成了一些测试。当鼠标左键单击屏幕右侧时(鼠标分辨率x>=320),它会显示“左键单击”,但在屏幕左侧时(鼠标分辨率x<320),它不会打印任何内容。它不显示光标,但当我移动鼠标并单击时,它正在打印“左键单击”。所以,我知道我可以得到鼠标的位置,但是如何显示光标呢?有没有办法显示光标?请帮助使用函数Int33h/AX=0008和Int33h/AX=0009设置鼠标的范围。将其设置为800x600将大大简化逻辑。您必须手动绘制光标,保存光标下的区域并在其上绘制。当鼠标移动时,恢复该区域并重复。可能需要一些技巧来保持它的顺利进行。这并不能回答问题。OPs的问题在于渲染光标,而不是获取其位置。