2017-02-24 81 views
0

http://zxm.speccy.cz/data/Z80%20Bits.html#2.2z80分割算法是否被破坏?

输入:HL =股利,C =除数,A = 0 输出:HL =商数,A =余

add hl,hl  ; unroll 16 times 
rla   ; ... 
cp c  ; ... 
jr c,$+4  ; ... 
sub c  ; ... 
inc l  ; ... 

当我尝试,并设置HL = $ 1200, = 0,c = $ 91,我在HL中得到0。它不应该是1美元吗?

+0

我相信当c> 7Fh和HL> 00FFh时代码可能会失败。假设A == 80h的输入位为1,那么它将滚动到A == 01h。但是,如果您在C> 7Fh的情况下执行单独的情况,则可以将前8次迭代优化为:ld a,h \ ld h,l \ ld l,0。 – Zeda

回答

1

它坏了。下面是固定的版本:

add hl,hl  ; unroll 16 times 
rla    ; ... 
jr c,$+5  ; important! 
cp c   ; ... 
jr c,$+4  ; ... 
sub c   ; ... 
inc l   ; ... 

如果转移$1200通过A注册您可以看到它永远不会大于$91。但一旦达到$90,下一个比较需要针对$120而不是$20。我添加的进位检查处理这种情况。

看起来像该页面上的许多例子都有类似的问题。

顺便说一下,adc a,a可以用来代替rla,但速度或尺寸没有变化,但清晰度有很大的提高。这使得很明显AHL被视为24位数字。

+0

似乎很好。感谢一堆! –