yasuokaの日記: Z80における定数10の除算の改良 1
昨日の日記で、Z80で100未満の数値を10で除算処理するというのに挑戦してみたのだが、よくよく考えてみたら、余りを先に計算する方が早い気がしてきた。Bレジスタに0~99の整数が入っている時に、10で除算した商をHレジスタに、余りをAレジスタに返す、という問題なのだが、DAAを駆使すれば楽に余りが求まる。
78 LD A,B
E6 78 AND 78H
0F RRCA
0F RRCA
0F RRCA
27 DAA
87 ADD A
27 DAA
4F LD C,A
78 LD A,B
E6 07 AND 07H
91 SUB C
27 DAA
E6 0F AND 0FH
Bレジスタに入っている0~99の整数を、下位3ビットと上位4ビットに分けて、下位3ビットはそのまま、上位4ビットは-1/4倍(∵8-10=-2)しつつDAAで10の剰余を求め、合計をもう一度DAAしたわけである。これでAレジスタに余りが求まる。続いて、商を求めよう。
4F LD C,A
78 LD A,B
91 SUB C
67 LD H,A
0F RRCA
94 SUB H
94 SUB H
E6 0F AND 0FH
67 LD H,A
79 LD A,C
Bレジスタから余りを引けば、得られる値は全て10の倍数になる。10=8+2をうまく使えば、商の計算は基本的にビット操作に落とせる。これでHレジスタに商が求まる。Aレジスタに余りを返す、という条件もちゃんと満たしてあるので、これで完璧だと思う。
ちなみにDAAを駆使すれば、10で割った商と余りを同時に計算できる方法もあるのだが、Aレジスタの上位4ビットが商に、下位4ビットが余りになってしまう。商をHレジスタに移すのが手間そうなので、あまり詳細を詰めていないのだが、うーん、これだと少し遅いかな。
78 LD A,B
E6 78 AND 78H
0F RRCA
0F RRCA
0F RRCA
27 DAA
87 ADD A
27 DAA
87 ADD A
27 DAA
87 ADD A
27 DAA
4F LD C,A
78 LD A,B
E6 07 AND 07H
81 ADD C
27 DAA
4F LD C,A
0F RRCA
0F RRCA
0F RRCA
0F RRCA
E6 0F AND 0FH
67 LD H,A
79 LD A,C
E6 0F AND 0FH
AND 78H (スコア:2)
さらによく考えたら、「AND 78H」は無くても大丈夫な気がしてきました。