操纵杆按钮调用的 Z80 函数打印额外的字符串而不是预期的字符串

Z80 function called by Joystick button prints extra strings instead of the expected one

在探索与 Z80 游戏的操纵杆连接时,我得到了这段代码,当我按下向上、向左或向右时,它应该打印 1 个字母。但是由于某种原因,当我按左键时,它打印 lru,当我按右键时,它打印 ru,而在按上键后,它打印 u

            org 32768

    loop    ld bc,31        ; Kempston joystick port.

            in a,(c)        ; read input.
            and 2           ; check "left" bit.
            call nz,joyl    ; move left.
            in a,(c)        ; read input.
            and 1           ; test "right" bit.
            call nz,joyr    ; move right.
            in a,(c)        ; read input.
            and 8           ; check "up" bit.
            call nz,joyu    ; move up.
            in a,(c)        ; read input.
            and 4           ; check "down" bit.

            halt
            jp loop

    joyl    ld de,sl        ; address of string
            ld bc,eostrl-sl ; length of string to print
            call 8252
            ret

    joyr    ld de,sr
            ld bc,eostrr-sr
            call 8252
            ret

    joyu    ld de,su
            ld bc,eostru-su
            call 8252
            ret

    sl      defb "l"
    eostrl  equ $
    sr      defb "r"
    eostrr  equ $
    su      defb "u"
    eostru  equ $

三个不同的“变量”具有唯一的字符串长度标签,但为什么调用 joyl 打印所有三个字母而不是一个?

子例程会更改 BC 寄存器的值,因此如果调用其中之一,后续 IN A,(C) 指令将读取错误的端口。

在每个 IN A,(C) 之前添加一个 LD BC,31 来解决这个问题。或者你可以在子例程中保存和恢复 BC,像这样按下和弹出:

joyu    push bc
        ld de,su
        ld bc,eostru-su
        call 8252
        pop bc
        ret