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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:39:02