2026年8月16日日曜日

ファミコン版キャッスルエクセレントのハックのステージを展開して表示してみる。

 




ファミコン版ザ・キャッスルのログイン版(最優秀作品じゃない方)のマップが欲しいなぁ、自分自身の説明書き用に…と思ったものの、これを画面キャプチャしてつなげるのも面倒くさい。…ということで、データからハフマン符号を開いて、88版と同じようにプログラムで描いて作ろうかと画策。

バイナリを見ると、ハックの人のメモが書いていたので、ステージデータのスタート位置はとてもよく分かる(笑) C100h~からですね。で、アイテムデータの位置は検索で簡単。レンガ(2B)がX座標9、Y座標Eの位置にあるから「2B 09 0E」で検索したら、これまた一発で引っかかる。ということで、スタート面のアイテムデータは6FC1hから。

ステージデータのスタート位置を示すものがバイナリのどこかにあるとは思うものの、今回の用事には関係ないのでパス。分かれば、キャッスルエクセレントのマップもプログラムで作れますけどね。

ファミコン版キャッスルエクセレントのステージデータはハフマン符号で圧縮されていますので、これを展開するわけですが、2値を扱わなければいけないので、データを読み始める位置が「何番地の何ビット目」かを変数で持たせて(番地とビットをハフマン符号の文字数で足すときは、一旦番地を8倍すると計算しやすいですね)、その都度、符号の必要ビット数を切り出せばいいわけですよね。符号の最長は13個(13ビット)なので、2バイト(16ビット)の数値にでもしておけば。

ただ、一番多い53hの空白は符号が「1」だけですので、まずは符号の1個目が「1」かどうかを先に調べて、「1」ではなかったら残りの符号を展開する…というやり方もいいかも知れません(が、今のところやっていません)。


ハフマン符号を開くのは簡単です。2値を扱うのがちょいと面倒くさいですが、何とかなります。目的の場所から3バイトを2値にして、そこから必要の位置から13ビットを切り出せばいいわけです。


そんなこんなで、開くところまではできました。あとは、これに16×16ドットのオブジェクトを配置して、全体画像にすればいいわけですよね。

0 件のコメント:

コメントを投稿