在 Z80 汇编器中将 8 位数字转换为十六进制

问题描述 投票:0回答:1

我正在使用 Z80 为 ZX Spectrum 编写游戏,但遇到了一些问题。我已经操作了一个例程,将 A 寄存器中保存的数字转换为 DE 中保存的十六进制值。我不确定如何转换其他方式,即在 DE 中传入十六进制值并将其转换为 A 中保存的十进制值。

注意:以下例程将输入转换为代表 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
    

任何人都可以建议一个解决方案来逆转这个问题或提供更好的解决方案吗?

hex decimal z80
1个回答
5
投票

此代码将 DE 在 ASCII 中具有十六进制数,并将其转换为 A 中的二进制数。它假定 DE 是有效的十六进制数并使用大写的“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”情况的错误。

更新:使用“add a,a”,它比“sla a”更快。 请注意,如果速度是一个问题,则可以使用查找表更快地完成两种转换。

© www.soinside.com 2019 - 2024. All rights reserved.