如何在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字节为一组发送数据,数据包格式如下:
- 状态字节:位0=左键按下,位1=右键按下,位2=中键按下(部分老式鼠标无),位3=Y轴溢出,位4=X轴溢出,位5=Y轴方向(1为负方向),位6=X轴方向(1为负方向),位7=固定为1(标记帧起始)
- X位移字节:0-255的无符号值,结合状态字节的位6计算实际位移(位6为1时,位移=字节值-256)
- 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
相关产品推荐
相关产品推荐

