SNES4BPPのデコード方法

yy-chrなどのROM画像ビューワでDQ3のROMをSNES4BPPフォーマットで見ると$164xxxあたりから戦闘背景画像の細切れのようなもの、$18A020からはモンスター画像の細切れのようなものが見えます。DQ3ではSNES4BPPというフォーマットで画像を保存しているようです。SNES 4BPPはDQ3固有のフォーマットではないですが、フォーマットの詳細に関する資料が少ないのでここで書いておきます。

SNES 4BPPは文字通り、1ピクセルに4bit(16色)の情報を持つフォーマットです。つまり1バイトで2ピクセル分の情報を持ちます。SNES 4BPPは8×8のピクセルを1単位、つまり32バイトで8×8ピクセルを表現します。

32バイトの内訳は以下のようになっています。(http://wiki.smwcentral.net/wiki/SNES_4BPP_file_formatより※サイトが死んでました)

1Byte A1 A2 B1 B2 C1 C2 D1 D2 E1 E2 F1 F2 G1 G2 H1 H2

2Byte A3 A4 B3 B4 C3 C4 D3 D4 E3 E4 F3 F4 G3 G4 H3 H4

これは32バイトを16バイトずつ2行に並べたものですが、A1,A2,A3,A4,つまり、1バイト目、2バイト目、17バイト目、18バイト目の4バイトで上から1行目の8ピクセルの情報を持つことを意味しています。A-Hと順番に上から1行目-8行目の情報を持ちます。

次に1行のデータのフォーマットですが、bitplanesという方式で表現されている(ようです)。

デコード方法は、

A1,A2,A3,A4を下から順番に上に向かって並べます。A1-A4の各ビットを縦に見て、A1を1ビット目、A2を2ビット目、A3を3ビット目,A4を4ビット目とし、最上位ビットを左端のピクセル、最下位ビットを右端のピクセルとして配置したものが1行分のピクセル情報となります。

例) A1=$55,A2=$15,A3=$3F,A4=$0Bの場合

A4 00001011 ($0B)

A3 00011111 ($3F)

A2 00010101 ($15)

A1 01010101 ($55)

0-7のそれぞれのビットを A1 + (A2<<1) + (A3<<2) + (A4 <<3) するので

左から右へ $00,$01,$00,$07,$0C,$07,$0C,$0F となります。

DQ3のROMには$0E0080-$238E9Fまで、44145個のSNES 4BPPの画像データが保存されています。

コメント

タイトルとURLをコピーしました