4

z80 を使用して ZX Spectrum 用のゲームを書いていますが、少し問題があります。「a」レジスタに保持されている数値を「de」に保持されている 16 進数値に変換するルーチンを操作しました。他の方法で変換する方法がわかりません。EG は de で 16 進数値を渡し、これを "a" で保持される 10 進数に変換します。

注意: 次のルーチンは、入力を 0 から F までの値を表す ASCII 値に変換します。例えば、a = 255 の場合、d = 70 および e = 70 の場合、「F」は ASCII 値 70 です。

NumToHex    ld c, a   ; a = number to convert
            call Num1
            ld d, a
            ld a, c
            call Num2
            ld e, a
            ret  ; return with hex number in de

Num1        rra
            rra
            rra
            rra
Num2        or $F0
            daa
            add a, $A0
            adc a, $40 ; Ascii hex at this point (0 to F)   
            ret

これを逆に実行するための解決策についてアドバイスしたり、より良い解決策を提供したりできますか?

4

1 に答える 1

5

このコードは、DE が ASCII の 16 進数を持ち、それを A の 2 進数に変換します。DE が有効な 16 進数であると想定し、大文字の 'A' から 'F' を使用します。小文字または '0' .. '9' および 'A' .. 'F' 以外の ASCII 文字を使用すると失敗します。

HexToNum ld   a,d
         call Hex1
         add  a,a
         add  a,a
         add  a,a
         add  a,a
         ld   d,a
         ld   a,e
         call Hex1
         or   d
         ret

Hex1     sub  a,'0'
         cp   10
         ret  c
         sub  a,'A'-'0'-10
         ret

更新: コードをテストし、Hex1 の 'A' .. 'F' ケースの処理に関するバグを修正しました。

更新: 「sla a」よりも高速な「add a,a」を使用します。速度が問題になる場合は、ルックアップ テーブルを使用すると両方の変換をより高速に実行できることに注意してください。

于 2014-04-03T16:24:44.643 に答える