我正在写一个操作系统在NASM汇编和我有一个问题,使鼠标处理程序(指向设备BIOS接口处理程序)。我曾试图搜索互联网上如何做到这一点,但我没有成功。
下面是设置这些内容的代码:
call checkPS2 ;PS2 routines
jc NOMOUSE
call enablePS2
jc NOMOUSE
以下是PS2的功能:
;PS2 mouse routines
NOMOUSE:
;Prompt error
ret
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, 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, 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
调用这些函数的循环:
mov ax, 0xc209 ;Reads from the mouse
int 15h ;-||-
mov dl, bl ;first byte(bl)
mov bl, 02h ;Color Green
call printhex ;prints dl in hex
mov ax, 0xc209 ;Reads from the mouse
int 15h ;-||-
mov dl, cl ;second byte(bl)
mov bl, 02h ;Color Green
call printhex ;prints dl in hex
mov ax, 0xc209 ;Reads from the mouse
int 15h ;-||-
mov bl, 02h ;Color Green
call printhex ;prints dl(3rd byte read)
我注意到的第一件事是屏幕上有无数的白色像素只是随机出现的。
代码应该只给予鼠标的位置,而鼠标光标应该保持隐藏。我已经测试了我的printhex
函数,我知道它工作,我看到的数字是:
0x02
0x00
0x00
当我移动鼠标时,所有的值都没有改变。我的配置是带有PS/2鼠标的VirtualBox。
1条答案
按热度按时间kognpnkq1#
您没有提供一个完整的示例,但是我终于有时间来研究这个问题。主要问题之一是Int 15h/AX=0C209h是一个可选特性。
注意:IBM将此功能归类为可选功能
我发现在很多模拟器上(QEMU,BOCHs,VirtualBox)这个BIOS函数似乎没有实现。调用它不会产生你要找的数据。你可以使用鼠标处理程序读取X和Y移动和状态字节,并更新你的主例程可以轮询的全局变量。你的鼠标处理程序
IRQhandler
实际上不是IRQ处理程序,而是BIOS鼠标中断处理程序将调用的FAR函数。在该处理程序中有一些现有代码,用于检索X和Y移动,但不对其做任何操作。如果您维护X和Y的两个全局变量,并将移动值添加到它们中,则可以维护主循环可以查询的绝对坐标。也可以创建一个全局变量来存储读取的状态字节。使用您的代码作为模板,我生成了这个简单的引导装载程序来测试这个代码。引导装载程序包含一个BIOS Parameter Block,以防您打算在真实的的硬件上从USB using Floppy Disk Emulation引导。如果不需要它,它可以被删除。我还提供了一些例程来显示十六进制的无符号字节和字。视频模式可以调整,但我使用模式13h(320x200x256)作为默认值:
英国石油公司:
** Boot .asm**:
代码可以通过以下方式构建到磁盘映像中:
我提供这段代码是因为我不知道为什么你的代码偶尔会显示不需要的像素。这类问题可能与你没有提供的代码有关。当在VirtualBox中运行时,它应该看起来像这样: