6809汇编初学者自制单板机6850 ACIA串口发字符串Bug排查
6809单板机字符串打印故障排查
故障现象
- 已搭建简易6809单板机,可正常运行基础程序,包括基于6850 ACIA的串口回显功能
- 实现ROM存储字符串的串口打印功能时出现异常:待发送字符串以null为结束标记,经逻辑分析仪观测,ACIA未收到有效输出,CPU读取到的首个字符即为0,直接触发字符串结束判定
- 预设代码逻辑:加载X寄存器指向字符串起始地址→读取X指向字符到A寄存器同时自增X→字符非空则输出到ACIA
现有汇编代码
*******************************EQUATES**************************************** ; ACIA寄存器定义 ACIA_control EQU $A000 ; 只写 ACIA_status EQU $A000 ; 只读 ACIA_data EQU $A001 ; 读写 ********************************STRING CONSTANT****************************** ORG $C000 ; ROM起始地址 ; FCN伪指令按顺序存储字符串字节,自动追加null结束符 start_of_string FCN "The quick brown fox jumps over the lazy dog" **********************************SETUP**************************************** setup ; 复位ACIA LDA #%00000011 STA ACIA_control ; 设置ACIA模式:4.9152MHz晶振64分频得到19200波特率,8数据位、1停止位、无校验,TX/RX中断禁用 LDA #%01010110 STA ACIA_control *********************************SEND LOOP************************************** reset_index_register LDX start_of_string ; 等待ACIA发送缓冲区为空 wait LDA #%00000010 ANDA ACIA_status BEQ wait ; 读取字符并自增X LDA ,X+ BEQ end_of_string ; 检测到null则结束发送 STA ACIA_data BRA wait end_of_string BRA reset_index_register *********************************VECTORS**************************************** ORG $FFFE FDB setup ; 复位向量指向程序入口
故障成因
该问题为6809汇编初学者高频的寻址方式错误:
- 6809汇编规则中,立即数寻址必须加
#前缀,否则指令为扩展内存寻址模式。当前代码中LDX start_of_string未加#,实际含义为读取start_of_string地址(即$C000)处的2字节内存值,作为X寄存器的初始值,而非将start_of_string本身的地址加载到X。 - 按照该逻辑,X寄存器的实际初始值为
($C000) << 8 | ($C001),也就是字符串前两个字符的ASCII码拼接值$5468,完全偏离预设的字符串起始地址$C000。 - 后续读取
$5468地址内容时,该地址为未使用的随机内存区域,上电初始值为0,因此直接触发null结束判定,ACIA不会收到任何输出。
修正方案
在加载字符串地址的LDX指令前添加#前缀,指定立即数寻址:
reset_index_register LDX #start_of_string
内容的提问来源于stack exchange,提问作者DaveyCrockett
相关产品推荐
相关产品推荐

