PC9821V16のシステムHDDをDOMに換装

 我が家のPC9821V16(以下V16)は1GB弱のHDD(Quantom Fireball)が搭載されているのですが、さすがにそろそろ年代的にHDDが故障しそう…というわけで回転部品の無いフラッシュストレージへの換装を検討しました。

1.CFをIDE変換して接続
 昔はよく使われていた手法&ヤフオクなどで頻繁に売られていますが、ググれば分かるように突然死リスクが高すぎるので論外。

2.容量120GBくらいの安価なSATA-SSDをIDE変換して接続
 PC98シリーズは容量制限がありV16も4.3GBの壁(容量オーバーのストレージを接続するとメモリカウントでフリーズする)があります。
 ネット上の記事には「スレーブにすればメモリカウントを突破できる」「HDD容量を書き換えるツールで4.3GB以下にすればフリーズしない」と書かれているものの、我が家のV16はIDEスレーブ接続にしようがドライブ容量を書き換えようが、ちっともメモリカウントを突破できずフリーズするので、この案は断念しました。

3.容量1GBのIDE接続DOM (Disk On Module)を直接接続
 というわけで、システムまるごとコピーできる容量のDOMを購入しました。
 Aliexpress商品リンク:PQI DOM 1GB / DOM用電源ケーブル
 (2024年9月現在、DOM1GBが1,813円で電源ケーブルが443円でメチャ安)

 V16のCDROMドライブのIDEケーブルを引っこ抜いてマザーボードに接続し、BIOSカウントを無事に突破できることを確認。
 FORMAT C: /SコマンドでシステムFDを作成し、まりも氏作のコピーツールHDDUP98の実行プログラムをシステムFDにコピーします。
※ハードオフとかで3モードフロッピードライブが1000円くらいで買えるので確保しておけば、最近のWin11なマシンから1.25MB読み書きできるよ。

 V16でシステムFDからブートしてHDDUP98を実行すると1stドライブにFireball、2ndドライブにPQI DOMが見えるのでサクッと複製すれば完了。
 元々のHDDを抜いてDOMに差し替えてブートすれば、バッチリ起動します。

 DOMはDISK TYPE00の汎用ドライブとして認識しており、元々の低スペックゆえに体感速度はHDDもDOMもほとんど変わらず。
 とはいえ、これで「数十年モノのHDDが故障しても平気」という安心感が買えたので満足です。
 IDE接続であれば理論上は相当古いマシンでもいけるはずなので、皆も大事なレトロPCが壊れる前にシステムバックアップを取っておきましょう。

桃太郎活劇にも「隠しパスワード」があるかもしれない

 隠しパスワードといえばPCエンジン妖怪道中記のアレが思い浮かぶかもしれませんが、ひょんなことからハドソンの名作「桃太郎活劇」にもそれらしきものを発見しました。

 桃太郎活劇のROMイメージファイルをテキスト文字コード変換ツールGCCODE2で開いて半角カナ「イ?サキハ」でサーチすると、いくつかの平文がヒットします。
(※文字コードの並びがJISと互換性がないために、本来「いわさき」がであるはずの箇所が「いらさき」になっています)

 本作の隠しパスワード(じぞうのうた)は、大技林などの裏技本でいくつか公開されており、上画像の青文字の箇所に含まれている(=既に判明済みのもの)は下記の6つです。

いわさきはえがへた 美術室(グラフィックテスト)
いわさきはうたがへた 音楽室(サウンドテスト)
らきあまくさ かんたんモードのエンディングを開く
こちみたしよ ふつうモードのエンディングを開く
きゆかたいと むずかしモードのエンディングを開く
じうよしたすま ゲロゲロモードのエンディングを開く

 そして上の6つ以外にも、実は下記の2つが隠されていました。

あつちむいてほいほい 仙人と「あっちむいてホイ」を遊べる
ももたろうはつよかつた ???

 前者は旅の途中に出会う仙人から術を授かるための「あっちむいてホイ」の動作テストを行うことができます(無限にあっちむいてホイが続く)

 これは攻略本やネット上の情報サイトにも掲載されていないため、まさかの発売から34年目で判明した隠しパスワードということになります。

 ところが、もう一つの「ももたろうはつよかつた」だけは入力と同時にタイトル画面に戻るだけで、何が変わったのかはまったくの不明。
 じぞうのうた実行前後で比較するとメモリ空間には105バイトの差があり、アドレス$20C4、$380A、$39B7、$3B4F、$3C17、$3C83、$8CD8に01が書き込まれていますが、ゲームを開始してもこれといって変化はみられません。
(ゲロゲロモードが有効になっているわけでもなさそうです)

 個人的見解では「デバッグ用に搭載されていた無敵モードが容量の都合などでカットされたのではないか?」と思うのですが、2024年5月現在において詳細は判明していません。
 詳細を知っている方、または細部の解析に成功して真の効果を判明できた方はコメントいただけるとありがたいです。

絶対可憐チルドレンDSの「13番目のパスワード」を求めて


 というわけで「妖怪道中記隠しパスワード解析選手権(参考:おたくま経済新聞)」以来、ひさしぶりの隠しパスワードネタです。
 ニンテンドーDS用ゲームソフト「絶対可憐チルドレンDS 第4のチルドレン」にはオマケ要素として隠しパスワードが存在しており、当時は週刊少年サンデーや公式サイトのイベントページなどで開示されたものなどを含め、合計12種類が公開されていました(※2008年当時のサイトはウェイバックマシンなどで確認可能)

 ところがROM内部には「13番目のパスワード(桐壺局長の解禁)」のデータが存在しており、これが公開されないまま2024年に至っています。
 ただし、既に私がアルゴリズムの解析は済ませており、ここから資料やパスワード解析ツールのダウンロードzipもできます。
 一応Discord鯖に専用チャンネルも作りましたので、参戦したい方はご来場くださいませませ。
 ……と、ここまでお伝えしたところで前回の妖怪道中記パスワード解析選手権とは異なる点をお伝えします。

1.組み合わせが「50音80種×最大20文字の可変長なのにチェック値が32bit(CRC)」
 妖怪道中記だとパスワード重複が1.6億個でしたが、絶チルDSは理論上で驚異の26,843,545,600,000,000,000,000,000,000個のパスワードが存在していると考えられています。

2.プログラム開発者も誰なのか分からず後ろ盾も判定基準もない
 宇田川氏のようなレジェンドが見守ってくれるわけでもなく歴史的な背景もないため、よほどの奇跡が起こらないと4STネタになりません。
 また、公式パスワードですら「ひしとなこあゆたふやおしなさはちみしゆこ」という完全ランダムとしか思えないものが存在しているため、奇跡的に長文パスワードが見つかったとしても、それが真のパスワードという確証は得られません。

3.もうゲームで使えるパスワードは見つかっている
 今回の選手権を開始した直後に、N64解析の大御所ねこかぶさんが「ぷうぴぜぅ」「ぞづゆらし」「うえうえしたびえぇええるびえみぎえる」という3種の衝突パスワード(※ゲームではしっかり通ります)を発見済み。
 単に桐壺局長が解禁する場面を見たいだけなら、上記3つのパスワードを打てば目的を果たすことができます。

・・

 というわけで、それでもチャレンジしたい方向けの選手権となっております。
 「俺の見つけたパスワードは絶チル原作本xx巻に登場するシーンのセリフだから、これが絶対当たり!!」のような奇跡の発見を果たす、ガチ勢のご参加をお待ちしております。
 ツールは常時差し替わっているので、適当に下記リンクから落としてください。
 Download : https://i486.mods.jp/files/zkpass.zip

~2024.3.30現在の解析ツールの中身~

解析メモ.txt
 パスワード生成アルゴリズム解説
zkpass1
 手打ちでパスワード照合値94AE54E1を探すツール
zkpass3
 大量のパスワードを書いたテキストファイルを一括チェックするツール
zkpass4
 さらにzkpass3を各行を分解して全パターンチェックするツール
zkpass5(これらの中では理論上これが最も新種発見率が高い)
 zkpass4をさらに全行ランダムミックスしてアタックするツール

スーパーバグファミコンをエミュで再現する

※まだ完全ではないので世界中のチャレンジャー求む。
 おそらく完全再現できました。

 先に動画を見ておくが吉。

Youtube : 4ST 次々とゲームをバグらせる恐怖のスーパーファミコン【実態調査編】 

Youtube : 4ST 次々とゲームをバグらせる恐怖のスーパーファミコン【原因究明編】 

 4STシイナさんが調査した結果、スーパーバグファミコンはCPUに実装されたDIV 16/8(除算エンジン)が故障していたのが原因と判明。
 でも、そんな都合よくイイ感じに壊れたスーパーファミコンなんて奇跡でも起きないかぎり手に入りませんし、CPUだけピンポイントで壊すなんてもっと無理。

 ですが、もっと都合良くCPUレベルで破壊できるスーパーファミコン実行環境が身近にあります…そう、エミュレータ(SNES9X)です。
 SFCの除算命令はコード4206…というわけで、まずはSNES9Xのソースコードを眺めます。

case 0x4206: // WRDIVB
{
	uint16 a = Memory.FillRAM[0x4204] + (Memory.FillRAM[0x4205] << 8);
	uint16 div = Byte ? a / Byte : 0xffff;
	uint16 rem = Byte ? a % Byte : a;
	// FIXME: The update occurs 16 machine cycles after $4206 is set.
	Memory.FillRAM[0x4214] = (uint8) div;
	Memory.FillRAM[0x4215] = div >> 8;
	Memory.FillRAM[0x4216] = (uint8) rem;
	Memory.FillRAM[0x4217] = rem >> 8;
	break;
}

 上記ルーチンを書き換えてソースコードをビルドすればスーパーバグファミコン完成~…と出来れば良いのですが、ぶっちゃけSNES9XをWin32ビルドする環境を組むのはアホほど大変です。
 今回は狙いのルーチンだけぶっ壊せれば良いので、SNESエミュレータをハックして解決してみることにします。

 私が解析に使っている、デバッガ搭載のSNES9X亜種「Geiger’s Snes9x Debugger」を逆アセンブルして、00004214、00004215、00004216、00004217に連続アクセスするような怪しい処理を探すと…

---------
:005BC8FB 8B353C056C00            mov esi, dword[006C053C]
:005BC901 660FB69605420000        movzx dx, byte[esi+00004205]
:005BC909 660FB68604420000        movzx ax, byte[esi+00004204]
:005BC911 8A5D08                  mov bl, byte[ebp+08]
:005BC914 66C1E208                shl dx, 08
:005BC918 6603D0                  add dx, ax
:005BC91B 84DB                    test bl, bl
:005BC91D 0FB7CA                  movzx ecx, dx
:005BC920 7411                    je 005BC933
:005BC922 0FB7C1                  movzx eax, cx
:005BC925 0FB6CB                  movzx ecx, bl
:005BC928 99                      cdq
:005BC929 F7F9                    idiv ecx
:005BC92B 0FB7C0                  movzx eax, ax
:005BC92E 0FB7CA                  movzx ecx, dx
:005BC931 EB08                    jmp 005BC93B
---------
:005BC933 B8FFFF0000              mov eax, 0000FFFF
:005BC938 0FB7C9                  movzx ecx, cx
---------
:005BC93B 888614420000            mov byte[esi+00004214], al
:005BC941 8B153C056C00            mov edx, dword[006C053C]
:005BC947 88A215420000            mov byte[edx+00004215], ah
:005BC94D A13C056C00              mov eax, dword[006C053C]
:005BC952 888816420000            mov byte[eax+00004216], cl
:005BC958 8B153C056C00            mov edx, dword[006C053C]
:005BC95E 88AA17420000            mov byte[edx+00004217], ch
:005BC964 A13C056C00              mov eax, dword[006C053C]
:005BC969 881C07                  mov byte[edi+eax], bl
:005BC96C 5F                      pop edi
:005BC96D 5E                      pop esi
:005BC96E 5B                      pop ebx
:005BC96F 8BE5                    mov esp, ebp
:005BC971 5D                      pop ebp
:005BC972 C3                      ret

 というわけで無事に発見。
 ここをエミュレータが停止しない程度に都合よくゲームだけバグるように壊すという、なんとも力加減の難しい作業をすることになります。

・パッチ1「EAXレジスタにFFFFが入ったまま突き抜けるよう分岐破壊

:005BC931 EB08                    jmp 005BC93B << ここを90(nop)で壊す
---------
:005BC933 B8FFFF0000              mov eax, 0000FFFF << 必ず実行される
:005BC938 0FB7C9                  movzx ecx, cx

 本来であればEB08(jmp 005BC93B)でeaxレジスタにFFFFをセットする処理をEB08→9090とすることで直後の4214と4215への書込がFFになり、除算ルーチンが破壊されます。
 ただし効果が強すぎるためか、モンスター闘技場のダメージが異常値になる傾向が強く、FF6の戦闘獲得EXPが16,777,216(0xFFFFFF)固定で仲間の脳力がバグったりと、4STの映像とはかなり異なる挙動でした。

バイナリエディタ用パッチ1
001BC931: EB 90
001BC932: 08 90


・パッチ2「空きメモリに転送してedx+4215だけにFFFF書き込み

 説明すると長くなりすぎるので超ざっくりと説明。

:005BC941 8B153C056C00            mov edx, dword[006C053C]
:005BC947 88A215420000            mov byte[edx+00004215], ah
:005BC94D A13C056C00              mov eax, dword[006C053C]

 これを相対ジャンプで00400500に強制分岐。

:005BC941 8B153C056C00            mov edx, dword[006C053C]
:005BC947 E9B43BE4FF              jmp 00400500
:005BC94C 90                      nop
:005BC94D A13C056C00              mov eax, dword[006C053C]

 飛んだ先の空きメモリで4215に2バイトFFFFを書き込んでから元の処理へ再び相対ジャンプで戻る。

// 本来
:00400500 66C78215420000FFFF      mov word[edx+00004215],FFFF
:00400509 E93FC41B00              jmp 005BC94D // 元のルーチンに戻る

 これで4215への書き込みがFFFFに強制化され、こちらもモンスター闘技場で勝つ都度に11111111ゴールドが入手できるようになります。

 ただし「防御に向かって会心の一撃でダメージ5桁になる」が観測できておらず、FF6も獲得EXP1700万オーバーのため、こちらも不完全な可能性が高いです。

バイナリエディタ用パッチ
00000500: 00 66
00000501: 00 C7
00000502: 00 82
00000503: 00 15
00000504: 00 42
00000507: 00 FF
00000508: 00 FF
00000509: 00 E9
0000050A: 00 3F
0000050B: 00 C4
0000050C: 00 1B
001BC947: 88 E9
001BC948: A2 B4
001BC949: 15 3B
001BC94A: 42 E4
001BC94B: 00 FF
001BC94C: 00 90

~~

 そんなわけで、エミュレータでスーパーバグファミコンを[理論上、再現できる」ことは確定しました。
 皆様は是非とも「DQ5でコイン11111111枚が手に入り、防御に向かって攻撃すると会心の一撃で5桁ダメージが出て、FF6で獲得EXPが1500万程度で、マリオカートでCPUが蛇行運転しまくるdiv16/8破壊パターン」を見つけてみてください。

・2024.3.20追記
 ねこかぶさんトコでSNESエミュレータAresを改造&ビルドするハック方法が公開されました。
スーパーバグファミコン再現したエミュを作成する

 しかも都合の良いことにAresはSNES9Xとは異なる実装になっているおかげで、4215を実行した時に返る値まで自由に調整が可能です。

case 0x4215: return io.rddiv.byte(1); //RDDIVH
を
case 0x4215: return 0xff; //io.rddiv.byte(1); //RDDIVH

 ねこかぶさんは上記のように書き換えを提案していましたが、4STシイナさんのところに届いたスーパーバグファミコンはFF6で15728672ポイントを取得していたので、試しに0xffではなく0xf0に書き換えてAresをビルド。
 その結果…

 無事にスーパーバグファミコンの完全再現に成功しました。
 ドラクエ5の1111111…は現時点では未確認ですが、理論上ダメな理由はないので、おそらくこれでハック完遂ではないかと思われます。

シューテングゲームKG-007届いた

この記事を読む前に以下の動画をご視聴ください。
<YouTube>
 ファミコン人気にあやかり少数作られた今や知る人もほぼいないロストアイテムの全貌を追う!【1980sQUEST】


 そして、連射測定アラーム時計「シューテングゲームKG-007」は無事にクラウドファンディング出資者のもとへとやってきましたとさ。
 ちなみに同ハード、電源はLR44ボタン電池×2の3V駆動となっております。
 ふむふむ。



 まあこうなるよねっていう(USB DC-DCコンバータとブレッドボードワイヤ)

 ちなみにUSB DC-DCコンバータはAmazonで3個999円ですた。
Amazon : https://www.amazon.co.jp/gp/product/B0BQVS6WZ6/

 ぱかっとな。

 ボタンを直列で繋いでるプラスマイナスに電源線を半田付け。

 DC-DCインバータの電圧を3Vに設定し、極性をを間違えないようにプスッとな。

 というわけで、ボタン電池の液漏れに怯えることのないUSB駆動型KG-007爆誕!
 ただし、あまりにも消費電力が少なすぎて、オートパワーオフ機能付きのモバイルバッテリーの電源が「何も繋いでいない」と誤認識して勝手に電源が切れるという、なんとも微妙な使い勝手に。

 コイツもしかして、電卓用の1.5Vソーラーを2個並列で繋いでキャパシタを入れれば電池無しで動くのでは…?

・・

オマケ:基板のボタン実装面の様子

Linkstation LS210Dをスリム化してみた(追記あり)

 家庭用ファイルサーバ(NAS)のBUFFALO Linkstation LS210Dシリーズのハードディスク壊れた後の亡骸を友人に貰ったので、バラして余ってたSSD240GBを突っ込んでみました。
(参考記事:ひこぽんのーとさん)

 ルータ挟めとか色々書いてるサイトが多いですが、ひこぽんのーとさんが書いてるとおり「PCを192.168.11.1に固定してLinkStationにLANケーブル直結でTFTPで流し込むだけ」でも全然いけます。

 ただし、2023年11月27日現在ファームウェアアップデータ1.80はドライブ換装対策されており、EMモードからフォーマットができなくなってます。
 なので、kokosan60氏の記事「LinkStationのHDD総入れ替え」を参考に別モデルのアップデータからLSUpdater.exeをLS210Dのファームウェアアップデータに上書き。
 さらに LSUpdater.ini の末尾に下記2行を追記。

[SpecialFlag]
debug=1

 これでLSUpdater.exeを実行したらタイトルバーを右クリック→デバッグモード→完全フォーマットをチェックし、ファームウェア更新を実行することで、見事に復活!

 そしてここでふと気づく――最近のSATA SSDって中身が超小さいから、殻割りすればメチャクチャ小さいNASを作れるのでは…?

 ドギャーン!

 まあ当然できるわけです!(・Д・)
 体積が10分の1以下まで圧縮されるので、超省スペースな高耐久ファイルサーバとしてうまく活用できそうな感じ。

 ただし、SSDがメイン基板に触れてショートするリスクがあるので、間に絶縁用のクッションなり何なりを入れておくほうが良いでしょう。
 あと、上の写真では銅ヒートシンクがくっついてますが、これは自分で後から付けただけで、標準仕様だと「ハードディスクマウント金具とCPUがくっついて放熱する設計」です。

 ちなみにLinkStation LS210DのCPUはメチャクソ非力なので、転送レートはシーケンシャルアクセスでせいぜい30MB/s程度。
 書き込み中の消費電力が4Wで、アイドル時が3.4W(月の電気代100円以下)と考えれば、人によっては使い道はあるかなぁ、くらいですかね。

~追記~

 Aliexpressで300円前後で売られているUSB5V-DC12V昇圧コンバータケーブルでも起動確認できました(Amazonでも千円くらいなので中華通販嫌いな人はそっちで)
 USB5V/1.5Aあれば楽勝で動くので、災害用ソーラーチャージャー付USBバッテリで動かすのも面白いかもっすね。
 なお、USB-ACアダプタの変換効率にも依存しそうですが、電圧変換がAC100V→DC5V→DC12V…と無駄が多いためか、消費電力が「書き込み時4.6W・アイドル時3.7W」と、わずかに純正ACアダプタより多い傾向にありました(電気代という観点で見ればほぼ誤差ですが)

続続ボコスカウォーズ最強ワザ考察(追記あり)

前回の記事:続・ボコスカウォーズ最強ワザ考察

 前回はボコスカウォーズのROMを書き換えて、マイクカウントを表示できる機能を追加しました。  そしてROMチップ差し替えのためにカセットを殻割りすると――

 オウフ。
 ボコスカウォーズはモールド樹脂固め型とROMタイプの二種類があるらしいですが、見つかるまで殻を叩き割るのはしんどいので、別案を考えます。

~対処方法~

 ボコスカウォーズはマッパー0のPRG32K+CHR8Kカセットなので、同じROM仕様で安価で高確率でROM脚をいじれるタイプのカセットをドナーに使います。
 というわけで「任天堂サッカー」を叩き割って、半田吸い取り器でROMをもぎ取った結果がコチラ。

 このドナーにICソケットを半田付けしたら、ハックROMを用意します。

1.ダンプしたボコスカウォーズのNESROMをバイナリエディタで開き、前回の記事を参考に、マイクカウント集計改造パッチを施してから前半16バイトヘッダを削る。

2.アドレス0000-7FFFをPRGファイル、アドレス8000~をCHRファイルとして個別ファイルに保存。

3.EPROM(27C256)を2個用意し、この記事と同じようにCHRとPRGROMをEPROMに焼く。

4.BAKUTENDOさんの記事を参考に、PRGROMだけ26ピンを浮かせてGNDに落としてソケットに差してください(※CHRを27C64に焼いた場合この作業は不要です)

5.ファミコンに、ROMが奥側になるよう(つまり前後逆)挿入して電源ON!

 これでゲームを開始し、ボコスカウォーズがマイク入力待ち状態で起動し、ゲーム開始時にマイクカウントが表示されるようになっていれば成功です。



 そして何十分もマイクに息を吹き込みまくったり、定格以上の電圧を突っ込んでゲーム音のボリュームがデカくなるくらい昇圧したりと色々試した結果――!

 78…!! 俺の限界は78……!!!!!!!

※これが200以上でなければボコスカウォーズの裏ワザは発動しません。

 ぶっちゃけ、これ無理では???(素)

~追記1~

 この状況を見て、しらかべのジミーさんよりポスト。

 果たして、2023年11月現在ボコスカウォーズの裏ワザを発動できるファミコン実機は日本国内に存在するのでしょうか…?

~追記2~

 2コンをバラしてマイク裏のプラスマイナス端子をドライバーで高速連打しまくることで、マイクカウント102に到達。
 本末転倒すぎますが、スイッチングICを使って強引にON/OFFを繰り返して200オーバーを叩き出せる可能性はある…かも。

~追記3~

 ついに200の壁を突破しました!

 2コンを分解した状態でボリュームを付けずに下写真の赤マルの箇所に指で触れるとスピーカーに強いノイズが乗り、これだけでマイクカウントが100オーバー回転。

 この状態のまま「追記2」と同じスピーカー端子のショート連打を組み合わせることで、228の値を叩き出すことができました(追記:さらに赤マルの触る場所を微調整することで、マイク入力なしで228がでました)

 つまり、指で触れなくてもずっとブ~~~…のノイズ音が入り続けて全自動でマイクカウントが回り、カウント値200以上に上昇する2コンを入手すれば、分解に頼らずに裏ワザを理論上実現可能ということ。
(昔、こういうファミコンちょくちょくあったよねえ)

 ここから先はシイナさんに頑張ってもらうことにして、ウチは筆を置くとします。

~最終追記 2023.12.8 ~

 4STシイナさんがファミコンを50台買う狂気の比較によって、見事に原因を特定し、ボコスカウォーズ最強ワザを確実に成功させることが出来るようになりました!

Temu登録してみました(注意書きアリ)

 プロジェクタが3,000円だのApple Podsもどきが600円だのハチャメチャな値段設定で話題の中華通販サイトTemuですが、ユーザ紹介でぶん回すとバカみたいに大量のクーポンを撒きまくると話題になっているので登録してみました。

 ただしGoogle Playアプリからマルウェアが検知されたこともあるなど、新興勢力だけあってセキュリティ意識がガバガバな印象も正直強いので、捨て垢と格安スマホのショートメール認証で使うのが無難でしょう。

※使い捨てSMSサービスでも行けるかもですが、不審なログインを検知すると再認証が入るので、その辺を考えるなら固定番号が無難かなと。

 2023年10月21日現在は「数百円の買い物を2点すると10,000円クレジットチャージ」という、これまた狂ったキャンペーンをやっているので、とりあえず激安の耐熱手袋とタオルを買いました(‘-`)
 ちなみにクレカやPaypalだけでなく「コンビニ払いもいける」ので、最悪情報を漏らされても即死することはないかなと。

 というわけで「普段からAliexpressとか中華通販に慣れている」「古いスマホと格安SIMを持っている」「不良品を掴んでも泣かない」の三条件を満たせる人は、Googleの捨て垢でTemuに突撃するべし!

~ありがちなアフィリンク~
最大20,000円をもらうために、招待を承認していただけませんか?
こちらをタップして、TEMUで承認しましょう!
https://temu.com/s/I2Sl0lPBdgEAw6

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

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

 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の周期でしか判定できないモノがあるのかもしれません。
 これは複数のチャレンジャーによる検証が必要でしょう。

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


 いつもどおり4STの動画を見て解析チャレンジです。
 ちなみに解析したあと、2014時点でとっくに海外フォーラムで解析済みだったということが判明した悲しい状況だったのですが、まあ供養も兼ねてうpうp。

・ボコスカウォーズの最強ワザとは?
 動画でも説明されてますが、2コンのSELECT+STARTを押しながらリセットボタンを押し、そこで「なってちょんまげってか~」と2コンマイクに喋ると最強になる…という裏技ですが、動画の備考にも書かれてるとおりファミコンのマイクにはON/OFFの1ビット判定しかないので何を言うかは特に意味ありません

 また、周知のとおり2コンにSELECT+STARTは無いので、拡張端子にアスキースティック2台を接続して3コン/4コンの後者を2コンとして使うのが「本家」のやり方ですが、2コンモードへの切り替えスイッチの付いている拡張パッドでも代用できます。

・実際の処理を見てみた
 2コンのSELECT+STARTを押しながらリセットした時の無音ウェイト中に、エミュレータFCEUXでブレークをかけたところ一発で当該処理にヒットしました。
 だらだらと語っても仕方ないので、下記に重要処理を列挙。

// ボコスカウォーズの裏技コマンド判定ルーチン
 00:8030:20 B8 E7  JSR $E7B8 // この先にJOYP2判定あり
 00:8033:C9 0C     CMP #$0C // 0C=1100 = START+SELECT
 00:8035:D0 24     BNE $805B // 押してなければ通常分岐へ
 00:8037:20 B3 F3  JSR $F3B3 // タイトル画面描画コール。潰すと裏技中は真っ暗。
・ループ開始位置
 00:803A:AD 16 40  LDA JOY1 // AレジスタにJOYPAD1上方格納
 00:803D:29 04     AND #$04 // 4と論理積 = マイク判定
 00:803F:F0 02     BEQ $8043 // マイク無音状態なら下行を飛び越える
 00:8041:E6 2E     INC $002E // アドレス002Eに+1 (これが無敵トリガー)
 00:8043:A2 10     LDX #$10 // ここから
 00:8045:A0 00     LDY #$00 // Y++で1~255カウントループ
 00:8047:C8        INY
 00:8048:D0 FD     BNE $8047 // Yがオーバーフローで0になったら脱出
 00:804A:CA        DEX       // Xを減算し#$10が0になるまでループ
 00:804B:D0 FA     BNE $8047 // ここまで無音の要因(ウェイト)
 00:804D:E6 2D     INC $002D // アドレス002Dに+1
 00:804F:D0 E9     BNE $803A // ループ終端
・ループ終了
 00:8051:A5 2E     LDA $002E // Aレジスタにアドレス002Eをロード
 00:8053:C9 C8     CMP #$C8 // ループでマイクに音が入った回数とC8を比較
 00:8055:90 04     BCC $805B // キャリー1(C7以下)なら下行を飛び越える。
・ここで最強フラグを立てる処理(0014=FF)
 00:8057:A9 FF     LDA #$FF // アドレス0014に
 00:8059:85 14     STA $0014 // FFを書き込み=これで最強フラグON
・ここから本来のタイトル画面処理へ
 00:805B:20 E5 E2  JSR $E2E5
 00:805E:A9 00     LDA #$00
 00:8060:85 3F     STA $003F = #$00
 00:8062:A9 00     LDA #$00

 赤文字の箇所が注目ポイントです。
 処理としては「256回のループの中でC8(200回)以上マイクがONであれば最強フラグがONになる」という感じ。
 マイク信号を常時ONにするとループ255回目でオーバーフローで0に戻るはずなので、SELECT+STARTを押してリセットした後にほんの少し(コンマ秒)くらいの間を開けてから音楽が流れるまでマイク信号を入れ続けるのが正解と考えられます。

 シイナさんが実機で何度やってもダメだったのは、たぶんセリフが早すぎてマイク信号カウント200に到達してないのが原因かなと。
(※追記:シイナさん曰く、ずっと声を入れっぱなしにした時もダメだったらしいので、本体の経年劣化でマイク入力を取りこぼしてるケースもありそうです)

 動画で行っていた「マイクを固定してすぐに音声入力できるようにするアプローチ」は正しいはずなので、後はタイトルBGMが流れるまでマイク信号を入れ続けることが出来るかどうかが勝負所でしょう。

・エミュレータでやるなら「VirtuaNES 0.97」が良い感じ
 NESエミュレータVirtuaNES 0.97は、2コンのコントローラ設定に「任意キーにマイク信号の割り当て」があります。
 2コンのSELECT+STARTを押しながらF2(ソフトリセット)を押し、音楽が鳴るまでマイク割り当てキーを押下すれば、002EのカウンタがちょうどE0オーバーくらいまで回るので、確実に裏技が成功できます。

・・

 とりあえずウチはここまでで作業を終わるので、後は他の人に任せるのですん。
 それと、Xでの解析ツリー中に助言をいただいた、おばきいさん&たちばなみおさん、ありがとうでした(’ω`)ノ