Z80操纵杆按键调用函数打印多余字符串而非预期单字符问题
问题根因
你遇到的打印异常本质是端口寄存器BC被打印函数意外修改,完全匹配你描述的输出现象:
- 进入主循环时你初始化
BC = 31(Kempston操纵杆端口号),此时C寄存器值为31,读取端口功能正常。 - 当你按下左键触发
joyl调用时,函数内执行了ld bc,eostrl-sl,直接把BC的值改成了1,此时C寄存器值变为1,后续所有in a,(c)操作读取的不再是操纵杆端口31,而是端口1的随机值。 - 端口1的返回值通常会同时满足右键、上键的位检测条件,因此会依次触发
joyr、joyu调用,最终打印出lru。 - 按下右键时不会触发
joyl,所以只会依次触发joyr、joyu,打印ru;按下上键时前面的左右检测都不触发,只打印u,和你的现象完全吻合。
修复方案
你可以二选一修改:
- 方案1:直接用立即数读取操纵杆端口,不需要依赖BC寄存器存储端口号:
loop in a,($1F) ; 直接读31号端口 and 2 call nz,joyl in a,($1F) and 1 call nz,joyr in a,($1F) and 8 call nz,joyu in a,($1F) and 4 halt jp loop
- 方案2:在三个打印函数里保护
BC寄存器,调用前后恢复原值:
joyl push bc ld de,sl ld bc,eostrl-sl call 8252 pop bc ret ; joyr、joyu同理添加push bc和pop bc指令即可
内容的提问来源于stack exchange,提问作者Alexey
相关产品推荐
相关产品推荐

