c - 鼠标初始化后如何从端口 60h 提取 3 或 4 字节鼠标数据包

标签 c assembly x86 nasm

鼠标初始化后,鼠标会发送 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/

相关文章:

c++ - Win32编程隐藏控制台窗口

c - 为什么这个 x86_64 汇编代码不起作用?

linux - 从 x86 函数(x87 的 flds/fstps)返回时,信号 NaN 被破坏

assembly - ESP寄存器和SS寄存器有什么区别?

android - Android 上 native 代码中的音频捕获/渲染

c++ - 为什么两个几乎相同的实现有很大的执行时间差异?

php - OpenLDAP ldap_get_option() 响应

c - 如何理解tiny c函数的汇编结果?

c - 如何监控程序调用的cpu指令

c - 为什么 64 位 Windows 上原生 long 原语的大小只有 4 个字节?