鼠标初始化后,鼠标会发送 3 或 4 字节数据包来传达鼠标移动以及鼠标按钮按下/释放事件。这些数据包在 IO 端口 0x60
上异步显示为数据。
我的问题是如何提取那些 4 或 5 字节数据包
在我的汇编代码中,我使用 0xf4
鼠标命令来启用数据包流
我尝试使用此代码来提取 3 或 4 字节数据包,如下所示:
xor cx, cx
read:
in al, 0x64
test al, 1b
loopnz read
mov cx, 0xa0000 ; waiting 655 360 times
pause:
loop pause
in eax, 60h
mov [packets], eax
;and the values i get here is 250(0xfa) only
Jmp $
我在 Windows 10 下使用 NASM Assembler
最佳答案
现代 PS/2 鼠标通常具有默认模式(“2 个按钮,无滚轮”),该模式使用较旧的(每个数据包 3 个字节)协议(protocol);然后是一种或多种使用不同(每个数据包 4 字节)协议(protocol)的更好模式(“5 个按钮,带滚轮”)。要切换模式,有一系列现有命令(而不是简单的“更改模式”命令)。
具体来说,从默认模式更改为“Intellimouse Extensions”模式(3 个带滚轮的按钮,4 字节数据包):
- 设置采样率 200
- 设置采样率 100
- 设置采样率 80
并更改为“5按钮模式”(最多5个带滚轮的按钮,4字节数据包):
- 设置采样率 200
- 设置采样率 200
- 设置采样率 80
有关更多(更好)信息,请参阅:http://www.isdaman.com/alsos/hardware/mouse/ps2interface.htm
请注意,您永远不应该进行轮询。具体来说,除非您使用 IRQ(例如,第一个 PS/2 端口使用 ISA IRQ1,第二个 PS/2 端口使用 ISA IRQ 12),否则无法可靠地(没有竞争条件)确定一个字节来自哪个 PS/2 端口。
更具体地说,PS/2 Controller 驱动程序应使用 IRQ,并且应将“第一个 PS/2 端口”上收到的字节发送到正在使用的驱动程序,无论哪个设备恰好插入第一个 PS/2 端口(键盘、鼠标、条码扫描仪、触摸板……);并将“第 2 个 PS/2 端口”上收到的字节发送到恰好插入第 2 个 PS/2 端口的设备所使用的驱动程序。鼠标驱动程序本身将接收数据(例如,来自管道或消息或回调或谁知道什么)并将字节添加到(3或4字节)数据包缓冲区(同时检查“始终为0”位以确保它与设备保持同步,并同时处理“ACK”和“RESEND”等特殊代码)。
关于c - 鼠标初始化后如何从端口 60h 提取 3 或 4 字节鼠标数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54435293/