2013-02-10 33 views
2

我正在为存储我的NES项目的屏幕文件的二进制格式解压算法。 NES屏幕分辨率为260x240。我正在以2x2像素格式创建元贴片。压缩格式将指定应将哪个2x2文件写入屏幕。如何将半字节转换为6502程序集中的值?

我所选择的格式将被写入作为

0000xxxx: right nibble = value of tile 1 - 16 
xxxx0000; left nibble = number of times a tile is written on that row 1 - 16 

在上述例子中,会告诉导入例程写入瓦片1,16次。

我还没有想出的部分是如何取左半边并将其转换为十六进制。我所面临的同样的问题是,要正确的啃食,并将其用作价值。

我不确定是否有办法使用按位操作来完成此操作。我需要一个有效的方法来做到这一点。

+0

是不是NES 320x240? – alex 2013-02-12 11:53:33

+0

它实际上是256x240。精灵位置寄存器为8位宽,单个名称表为32x30个磁贴。这可能不是256x256,所以有属性表的空间。在Commodore 64的分辨率可以是320x240,精灵位置寄存器有第九位(所有的第九位在他们自己的寄存器中)。 – LawrenceC 2014-12-19 23:45:38

回答

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 
+6

你应该使用'LSR'而不是'ROR';否则如果在开始代码之前设置了进位,你会得到错误的结果。第二个AND也可以省略。 – Tommy 2013-02-10 09:35:34

+2

@Tommy当然,ASL/LSR通常是更好的选择,除非你需要旋转进位。第二个AND是多余的* IF * OP使用LSR,因为它从左侧旋转零,所以预先屏蔽低位低频是浪费周期。此外,可以在第一次LDA之后使用TAX,然后使用TXA而不是第二次,以节省字节和“n”个周期(取决于LDA的寻址模式)。或者生活危险,第一次使用LAX,免除TAX。哦,那最后的'STA rightn'应该是'STA leftn'。 – 2013-02-11 10:04:36

1

鉴于你的“压缩”(虽然“包装”将是一个更好的词)的数据。 (您想解开这假设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 
:A,你应该这样做

根据您阅读打包数据的方式,您可能会执行与lda packed_data,X不同的操作。我很确定lsr在最重要的位上放了一个0。请记住,旋转指令将回转旋转至最高位,因此通常需要执行asllsr以进行移位或乘/除2.