操纵杆按钮调用的 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
在探索与 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