2013-02-10 30 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.