使用我自己的非ASCII charmap将无符号的16位整数从HL转换为文本,使用LR35902汇编

时间:2016-07-29 19:21:28

标签: assembly gameboy

我需要弄清楚如何为LR35902(Game Boy的类似Z80的CPU)制作一个程序,该程序将获取HL的内容(不是指向它的位置,存储在其中的实际数字)并将其转换为使用十进制系统,1到5(实际值范围从0到65,535,因为HL是16位)非ASCII *字符。我有打印的例程,可以轻松找出裁剪前导零的方法。

我需要的只是这个函数的至少一些伪代码,最多是一个实际的RGBDS LR35902 ASM例程。

*我使用自己的每字符1字节字符代替ASCII,其中字符0是十六进制字节$ 17,增加到9,即20美元。

2 个答案:

答案 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。