这个z80除法算法坏了吗?
Is this z80 division algorithm broken?
http://zxm.speccy.cz/data/Z80%20Bits.html#2.2
输入:HL = 股息,C = 除数,A = 0
输出:HL = 商,A = 余数
add hl,hl ; unroll 16 times
rla ; ...
cp c ; ...
jr c,$+4 ; ...
sub c ; ...
inc l ; ...
当我尝试并设置 hl=$1200、a=0、c=$91 时,我在 HL 中得到 0。不应该是 $1f 吗?
它坏了。这是固定版本:
add hl,hl ; unroll 16 times
rla ; ...
jr c,$+5 ; important!
cp c ; ...
jr c,$+4 ; ...
sub c ; ...
inc l ; ...
如果您将 00
移动到 A
寄存器,您会发现它永远不会大于 </code>。但是一旦达到 <code>
,下一次比较就需要针对 0
而不是 </code>。我添加的进位检查处理了这种情况。</p>
<p>看起来该页面上的许多示例都有类似的问题。</p>
<p>顺便说一句,<code>adc a,a
可以用来代替 rla
,速度或大小没有变化,但清晰度有很大提高。很明显 AHL
被视为 24 位数字。
http://zxm.speccy.cz/data/Z80%20Bits.html#2.2
输入:HL = 股息,C = 除数,A = 0 输出:HL = 商,A = 余数
add hl,hl ; unroll 16 times
rla ; ...
cp c ; ...
jr c,$+4 ; ...
sub c ; ...
inc l ; ...
当我尝试并设置 hl=$1200、a=0、c=$91 时,我在 HL 中得到 0。不应该是 $1f 吗?
它坏了。这是固定版本:
add hl,hl ; unroll 16 times
rla ; ...
jr c,$+5 ; important!
cp c ; ...
jr c,$+4 ; ...
sub c ; ...
inc l ; ...
如果您将 00
移动到 A
寄存器,您会发现它永远不会大于 </code>。但是一旦达到 <code>
,下一次比较就需要针对 0
而不是 </code>。我添加的进位检查处理了这种情况。</p>
<p>看起来该页面上的许多示例都有类似的问题。</p>
<p>顺便说一句,<code>adc a,a
可以用来代替 rla
,速度或大小没有变化,但清晰度有很大提高。很明显 AHL
被视为 24 位数字。