パスワードを忘れた? アカウント作成
13969593 journal
日記

yasuokaの日記: Z80における定数10の除算の改良 1

日記 by yasuoka

昨日の日記で、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

この議論は、yasuoka (21275)によって ログインユーザだけとして作成されたが、今となっては 新たにコメントを付けることはできません。
typodupeerror

日々是ハック也 -- あるハードコアバイナリアン

読み込み中...