【ござる】ファイナルファンタジー【バイナリ神】2at GAMEURAWAZA
【ござる】ファイナルファンタジー【バイナリ神】2 - 暇つぶし2ch928: ◆HZ9Cy.3WvI
06/06/04 22:24:33 /efx1zck
FF6のマップデータを初めとする圧縮データの展開方法が解ったので記述。
データ展開の際にはバッファ用のメモリ(2048バイト=000-7FF)
を出力結果とは別に用意する。

例 初心者の館 フィールドの部屋の location map data の一部
CF 06 FF 00 01 02 83 00 43 00 B3 FF 00 00 34 4A 
F0 00 1E 1C FF 8E 06 11 16 00 47 00 B7 FF 00 6E 
1B 40 2C 2D A2 A6 FF 47 5E 00 01 03 01 26 26 FF 
01 01 27 28 5C E7 BA BA FF DD DE DE 01 04 27 01 
EC FF EE 01 00 24 28 C9 B8 B8 FF E1 E3 E3 01 08 
24 A1 00 DF 0C 2D 4F 3C 2D 1B 10 E2 01

先頭2バイトはデータの長さ(この2バイトを含む)
次の1バイトは8bitのフラグ配列
bitが1ならば、次の1バイトは無圧縮。
ここではFF=11111111 なので、次の8バイトは全てそのまま解凍データとしてコピーされる
またバッファメモリにもコピーされるが、メモリにはアドレス7DEから格納していく。
7FFまで達したら、次は000から格納する。
よってここまでの解凍データは
00 01 02 83 00 43 00 B3
次もまたFFなので
00 01 02 83 00 43 00 B3 00 00 34 4A F0 00 1E 1C
次もまたFFなので
00 01 02 83 00 43 00 B3 00 00 34 4A F0 00 1E 1C 
8E 06 11 16 00 47 00 B7
こうして続けていくと元データ83バイト目までの解凍データは
00 01 02 83 00 43 00 B3 00 00 34 4A F0 00 1E 1C 
8E 06 11 16 00 47 00 B7 00 6E 1B 40 2C 2D A2 A6 
47 5E 00 01 03 01 26 26 01 01 27 28 5C E7 BA BA 
DD DE DE 01 04 27 01 EC EE 01 00 24 28 C9 B8 B8 
E1 E3 E3 01 08 24 A1 00
となる。
84バイト目はDF=11011111となっている
bit0-4は1なので次の5バイトはそのままコピー
bit5が0 このとき次の2バイトが圧縮シーケンスを表す
圧縮シーケンスとはこれまでの解凍データの一部をまた使いたい場合に
その場所と長さを指定するもの
ここで対応するのは 1B 10 リトルエンディアンなので101Bである。
101B=0001000000011011
このうち上5ビットの値+3が必要なデータの長さを表す
00010=2
よって2+3=5バイト必要
下11ビットが圧縮データの位置を示す
値は00000011011=01B
この位置データはバッファメモリ上のアドレスを表しており、
メモリのアドレス01Bから5バイトをコピーし、出力する。
この時点でのメモリの様子は
<A href=


次ページ
続きを表示
1を表示
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch