我需要弄清楚如何为LR35902创建一个例程(Game Boy的Z80类CPU),它将把HL的内容(不是它所指向的地方,而是存储在它里面的实际数字)并将它转换成1到5(实际值的范围为0到65,535,因为HL是16位的)非ASCII * 字符使用十进制系统。我有打印例程,可以很容易地找出一种方法来裁剪前导零。
所有我需要的是至少一些伪代码的这个函数,最多一个实际的RGBDS LR35902 ASM例程。
- 我没有使用ASCII,而是使用我自己的每个字符1个字节的字符Map,其中字符0是十六进制字节$17,一直增加到9,即$20。
3条答案
按热度按时间jgovgodb1#
如何将秒转换为基数60(小时分秒)?例如1234秒
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位数来处理你可以,如果没有别的只是做一个查找表。
scyqe7ek2#
奖金预例程,以转换的数字HL点或数字在A包括。
这是可行的,这只是一个问题,裁剪前导零。
如果在LR 35902上有一个操作码sbc hl,bc,就像在Z 80上一样,就可以用它替换以空白注解--
;
--结尾的行。(2的补码,)然后,为了SBC指令中的进位功能,如果进位被设置,则将其再次递增,然后取消备份af,将hl加到2的补码bc,和最后未备份BC。kq4fsx7k3#
此例程将HL中的值转换为ASCII表示,从DE指向的内存位置开始,以十进制形式表示,并带有尾随零,因此其长度始终为5个字符。http://map.grauw.nl/sources/external/z80bits.html#5.1