SIC汇编程序输出异常排查:输出00 00 00而非预期时间格式
SIC汇编程序输出异常排查与修复
开发的SIC汇编程序在指定模拟器运行时,向设备64输出00 00 00,而非预期的时间格式。
程序原代码
CLOCK START 3072 T WORD 48500 D WORD 64 H RESW 1 M RESW 1 F RESW 1 P RESB 1 TMP RESB 1 A BYTE C'A' P2 BYTE C'P' LDA T AND #8000 STA F LDA T AND #7FFF DIV #3600 STA H STX TMP LDA TMP DIV #60 STA M STX TMP LDA F COMP #8000 JEQ P24 LDA H COMP #12 JLT AM SUB #12 STA H LDA P2 STA P J P12 AM LDA A STA P P12 LDA H COMP #10 JLT SH12 SUB #10 ADD #48 STA TMP LDCH TMP WD D LDA H ADD #48 LDCH 0 WD D J M12 SH12 LDA H ADD #48 LDCH 0 WD D M12 LDA M COMP #10 JLT SM12 SUB #10 ADD #48 STA TMP LDCH TMP WD D LDA M ADD #48 LDCH 0 WD D J PD SM12 LDA M ADD #48 LDCH 0 WD D PD LDA P LDCH 0 WD D RSUB P24 LDA H COMP #10 JLT SH24 SUB #10 ADD #48 STA TMP LDCH TMP WD D LDA H ADD #48 LDCH 0 WD D J M24 SH24 LDA H ADD #48 LDCH 0 WD D M24 LDA M COMP #10 JLT SM24 SUB #10 ADD #48 STA TMP LDCH TMP WD D LDA M ADD #48 LDCH 0 WD D RSUB SM24 LDA M ADD #48 LDCH 0 WD D RSUB END CLOCK
已尝试的排查措施
- 确保定时器值处理正确,按剩余秒数拆分小时和分钟
- 根据定时器值最高位选择12小时/24小时格式
- 使用
ADD #48将数值转换为正确ASCII值 - 用
LDCH加载字节后通过WD指令发送至设备
预期输出
- 12小时制:
01:28P(ASCII码:31 3A 30 31 3A 32 38 50) - 24小时制:
13:28(ASCII码:31 33 3A 32 38)
问题定位与修复说明
核心错误点
除法运算逻辑颠倒:
SIC的DIV指令执行后,商存入X寄存器,余数存入A寄存器。原代码错误地将X(商)存入TMP作为余数处理,A(余数)存入H作为小时数,导致时间计算完全错误,最终得到的小时/分钟均为0。LDCH指令操作数错误:
SIC的LDCH是从指定内存地址加载字节到A的低8位,原代码用LDCH 0读取地址0的内容(通常为0),而非转换后的ASCII值,直接导致输出全0。缺少格式元素:
原程序未处理冒号的输出,且单数字时间未补前导0,不符合预期格式。
修复后代码
CLOCK START 3072 T WORD 48500 D WORD 64 H RESW 1 M RESW 1 F RESW 1 P RESB 1 TMP RESB 1 A BYTE C'A' P2 BYTE C'P' COLON BYTE C':' ; 新增冒号存储单元 LDA T AND #8000 STA F LDA T AND #7FFF DIV #3600 STX H ; 修正:DIV后X是商(小时数),存入H STA TMP ; 修正:DIV后A是余数(剩余秒数),存入TMP LDA TMP DIV #60 STX M ; 修正:DIV后X是商(分钟数),存入M LDA F COMP #8000 JEQ P24 LDA H COMP #12 JLT AM SUB #12 STA H LDA P2 STA P J P12 AM LDA A STA P P12 LDA H COMP #10 JLT SH12 SUB #10 ADD #48 STA TMP LDCH TMP WD D LDA H ADD #48 STA TMP ; 新增:将ASCII值存入TMP LDCH TMP ; 修正:读取TMP而非地址0 WD D J COLON_OUTPUT ; 跳转输出冒号 SH12 LDA #48 ; 新增:补前导0 STA TMP LDCH TMP WD D LDA H ADD #48 STA TMP ; 新增:存入TMP LDCH TMP ; 修正:读取TMP WD D COLON_OUTPUT ; 新增:输出冒号 LDCH COLON WD D J M12 M12 LDA M COMP #10 JLT SM12 SUB #10 ADD #48 STA TMP LDCH TMP WD D LDA M ADD #48 STA TMP ; 新增:存入TMP LDCH TMP ; 修正:读取TMP WD D J PD SM12 LDA #48 ; 新增:补前导0 STA TMP LDCH TMP WD D LDA M ADD #48 STA TMP ; 新增:存入TMP LDCH TMP ; 修正:读取TMP WD D PD LDA P STA TMP ; 新增:存入TMP LDCH TMP ; 修正:读取TMP WD D RSUB P24 LDA H COMP #10 JLT SH24 SUB #10 ADD #48 STA TMP LDCH TMP WD D LDA H ADD #48 STA TMP ; 新增:存入TMP LDCH TMP ; 修正:读取TMP WD D J COLON_OUTPUT2 SH24 LDA #48 ; 新增:补前导0 STA TMP LDCH TMP WD D LDA H ADD #48 STA TMP ; 新增:存入TMP LDCH TMP ; 修正:读取TMP WD D COLON_OUTPUT2 ; 新增:输出冒号 LDCH COLON WD D J M24 M24 LDA M COMP #10 JLT SM24 SUB #10 ADD #48 STA TMP LDCH TMP WD D LDA M ADD #48 STA TMP ; 新增:存入TMP LDCH TMP ; 修正:读取TMP WD D RSUB SM24 LDA #48 ; 新增:补前导0 STA TMP LDCH TMP WD D LDA M ADD #48 STA TMP ; 新增:存入TMP LDCH TMP ; 修正:读取TMP WD D RSUB END CLOCK
内容的提问来源于stack exchange,提问作者abboud
相关产品推荐
相关产品推荐

