[ゼビウス] AC版ゼビウスで幻の46本目のソルを出す : してログ

[ゼビウス] AC版ゼビウスで幻の46本目のソルを出す

ファミコン版の幻のソル
ファミコン版の幻のソル

ゼビウス6面のソルは本来2本あり、Wikipedia によるとキャラクターオーバーによって出ないとされています。この幻のソル、ファミコン版やナムコミュージアムVol.2(PSP)で、川の手前の左側で出現するので知っている人も多いでしょう。しかしこの場面、そんなにキャラが多いとは思えず疑問でした。今回はそれが本当かどうか、プログラムを解析して調べてみたいと思います。

AC版ですが一応基盤は所有していますが、そこから始めるのはあまりにも敷居が高いということで、MAMEを使うことにします。MAMEだとデバッガ等のツールも便利なので、解析作業も楽になります。(余談ですが、今だとゼビウスの基盤だと5万くらいの安い方ですが、バブルシステム版グラディウスとかうん十万後半とかなってるものもあります。ちなみに、ライフフォースは所有してますがそんな高く無いですね。コレクションしておけば良かったなぁ)

移植作品に出現する幻のソル

上のファミコン版以外にも、いくつかの移植作品で出現します。ナムコクラッシックコレクションVol.1 のゼビウス(オリジナル)では、デバッグモード(ザッパーとブラスターのボタンを押しながらスタートさせる)で出現させることが出来ます。

ファミコン版は他のソルも位置がずれているのですが、こちらはアーケードの配置そのままだと思われます。これを参考に、アーケード版のロム内にデータとして存在しているのか、存在していれば表示されない理由は何なのか、検証していきたいと思います。

ナムコクラッシックコレクションVol.1 の幻のソル
ナムコクラッシックコレクションVol.1 の幻のソル
MAME のデバッガって超便利

今回初めてデバッグモードを使ってみましたが、逆アセンブル、メモリダンプ、ブレークやウォッチポイントなど超便利ですね。メモリダンプもリアルタイムに更新されるので、残機やエリア進行のポインタの動きっぽい更新から当たりを付けられて、Z80のコードを追わなくても何とかなる部分が多かったです。

解析の手順(かなり端折ります)
チートファイルで省力化

まず、スクロールに伴ってカウントアップするような箇所を探していきます。いきなりですが、チートファイルの中身を見て無限残機で書き込んでいるアドレス(0x8183)をモニターしてみました。すると、ゲーム開始で "2" が入り、ミスすると減っていき、"0" 時にミスするとゲームオーバーになりました。なるほど、1000万点近くで無限アップして、残機が256機(0xFFをインクリメントして0x00)になると0になるのは 1byte で管理しているからですね。そして、256機(0x00)でミスすると一発ゲームオーバーと。

なぜここを見たかと言うと、だいたいゲーム進行のステータス関係は、近い場所に格納されているだろうと踏んだからです。闇雲にプログラムを追っても時間が掛かるだけですから、あるものは利用させていただきましょう。

敵の出現テーブルはどこ?

今回は敵の出現テーブルを見つけたいので、この周辺でカウントアップしているような箇所を探します。すると、すぐ隣の 0x8185 (WORD) にそれらしき動きをする部分を発見しました。無敵チートを使って、エリア16 まで通しで監視してみると、常にカウントアップしているものの、間隔に緩急があるように見えました(敵が出てくるタイミングでカウントアップしている)。エリア1で 0x1020 で始まり、エリア16の最後で 0x1E51、エリア7に戻ると 0x1473 になり以降繰り返しとなります。ここが敵出現テーブルのポインタで間違い無さそうでしたが、どうも 0x1020 のアドレスには無さそうです。この辺りでちょっと違う方向に解析を進めてしまって、かなり時間を無駄に使ったので省略します。

出現テーブルの解析

これらの出現テーブルを処理しているのは、サブCPUだと分かりましたので、ウォッチポイントやメモリダンプもデバッガでターゲットを切り替えれば OK です。分かったのは、"XVI6" が出現テーブルのデータで、サブの 0x1000 に読み込まれているようでした。

これの構造が分かり難かったのですが、0x1000 から 16 エリア分の開始位置が書き込まれており、そこから各キャラクタ(地上物と空中物は共通)の出現位置の羅列になっているようです。キャラクタの種類によってバイト数が変わるようで、地上物は 4 バイト(ドモグラムは移動パターンがあるので長くなります)、空中物は 2 バイト、0x0D で終了というような内容になっています。

地上物の 4 バイトは、縦の出現位置(エリアの進行割合)、地上物の種類、処理のスロット番号、横の出現位置(ピクセル単位)、という並びになっています。縦の出現位置と、処理スロット番号(勝手にそう呼んでますが、画面内で生きている地上物の状態を管理する入れ物で、最大 14 個使えるようです)は、かなり分かり難くくて悩みました。

地上物の出現テーブル詳細

下記の出現テーブルは、最初に出てくるバーラ(上)とゾルバク(下)の出現テーブルです。

#1042: D6 1E 04 80
#1046: D6 1F 06 70

簡単なものから説明すると、2バイト目が地上物の種類を表しており、例えば「0x1B」に書き換えればデロータが出てきます。また、4バイト目は横の配置で、画面右端からのピクセル単位で指定するようです。

少し悩んだ1バイト目ですが、これはエリア全体で縦の位置(半キャラの8px単位)を表しています。エリアの開始位置を 0xFF、終了位置が 0x0E(これより後には地上物も空中物も置けない)という形で指定し、出現テーブル上で降順(ここ重要)に並んでいる必要があります。最初これが分からずに、適当に値を入れると地上物が何も表示されなくなったりして悩みました。

問題の3バイト目

解析の結果、3バイト目は地上物を処理するスロット番号(便宜上こう呼びます)が入ります。簡単に説明すると、地上物を存在させるために状態等を保存しておく箱の番号といったところです。ゼビウスの場合それが、04, 06, 08, 0A, 0C, 0E, 10, 12, 14, 16, 18, 1A, 1C, 1E(各16進数)の 14 個用意されているようです。このことから、同時に画面上に存在し得る地上物の数は 14 個に制限されることが分かりました。

出現テーブルを全体的に眺めると、一番最初に現れるバーラの 0x04 から始まって、全エリア通しで 0x04 ~ 0x1E をリング状にループしているのが分かります。なお、大きい地上物は複数のスロットを消費し(ボザログラムが5個、ガル系は2個)、従ってこれらが密集するエリアは配置可能な地上物の数は少なくなります。

ソルが幻となる核心部分

それでは、エリア6の問題の箇所を見てみましょう。

#1442: 4F 1D 06 D0

はい、ソルを表す 0x1D のデータが確かにありました! これが幻のソルそのものです。横の位置 0xD0(画面の右端から 208 ドット目)は、背景の並木の左側、そう、ちょうどナムコクラッシックコレクションで確認した場所にあたります。アーケード版のゼビウスにもちゃんと存在していたことが証明されました。

図にスロット番号を書き出してみると、ボザログラム手前のソルから始まって、幻のソルの手前のログラムでちょうど一周していることが分かります。

また、ボザログラムと幻のソルのスロット番号が同じだということも分かります。このことから、まだボザログラムの存在が残っている状態で出現できないか、出現してもボザログラムと道連れにすぐに消滅しているのどちらかが原因と判明しました。

この場所であまりキャラクターが多い印象が無いのは、ボザログラムが5個分も消費しているせいでした。という訳で、キャラクターオーバー説は本当だったようです。

もう一つ分かる点としは、同じくボザログラムと被るスロット番号(0x08)を持ったドモグラムが消えないことです。つまり、ソルが消えるのは本当にギリギリの不運だったという事になります。

ここまで分かれば、出現させるのは割と簡単です。例えば、ログラムをひとつ潰すという方法や、ボザログラムの出現位置を下げる方法を試したところ、ちゃんと表示されました。ただ、完成されたマップはできるだけ変更したくありません。他の方法を探しますが、地上物が消えたり、出現と同時にワープしたり、撃ってもいないのに爆発痕になったりと、ここからの試行錯誤が大変でした。

本当に紙一重

例えば、ボザの次のグロブダー(撃とうとすると高速で下に避けるやつ)と同じ 0x10 をソルに割り当てたところ、わざと加速させて画面外に出したときのみ正常にソルが出てきます(加速させなかったり、破壊してしまうとダメ)。

また、ボザの出現位置を1キャラ下げるか、ソルを1キャラ上げるだけでも正常に出てくるようになります。仮に、ボザを下げても空き地内に収まっているし、ソルを上げても元々幻だったわけですから、凄腕のゼビウス警察でもない限りまず気づかないでしょうが…。

発想の転換

ボザログラムの実態は、4つのログラムと1つのコアの組み合わせだと推察できます。消費するスロットも5つとなっているので、1つの地上物でありながら消滅は個別のログラムとして処理されるのでは無いかと考えました(俺ならそうする)。そしてここからは当て推量ですが、下側に位置するログラムが1キャラ分早く消滅すると仮定して、そのスロット番号を特定すれば良いと考えました。素直に(俺が)書けば、中央コアが 06、周りはその人のセンスで他のスロットが割り当ててあるはずです。最下部のログラムが 06 だったときのみ、どうしようもありませんが、その可能性は低いと思いました。

今までの解析で、ソル以降の地上物はボザログラムで使用されたスロット番号が並んでいるはず、それらとスロット番号を入れ替えれば推測が正しいか判明します。実際にやってみたところ、1つ後のドモグラムで思い通りの結果となりました。

ついに「正しい位置にソルが出現し、他の地上物に一切影響が無い状態」になったのです!

修正はたったの2バイト

上側が幻のソル(0x1D)、下側が直後に左から出てくるドモグラム(0x2E)の出現テーブルになります。ドモグラムは移動経路がある分、定義が長くなっています。オリジナルでは下記のように 0x06 → 0x08 になっています。

#1442: 4F 1D 06 D0
#1446: 48 2E 08 D8 03 08 00 58 18 FF 00	

それぞれの3バイト目のスロット番号を入れ替えると下記のようになります。本来はオリジナルのように順番になっていなければなりませんが、入れ替えても何ら問題が無い(出現場所が近い場合)ことが分かっています。

#1442: 4F 1D 08 D0
#1446: 48 2E 06 D8 03 08 00 58 18 FF 00	
本物の幻の46本目のソル

とは言っても MAME ですが、もちろん ROM ライタで焼いて基板に移せば完璧です。埃かぶっているコントロールボックスなど、実家の物置から発掘できたらやってみたいと思います。それにしても、都市伝説みたいな噂だったのに、たった2バイトで良かったなんて面白いものです。

やっと逢えたね!No.46
やっと逢えたね!No.46

1バイトの修正でバグソルを出現させる方法(2020-11-04追記)

記事にしようと思って忘れてたの思い出しました。別記事にするまでも無いので、こちらに追記します。

アンドアジェネシス用にしか使わないワーク(記事中のスロット)番号を使う事で、1バイトの修正でソルが出てくるようにできます。ただし、この枠は特別なので照準器には反応しませんので、しれっと驚かせたい基板を作りたいときに使ってください(笑)。

方法はバグソルの3バイト目を 0x06 から 0x02 に変更するだけになります。

2 件のコメント
シオナイト2020-01-22 Wed 01:20
非常に興味深く、楽しい記事でした。
当時は、ソルの場所を一生懸命覚えたものですが、幻のソルがあることは知りませんでした。
不具合の原因調査の流れも面白く、ゼビウスの内部が少しだけ分かってワクワクしました。
当時の基盤でまたプレイしたくなりました。
LANDHERE2020-01-24 Fri 16:06
>シオナイト さん
コメントありがとうございます。
今だとチームでデバッグして残らないバグ、こういうエピソード自体が時代背景をよく映していますよね。
うちの基板はこのデバッグ版仕様ゼビウスなので、ちゃんと46本目が出るようになっています。
今でもときどきプレイして遊んでいます。
名前:
コメント: