【问题标题】:Convert an 8bit number to hex in z80 assembler在 z80 汇编器中将 8 位数字转换为十六进制
【发布时间】:2014-05-15 07:54:32
【问题描述】:

我正在使用 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

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

【问题讨论】:

    标签: hex decimal z80


    【解决方案1】:

    此代码将 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' 大小写的错误。

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

    【讨论】:

    • 非常感谢。它只是我需要它做的事情。
    猜你喜欢
    • 1970-01-01
    • 2012-06-02
    • 2023-01-31
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2016-08-21
    • 2019-05-16
    • 2012-04-02
    相关资源
    最近更新 更多