Assembly 显示鼠标光标
我在DOSBox和Windows中使用TASM。我正在学习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模式下获取鼠标光标?这是
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的问题在于渲染光标,而不是获取其位置。