如何将半字节转换为6502汇编中的值?

时间:2013-02-10 05:11:12

标签: assembly 6502

我正在研究一种二进制格式的解压缩算法,该格式存储我的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次。

我还没想到的部分是如何将左半字节转换为十六进制。我遇到的同样问题是采取正确的半字节并将其用作值。

我不确定是否有办法使用按位运算或不运行。我需要一种有效的方法来做到这一点。

2 个答案:

答案 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_writewrite_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放在最重要的位置。请记住,旋转指令会将进位旋转到最高位,因此您通常需要asllsr进行移位或乘以/除以2。