在z80汇编程序中将8位数转换为十六进制

Ret*_*der 4 hex z80 decimal

我正在使用z80为ZX Spectrum编写游戏,并且有一些问题.我操纵了一个例程,将"a"寄存器中保存的数字转换为"de"中保存的十六进制值.我不确定如何转换另一种方式,EG在de中输入十六进制值并将其转换为"a"中保存的十进制数.

注意:以下例程将输入转换为表示值0到F的ascii值.EG如果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
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议一个解决方案来反向工作或提供更好的解决方案吗?

Geo*_*ips 5

此代码使DE在ASCII中具有十六进制数,并在A中将其转换为二进制数.它假定DE是有效的十六进制数,并使用大写的"A"到"F".如果使用小写字母或者除了'0','9'和'A'之外的任何ASCII字符,它将失败.''F'.

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
Run Code Online (Sandbox Code Playgroud)

更新:现在已经测试了代码并修复了处理Hex1中'A'..'F'情况的错误.

更新:使用"添加a,a"比"sla a"快.请注意,如果考虑速度,则可以使用查找表更快地完成转换.