マップデータを解析する(1):マップデータ形式調査
前回までで、ZANACのグラフィックデータを表示することに成功しました。
この結果を元に、今回からはZANACのゲーム中のマップ表示の秘密に迫っていきたいと思います。

調査の第一段階として、まず、ZANACのマップ表示方法について推測してみました。
お手元にZANACがある方はゲームを実行し、"ROUND 1"の表示が出たらゲームをポーズしてみてください。 無い方はゲーム画面を心の中に思い描いてみてください。

1面なので緑っぽい画面ですが、何かこう・・・縦方向に一定のパターンが繰り返されている感じがしないでしょうか?

ゲーム画面概念図。こんな感じで繰り返しがあります


このことから、ZANACのマップデータ形式について、以下のような推測を立てました。

 ・ZANACのマップは、「マップ片(へん)」の繰り返しで構成される。
 ・一つのマップ片は、横幅が画面幅で、縦が任意の高さの、グラフィックパターンを長方形に並べたデータで構成される。

次に、この推論が正しいかどうかを検証してみました。
まず、マップ片のデータがROMデータ中に存在するかどうかを検証してみます。

パターンとパターン番号
前回のpatview3.exeを実行してみてください。
patview3に表示されているパターン全256個には、全て番号が付いています。 最も左上が00h、その右隣に01h、02hと続いてゆき、右端は0Fhです。
右端まで行ったら一段下の左端に戻ります。このパターンの番号は10hです。
この調子で番号がついているので、最も右下のパターン番号はFFhとなります。

この画面は黒一色ですが、
本来ならグラフィックパターンが表示されています。


パターンとパターン番号の対応について、なんとなく理解されたでしょうか?
余談ですが、グラフィックパターンの"0"〜"9"、"A"〜"Z"までのパターン番号は、 「ASCII文字コード」に準拠しています。

ROMファイルからマップ片データを探す
次に、マップ片データがROMファイル内に存在するかどうかを調べてみます。 検索機能のあるバイナリエディタを用意し、ROMファイルを開きます。
検索機能を呼び出し、検索文字列として以下の手順で得られるマップ片検索データを検索します。

 (1)まず、ZANACを実行し、スタート。スクロールが始まる前にポーズ。
 (2)画面上の適当なところ(マップパターン1マス=8ドット×8ドット)に注目する。画面左よりが良い。
 (3)そのパターンのパターン番号を控えておく。
 (4)ゆっくりと呼吸しながら、静かに、視線を右に8ドット(ピクセル)分ずらす。
 (5)3に戻り、そのパターン番号を控える。これを繰り返し、適当な流さのパターン番号列を得る。これがマップ片検索データとなる。

検索結果は無事に一つに絞られたでしょうか?
結果が複数になってしまった場合には、(5)のパターン番号列が短いようです。より長くして再度検索してみてください。

ROMファイル内で検索結果が一つに絞られたら、一旦そのアドレスを覚えておき、その前後の数値もパターン番号との対応が取れているか調べてみてください。
ある程度まで調べると、次のことが判ると思います。

 ・1面の初めのマップ片は、24×8のパターンで構成されている。
 ・24×8のパターンは、ゲーム画面で言うと上に進むにつれ、ROM上のアドレスが大きくなる。

マップ片データらしきものが見つかったことにより、検証の第一段階は上手くいきました。

マップデータビュワー
1つのマップ片データの存在は検証されたので、他のマップ片データも探してみましょう。
でも、これ以上マス目を数えたり、ゆっくり呼吸をしたりするのは面倒ですよね?
って誰もやってないか・・・

このプログラムを実行してみてください。

  mapview.exe(mapview.lzh : ファイルサイズ 67,348バイト)

(LZH形式で圧縮された、Windowsの実行ファイルです。プログラムはhspで作成しました。
展開後、生成されたmapview.exeをzanac.romと同一のフォルダに移動し、実行してください。)

実行してみると、先ほど探したマップ片データが表示されているはずです。
ちなみに、画面左端の数値はそのデータのアドレスを示しています。
カッコ内の数値は、バイナリエディタのアドレスと一致していますが、その前の数値は一致していませんね?
これはROMファイルのアドレスに4000Hを足したもので、ROMデータがMSXに実行される際に付けられるアドレスです。
このアドレスがわかると色々役立ちます。
なお、画面表示はROMデータアドレスの大きいほうが画面上に来るようにしてあります。

さて、画面右の「上へ」「下へ」で、ROMファイル内を参照し、その他のマップ片データも見つけてみましょう。
続々と見つかり・・・ませんね。

見つかるのは、初めに表示されている

  (1)「緑の24×8」

その下に

  (2)「クレーター等がある茶色い地面」
  (3)「水面」

加えて「call 05C60H」を押した後、緑のデータの上に2行表示される

  (4)「8面のマップっぽいデータ」
  (5)「0面のマップっぽいデータ」

の、計5つしかありません。

残念ながら、初めの推定は誤っていたようです。
とはいえ、いつまでも打ちひしがれてはいられません。 ZANACのマップは、いったいどのような方法で表示されているのでしょうか?
他の方法を探してみることにしました。


・・・そろそろお気づきの方も居るかもしれませんが、 この「ZANACを解析する」ページは、名前に反してまともにソースを解析していません。

「想像とかじゃなくて直接ソースを見れば良いんじゃないの?」

という声が聞こえてきそうですが、「ZANACのプログラムはこうでした」といきなり結論を示すより、
「素人ならこう考えるところが、ZANACではこうなっていた!スゴイ!」となったほうが面白いですよね?
これからもこのスタンスで進めていきますよ!
(物は言いようです。実は私のプログラム解析スキルがそれほど高くないことが原因なのですが・・・)



で、結局マップデータはどんな感じで格納されてるの? 結論から言え!と思いつつZANAC解析のトップへ戻る

トップへ戻る