yasuokaの日記: Z80における定数10の除算 4
日記 by
yasuoka
ネットサーフィンしていたところ、Z80で100未満の数値を10で除算処理するというページに行き当たった。Bレジスタに0~99の整数が入っている時に、10で除算した商をHレジスタに、余りをAレジスタに返す、という問題のようだ。私(安岡孝一)個人は条件分岐がキライなので、まあ、1/10≒26/256で商を求めることになると思う。
78 LD A,B
87 ADD A
6F LD L,A
AF XOR A
67 LD H,A
58 LD E,B
57 LD D,A
19 ADD HL,DE
29 ADD HL,HL
29 ADD HL,HL
19 ADD HL,DE
29 ADD HL,HL
これでHレジスタに商が求まるはずなので、あとは10倍してBレジスタから引けば、余りが求まる。Aレジスタには0が入ってるはずなので、それを使い回せば以下の通り。
94 SUB H
87 ADD A
87 ADD A
94 SUB H
87 ADD A
80 ADD B
ヘッドアセンブルで書いたのでミスがあるかもしれないが、さて、こういうアイデアは邪道なのかしら?
バグってました (スコア:2)
ごめんなさい、ごめんなさい、ごめんなさい、26/256だと誤差が大きすぎます。うー、ちょっとだけクイック・ハックして補正してみます。
でも、これだと、さすがにイマイチ。もう少し練り直してみます。
Re:バグってました (スコア:2)
(a+a/64)*26/256 (スコア:2)
単純に(a-a/64)*26/256で求まるのでは?
アセンブラに何が書いてあるかはきちんと読んでないけど。
twitterで見かけた (スコア:2)
twitterで、10で割るコードがお題になってたんですかね?ちょっと前にtwitterで0.1倍で計算するZ80コード [twitter.com]を見かけました。
「へー」で読み流しちゃって、コード内容は見てないんですが…