You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在x86汇编中对接串口鼠标?适配PCem/86Box问题

串口鼠标(Serial Mouse)在x86汇编中的交互方法

原文章的代码针对的是PS/2鼠标,而PCem/86Box中你选择的是串口鼠标,两者硬件接口、通信协议完全不同,所以无法直接兼容。以下是串口鼠标的具体交互实现思路:

一、串口初始化(以COM1端口0x3F8为例)

串口鼠标默认遵循微软标准协议,需要先配置串口参数为:波特率1200、7位数据位、1位停止位、偶校验。初始化步骤如下:

  • 开启除数锁存(DLAB):向0x3FB(COM1线控制寄存器)写入0x80
  • 设置波特率除数:向0x3F8(除数低位)写入0x60,向0x3F9(除数高位)写入0x00(对应1200波特率,由115200/1200=96计算而来)
  • 配置线格式并关闭DLAB:向0x3FB写入0x0E
  • 激活鼠标:向0x3FC(调制解调器控制寄存器)写入0x03(置位DTR和RTS信号)
  • 可选:若用中断驱动,向0x3F9(中断允许寄存器)写入0x01,允许接收数据中断;轮询方式可跳过此步

二、鼠标数据读取与解析

微软串口鼠标以3字节为一组发送数据,数据包格式如下:

  1. 状态字节:位0=左键按下,位1=右键按下,位2=中键按下(部分老式鼠标无),位3=Y轴溢出,位4=X轴溢出,位5=Y轴方向(1为负方向),位6=X轴方向(1为负方向),位7=固定为1(标记帧起始)
  2. X位移字节:0-255的无符号值,结合状态字节的位6计算实际位移(位6为1时,位移=字节值-256)
  3. Y位移字节:0-255的无符号值,结合状态字节的位5计算实际位移(位5为1时,位移=字节值-256)

读取方式分两种:

  • 轮询方式:循环检查0x3FD(线路状态寄存器)的位0(DR位,数据就绪),当该位置1时,依次读取3字节数据包
  • 中断驱动方式:需要配置8259 PIC,开启串口对应的中断(COM1对应IRQ4,COM2对应IRQ3),在中断服务程序中读取3字节数据

三、适配原代码的关键修改

  • 替换原PS/2鼠标的端口操作(如0x60、0x64端口)为串口对应的端口(COM1是0x3F80x3FF,COM2是0x2F80x2FF)
  • 删除PS/2鼠标的初始化逻辑(如发送0xF4命令启用鼠标),替换为上述串口初始化流程
  • 修改数据解析逻辑,将PS/2的3字节格式解析替换为串口鼠标的格式解析
  • 若使用中断,需修改中断向量号(PS/2鼠标对应IRQ12,串口对应IRQ3/4)

四、测试注意事项

  • 确保PCem/86Box中选中的串口鼠标对应的COM端口,与代码中配置的端口一致
  • 优先适配微软串口鼠标协议,这是PCem/86Box中串口鼠标的默认协议
  • 调试阶段优先使用轮询方式,逻辑更简单,排查问题更方便,稳定后再切换到中断驱动

内容的提问来源于stack exchange,提问作者robertapengelly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:40:16