我正在使用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
任何人都可以建议一个解决方案来反向工作或提供更好的解决方案吗?
答案 0 :(得分:5)
此代码使DE在ASCII中具有十六进制数并在A中将其转换为二进制数。它假定DE是有效的十六进制数并使用大写的“A”到“F”。如果使用小写字母或者除了'0'之外的任何ASCII字符,它将失败。'9'和'A'..'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
更新:现在已经测试过代码并修复了处理Hex1中'A'..'F'情况的错误。
更新:使用“添加a,a”比“sla a”快。请注意,如果速度是一个问题,那么使用查找表可以更快地完成转换。