我需要弄清楚如何为LR35902(Game Boy的类似Z80的CPU)制作一个程序,该程序将获取HL的内容(不是指向它的位置,存储在其中的实际数字)并将其转换为使用十进制系统,1到5(实际值范围从0到65,535,因为HL是16位)非ASCII *字符。我有打印的例程,可以轻松找出裁剪前导零的方法。
我需要的只是这个函数的至少一些伪代码,最多是一个实际的RGBDS LR35902 ASM例程。
*我使用自己的每字符1字节字符代替ASCII,其中字符0是十六进制字节$ 17,增加到9,即20美元。
答案 0 :(得分:2)
如何将秒数转换为60(小时分钟秒)? 1234秒为examaple
将1234除以3600(60 ^ 2)得到零余数1234
将余数1234除以60(60 ^ 1)得到分钟,其为20分钟余数34
将余数34除以1(60 ^ 0)得到秒数34
所以1234秒基数10换算成基数60(HH:MM:SS)是00:20:34
无论基数是什么,转换是相同的,除非一个基数是另一个基数(二进制到十六进制,十六进制到二进制,二进制到八进制,八进制到二进制)的幂,那么你可以采用快捷方式。
您将从基数2转到基数10,然后您可以使用ASCII或任何其他表示形式作为基数10位数。
这个问题在这里被问了好几百次。如果您的处理器没有鸿沟,下一个问题是如何除以10。还多次询问和回答。
从数字到显示表示的转换是在你我们需要看到整个表,因为你只有10个数字来处理你可以,如果没有其他只是做一个查找表。
答案 1 :(得分:0)
奖励预先例程以将HL点数转换为包含的A中的数字。
这是有效的,它只是裁剪前导零的问题。
ConvertNumberHLPoint::
ld a, [hl]
ConvertNumberA::
ld h, 0
ld l, a
ConvertNumberHL::
; Get the number in hl as text in de
ld bc, -10000
call .one
ld bc, -1000
call .one
ld bc, -100
call .one
ld bc, -10
call .one
ld c, -1
.one
ld a, "0"-1
.two
inc a
add hl, bc
jr c, .two
push bc;
push af;
ld a, b;
cpl;
ld b, a;
ld a, c;
cpl;
ld c, a;
inc bc;
call c, .carry;
pop af;
add hl, bc;
pop bc;
ld [de], a
inc de
ret
.carry;
dec bc;
ret;
如果在LR35902上有像sbc hl,bc这样的操作码,就像在Z80上那样,就可以用空白注释替换以空白注释结尾的行 - ;
- 。相反,我们备份bc和af,反转bc并递增它(二进制补码),然后,为了SBC指令中的进位函数,如果设置了进位则再次递增,然后取消备份af,将hl添加到两个补充bc,最后取消备份bc。