続・ボコスカウォーズ最強ワザ考察

「どういうこと?」という人は下記リンク参照。
前回の記事:ボコスカウォーズ最強ワザ考察

 2023年10月14日の4ST LIVEでシイナさんが生放送でボコスカウォーズ最強ワザにチャレンジしたものの、ファミコン、ファミコン、ツインファミコン、ツインファミコン、ニューファミコン……と複数ハードを用いても全くビクともせず。
 おそらくファミコンのハードウェアの個体差によって出来るものとと出来ないものがあるのではないか?
 ということで、ウチも2コンSELECT+STARTを押下できる「アスキースティックTURBO JR.」を買ってやろうかと思ったものの、さすがにチャレンジのハードルが地味に高いので、改造パッチを考えることにしました。

・通常の流れ
 特定の拡張端子用ジョイスティックで2コンのセレクト+スタート信号を送出しながらリセットを押し、無音ウェイトが入ったらマイク入力を受け付け。
 マイク入力のカウント値はアドレス$002Eに格納され、C8(200)を超えると裏ワザが成功し、最強状態でゲームがスタートする。

・改造後のイメージ
 特定機器が無くとも、電源を普通に入れればマイク入力の受付状態になり、マイク入力のカウント値が画面に表示される。

 これが実現できれば(ROMライターは必要ではあるけれど…)アスキースティックを買わなくても、ボコスカウォーズの最強ワザを誰でもチャレンジできます。

~実際にやってみた~

1.何もキーを押さなくともマイク待ちウェイトに入るよう書き換え。
 前回の記事でも書いたとおり、下記のルーチンでSTART+SELECT判定をしているので、これを書き換えます。

00:8033:C9 0C CMP #$0C // 0C=1100 = START+SELECT
00:8035:D0 24 BNE $805B // 押してなければ通常分岐へ
↓
00:8035:EA NOP
00:8036:EA NOP

 ファミコンのCPU(6502)ではEAで処理を無効化できるので、プログラムアドレス$8035の条件分岐をNOP×2で破壊し、確実にマイク待ちウェイトに入らせます。

2.マイクカウント$002Eを保持する。
 裏ワザ用の一時領域がずっと放置されるわけもなく、ゲームを開始した瞬間にマイクカウント$002Eの内容はゲーム用パラメータの上書きによって破壊されます。
 これを回避するため、裏ワザ終端処理を次のように書き換えます。

00:8053:C9 C8 CMP #$C8 // ループでマイクに音が入った回数とC8を比較
00:8055:90 04 BCC $805B // キャリー1(C7以下)なら下行を飛び越える。
↓
00:8053:A5 2E LDA $002E // $002Eの値をレジスタAにロード
00:8055:85 E0 STA $00E0 // アドレス$00E0に待避

 待避アドレス$00E0はゲーム途中で破壊される可能性はあるものの、開始直後には正しく保持されていたので、実害は無いでしょう。
 また、勘の良い人は気づいたかもしれませんが、最終判定を破壊して強引に実装しているので「マイクに何も入力しなくても最強になってしまう」という仕様ですが、まあ気にしない気にしない。

※前述のSELECT+START判定ルーチンの破壊にNOPを使わなければ「最強にならないパッチ」を実装できますが、書き換える箇所がやたら多くなるのでやりません。

3.敵兵の数を描画するルーチンをハックする
 待避したアドレス$00E0のパラメータ00~FFを、10進数000~255という3桁の数列へ変換&描画する必要があるわけですが、ボコスカウォーズは画面の右上に都合よく、3桁の「敵兵表示欄」があります。

 サーチツールで調べたところ、敵兵の数はアドレス$000Fに格納されていたので、FCEUXのデバッガで$000Fにリードブレークポイントを仕掛けてチェック。

>00:81E6:A5 0F LDA $000F
 00:81E8:85 4B STA $004B

 アドレス$81E6で無事に停止したので、これを$000Fではなくマイクカウント$00E0の値を参照するように0F→E0に変更。

>00:81E6:A5 E0 LDA $00E0
 00:81E8:85 4B STA $004B

 これで「2コンのSELECT+STARTを押さずにマイク状態になり、ゲームを開始すればマイクカウントの値が画面に描画される」が実現できます。
 エミュレータでテストしたところ、しっかりマイク入力する都度に敵兵欄の値が変動していたので、しっかり動作しているようです。

4.バイナリエディタでROMイメージを書き換える
 あとは実機で試すために、MIFESやStirlingなど任意のバイナリエディタでボコスカウォーズのNESROMを書き換えます。

・アドレス 前 後
00000045: D0 EA
00000046: 24 EA
00000063: C9 A5
00000064: C8 2E
00000065: 90 85
00000066: 04 E0
000001F7: 0F E0

 ROMライター触れるレベルの人が上記の意味がわからないことはありえないと思うので、方法については割愛。

5.最後にパッチ後のROMをEEPROMに焼いて、実機カセットでテスト(未検証)
 パッチ後のROMを実機に焼く方法は「スペランカーの無敵モードを実機で」の記事を参照。
 ウチのボコスカウォーズはコンディションが良くて殻割りするのは勿体ないので、中古でポチったボロいカセットが届いてから追加検証します。


~考察おまけ:エミュレータによるマイク仕様の違い~

 シイナさんがボコスカウォーズの検証動画で、エミュレータによって出来るものと出来ないものがあることを説明していましたが、実際にマイクカウントを見れば一目瞭然でした。
 
 VirtuaNESはしっかりと1ループごとにマイク入力がカウントされており、押しっぱなしにすると+256(オーバーフロー)で0になりました。
 一方、FCEUXはマイク入力をONにしたままループを終えても128で停止し、裏ワザのトリガーとなる200を超えることは出来ません。
 どうして後者は2分の1の確率で取りこぼしているのは不明ですが、前者はMキーがマイクとして実装され、後者はボタン入力をマイクに置き換える機能として実装されているため、それが原因かもしれません。

 そして、もしかするとファミコン本体にも個体差があり、毎ループごとにマイク検出できるものと、1/2の周期でしか判定できないモノがあるのかもしれません。
 これは複数のチャレンジャーによる検証が必要でしょう。