スペランカー考古学講座では、今回は趣向をかえて外から現象を観察するだけでなく、スペランカーのプログラムの内部を発掘していきたいとおもう。
今回のテーマは、諸説飛び交っているスペランカー裏技は実際に存在するのか?という問題である。スペランカーの裏技(とくに無敵技)には大きくわけて2つの流れをくむものがあると考えられる。
- 某雑誌のウソテクの結果を知らず、いまだ信じている。
- スペランカー攻略本の最後に、スペランカーが岩などの障害物やオバケをものともしない、、、と述べ、おっとそれは教えられないと意味深な事が書いてある。
1 はさておき、 2 であるがこれに関しては肯定も否定する記事もほとんどなく、有力な手がかりがえられていない。そこで、我々はこちらの方を謎を解明するべく発掘作業を行うこととなった。なお、今回の調査はStormさんと共同で行われております。
無敵というからには死亡が関係するはずである。我々はまず分かりやすい人数(残機数)のデータを探し出し、それが減っている死亡処理のルーチンを発掘した。その結果、このルーチンにはメモリー$022B番地ににある謎のフラグが0以外であると処理がスキップされ死亡しないプログラムが組まれていることを発見した。
このフラグを操作する命令を中心に発掘したところ、、、以下に示すコードから始まる驚くべきコードの発掘に成功した。
| addr. | 命令 | 解説 |
|---|---|---|
86E6 |
lda $F2 |
今回のコントローラデータをAレジスタにロード |
86E8 |
and #$00 |
ノォ〜デバッグモードをつぶしてる(T-T) 本来は and #$20 (SLECTボタンのビット)となっているはず。 |
86EA |
beq $86FA |
0(SELECT が押されていない)なら処理をスキップ |
86EC |
lda $F4 |
前回のコントローラデータをAレジスタにロード |
86EE |
and #$20 |
SELECTボタンのビットとAレジスタをANDしてAレジスタへ |
86F0 |
bne $86FA |
0以外(SELECTが押されている)なら処理をスキップ |
86F2 |
lda $022B |
デバッグモードのフラグをAレジスタへロード |
86F5 |
eor #$FF |
$FFとAレジスタをXORする(つまり反転) ON/OFFしてる |
86F7 |
sta $022B |
Aレジスタの内容をデバッグモードフラグのアドレスに格納 |
SPELUNKER/ by Tim Martin and Micro Graphic Image (c)1985 IREM Corp. Licensed from broderband
これのルーチンは前回のパッドのデータと今回のパッドのデータの比較を行う。つまり、セレクトボタンの状態の移り変わりをしらべているのだ。簡単にいうと、SELECTが押されてない→押されてるに変化したかどうかを調べているのだ。(そうしないと押しっぱなしにしたときにON/OFFしてしまう)
で、セレクトボタンがおされるとメモリの $022B に置かれているデバッグモードのビットをすべて反転しているのだ。(これでON/OFFが1行でおこなえる。)
しかし、アドレス86E8でコントローラのステータスを0とANDしているので(0とANDするとすべて0になってしまう)次の命令によってデバッグモードへ入ることができなくなってしまう。この行は出荷時のROMではデバッグモードにはいれないようにした痕跡である。
さて、ここの命令を$20に書き換える事で我々はSELECTを押すとあたり判定を無視し、縦横無尽に歩き回る無敵のスペランカーを目撃することができた。
なお、空中でデバッグモードを解除するともやっぱり即死します、、、さすがや(T−T
そんなわけでスペランカーに無敵モードがあった事が判明した。しかし、残念ながら出荷時に使えないようになっているようである。なお、ゲームスタート時にちゃんと初期化されており「スーパーマリオがテニスで好きな面から始められる」系の裏技も通用しないようである。コマンドを複雑にして、裏技として残して欲しかったなぁ、、、。
なので(唐突)、、、やり方が分かる人はこの情報を元に遊んでみてね。分からない人にはちょっとひそかに考えてることがあるので、、、それはまた次回!
(2001.1.20)
微妙に訂正(2001.6.3)