Z80 除法算法无法正常运行

Z80 division algorithm not functioning properly

我正在尝试 运行 以下代码:

HLDIVC: 
    LD B,16
D0: XOR A
    ADD HL,HL
    RLA
    CP C
    JR C, D1
    INC L
    SUB C
    DJNZ D0
D1: RET

编辑:(http://z80-heaven.wikidot.com/math#toc18) 的原始代码是:

HL_Div_C:
;Inputs:
;     HL is the numerator
;     C is the denominator
;Outputs:
;     A is the remainder
;     B is 0
;     C is not changed
;     DE is not changed
;     HL is the quotient
;
       ld b,16
       xor a
         add hl,hl
         rla
         cp c
         jr c,$+4
           inc l
           sub c
         djnz $-7
       ret

在我的旧袖珍电脑上。我不得不稍微编辑一下代码,因为这台袖珍计算机上的汇编程序似乎根本不支持“jr c,$+4”语法,而是必须使用标签或绝对地址。然而,这似乎可能会导致问题,因为该算法似乎无法正常工作。我正在 运行 使用以下代码对其进行设置:

ORG O100H
LD HL,20
LD C,10
CALL REGOUT; Display all register values
CALL HLDIVC
CALL REGOUT
RET

用这个我试图将 20 除以 10,所以根据我的理解,调用函数后 HL 中的正确值应该是 2,A 中的值(余数)应该是 0。然而,情况并非如此。在 运行 执行 HLDIVC 程序之前,这些是寄存器值:

| PC = 0107 | AF = 00 44 |
| SP = 7FE8 | BC = 00 0A |    
| IX = 7C06 | DE = 00 14 |    
| IY = 7C0C | HL = 00 14 |

(所有值均为十六进制)

在程序 运行 之后,这些是寄存器值:

| PC = 010D | AF = 00 9B | <- A is correct
| SP = 7FE8 | BC = 10 0A | <- B is supposed to be 0
| IX = 7C06 | DE = 00 14 | <- DE is correct
| IY = 7C0C | HL = 00 14 | <- HL should be 2(?)

这是怎么回事?任何帮助将不胜感激,感谢您抽出宝贵时间。

你的代码的问题是 $+4 和 $-7 都是指字节数,而不是指令数,而且 JR 指令是 2 个字节。缩进给你一个线索。您需要移动标签:

HLDIVC: 
    LD B,16
    XOR A
D0: ADD HL,HL
    RLA
    CP C
    JR C, D1
    INC L
    SUB C
D1: DJNZ D0
    RET