Hi, All,
I'm disassembling a vintage program and ran across this bit of code
that is causing emulators to hang...
MYSUB:
LD A,R
JP M, MYSUB
JR Z, MYSUB
CP 0x65
RET M
LD A, 0x32
RET
I know plenty of 8-bit assembler (mostly 6502, 1802, and a couple
others), but I'm by no means expert on the Z-80. It appears that this
subroutine is spinning on the value of the refresh register if it's
zero or negative, then if it's below 0x65, return the former contents
of the refresh register and if not, return 0x32?
If it helps, this is from a CP/M game. I'm wondering if this is some
sort of randomizer or delay routine.
So far, this loop hangs on all three emulators I've tried - simh's
altairz80, simcpm010 for AmigaDOS, and EMUZ80 for Raspberry Pi. I'm
guessing none of these environments emulate specific behavior of the
Refresh register?
Does anyone have any comments or insights about what this is really
doing and what the right thing to do for emulators is? I can patch
this if that's what's needed, but I'd like to understand it first.
Thanks,
-ethan