タイルマップ圧縮フォーマット

スーパードンキーコング3 および、Dixie Kong’s Double Trouble が使用するタイルマップ専用圧縮アルゴリズムについて説明します。\

特徴

このフォーマットはタイルマップに特化した専用フォーマットで、水平反転フラグ・垂直反転フラグ・優先度設定・パレットインデクス・タイルインデクスの各フィールドごとにデータを圧縮することで、高い圧縮率を実現したものです。

ヘッダ

圧縮データの先頭にある3バイトのデータで、フィールド展開指定とバッファサイズ指定からなります。

フィールド展開指定

フィールド展開指定はヘッダの最初のバイトで、優先度フラグ、水平反転フラグ、垂直反転フラグの各フィールドについて、展開処理を行うかどうかを決定します。

ビット内容
0優先度フィールドを展開する
1水平反転フィールドを展開する
2垂直反転フィールドを展開する

これらのビットは全く設定しないことも、複数組み合わせることも可能です。
設定されなかったビットに対応するフィールドは書き込みが行われず、0となります。

バッファサイズ指定

バッファサイズ指定はヘッダの2-3バイト目で、展開後のタイルマップのサイズをワード単位で指定します。
バイト単位のサイズが知りたい場合は値を2倍します。

データの展開

データの展開は、優先度フラグ、水平反転フラグ、垂直反転フラグ、パレットインデクス、タイルインデクスの順に行われます。
このうち、優先度フラグ、水平反転フラグ、垂直反転フラグの書き込みは任意で、フィールド展開指定で指定されたフィールドのみ処理が行われます。
パレットインデクス、タイルインデクスは必ず処理を行います。

任意フィールドの書き込み

フィールド展開指定を最下位ビットからチェックし、1だった場合、該当するフィールドの展開処理を行います。
各フィールドの圧縮データは1ビット単位で処理されます。

コマンド文法内容
00 XX(1ビット)を対象のビットフィールドに1回書き込み。
11 X YYYYYYX(1ビット)を連続するYYYYYY(6ビット)ワードの対象のビットフィールドに書き込み。
YYYYYYが0の場合は現在のビットフィールドの書き込みを終了し、書込位置を先頭に戻して次のビットフィールドの処理へ移行。

パレットインデクスの書き込み

任意フィールドの書き込みが完了したら、パレットインデクスの書き込みが行われます。パレットインデクスの符号化方式は任意フィールドの符号化方式とほぼ同一です。

コマンド文法内容
00 XXXXXX(3ビット)をパレットインデクスとして1回書き込み。
11 XXX YYYYXXX(3ビット)を連続するYYYY(4ビット)ワードのパレットインデクスに書き込み。
YYYYが0の場合はパレットインデクスの書き込みを終了し、書込位置を先頭に戻してタイルインデクスの処理へ移行。

タイルインデクスの書き込み

パレットインデクスの書き込みが完了したら、タイルインデクスの書き込みが行われます。
タイルインデクスの符号化は、2ビットのコマンド、10ビットのタイルインデクス、必要に応じて追加オペランドの形式で行われます。

コマンド文法内容
00 X10ビットのタイルインデクス X を1回書き込み
11 X Y10ビットのタイルインデクス X を連続するY(6ビット)ワードに書き込み。
Yが0の場合は伸長処理終了です。
22 X Y10ビットのタイルインデクス X を連続するY(4ビット)ワードに書き込み。
1回書き込むたびにXは1インクリメントされます。つまり、連番タイルの書き込みです。
33 X Y10ビットのタイルインデクス X を連続するY(4ビット)ワードに書き込み。
1回書き込むたびにXは1デクリメントされます。つまり、連番タイルの書き込みです。