我正在研究一种二进制格式的解压缩算法,用于存储我的 NES 项目的屏幕文件。 NES 屏幕分辨率为 260x240。我正在创建 2x2 像素格式的元图 block 。压缩格式将指定应将哪些 2x2 文件写入屏幕。
我选择的格式会写成
0000xxxx: right nibble = value of tile 1 - 16
xxxx0000; left nibble = number of times a tile is written on that row 1 - 16
在上面的示例中,11110001 会告诉导入例程写入磁贴 1,16 次。
我还没有弄清楚的部分是如何取左半字节并将其转换为十六进制。我遇到的同样问题是获取正确的半字节并将其也用作值。
我不确定是否有办法使用按位运算来做到这一点。我需要一种有效的方法来执行此操作。
最佳答案
鉴于您在 .A 中的“压缩”(虽然“打包”是一个更好的术语)数据,您应该这样做:
(假设 tile_id_to_write
和 write_it_this_many_times
是您要将其解压缩到的零页面位置。)
lda packed_data,X ;or however you're iterating through the packed data
and #%00001111 ;strip off top 4 bits; this is what AND dones
sta tile_id_to_write ;store that somewhere
lda packed_data,X ;get the original packed data again
lsr ;shift right 4 times
lsr
lsr
lsr
sta write_it_this_many_times
根据您读取打包数据的方式,您可能会执行与 lda packed_data,X
不同的操作。我很确定 lsr
将 0 放在最重要的位中。请记住,循环指令将进位旋转回最高位,因此您通常需要执行 asl
或 lsr
来移位或乘以/除以 2。
关于assembly - 如何将半字节转换为 6502 汇编中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14794918/