我正在研究一种二进制格式的解压缩算法,该格式存储我的NES项目的屏幕文件。 NES屏幕分辨率为260x240。我正在创建2x2像素格式的元图块。压缩格式将指定应将哪些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次。
我还没想到的部分是如何将左半字节转换为十六进制。我遇到的同样问题是采取正确的半字节并将其用作值。
我不确定是否有办法使用按位运算或不运行。我需要一种有效的方法来做到这一点。
答案 0 :(得分:2)
刚想通了:
执行此操作的方法是执行以下操作:
val = %11110001
LDA #val
AND #%00001111 ; mask left nibble
STA rightn
LDA #val
AND #%11110000 ; mask right nibble
ROR
ROR
ROR
ROR ; rotate high bits 4 times
STA rightn
答案 1 :(得分:1)
鉴于.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。