2

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 回書き込むように指示します。

私が理解していない部分は、左ニブルを取得して16進数に変換する方法です。私が抱えている同じ問題は、正しいニブルを取り、それを値としても使用することです。

ビット演算を使用してこれを行う方法があるかどうかはわかりません。これを行う効率的な方法が必要です。

4

2 に答える 2

3

「圧縮された」(「パックされた」という方が適切な用語ですが) データが .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を入れると確信しています。回転命令はキャリーを最上位ビットに戻すので、通常は2 でシフトaslまたはlsr乗算/除算します。

于 2013-08-18T14:13:36.053 に答える
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
于 2013-02-10T07:03:22.800 に答える