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

※まだ完全ではないので世界中のチャレンジャー求む。

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

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破壊パターン」を見つけてみてください。

シューテングゲーム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での解析ツリー中に助言をいただいた、おばきいさん&たちばなみおさん、ありがとうでした(’ω`)ノ

低手数料の投げ銭システム「魔法都市」登録しました(追記あり)

デコレーションスクリーン ソーシャルギフト&チップサービス
魔法都市(https://maho.city/)

(ざっくりと3行で)
1.新たな投げ銭サービスが誕生。決済手数料が10%程度と激安。
2.YouTuberだけに限らず、あらゆる人が利用可能。
3.送金はクレカで。投げ銭を受け取るには運転免許証や銀行口座が必要。

以下、本文。

 毎度おなじみYouTubeチャンネルの「4ST」のシイナさんが新法人ビットノート合同会社を設立し、任意のクリエイターに手数料10%以下の低手数料投げ銭できるサービス「魔法都市」をリリースしました。

 2023年9月30日現在はクレカ以外の決済方法が無いため、必然的に利用者は成人以上に限定されますが、スパチャなど大手投げ銭サービスは30~47%ほどの手数料を抜かれて運営会社にほとんど吸い取られ、推しにほとんど届かないという事実を考えると、極端に手数料が低めに設定された同サイトが高シェアを獲得すれば、多くのクリエイターにとって有意義な存在になりそうです。

 イラスト・ウェブ小説などのクリエイターサイトによっては投げ銭リンクを禁止している場合もあるので利用規約を要確認ですが、とりあえずX(Twitter)を使っている創作界隈の方々は登録&プロフィールにリンクを載せておくが吉でしょう。

とりあえずウチのプロフィールリンクもうpうp
https://maho.city/@imaha486

~追記~

 魔法都市では大半の行動が「マイページ」で行えるようになっていますが、投げ銭を受け取るためには本人確認が必要です。
 マイページ→本人確認 機能限定解除のページを開いて、運転免許証など身分証明として使えるカードをスマホで撮影→アップロードして審査を受けましょう。

 運営会社については特定商取引法に基づく表記を参照。
(弁護士が各機能を随時チェックしているらしいので、法的な問題も無さそうです)

 また、受け取った投げ銭の出金条件が「(資金決済法の都合上)半年ごとにリセット」「最低出金2,000円以上」=半年で総額2,000円以上稼ぐ必要アリと、少しシビアな設定になっているので、この点は注意。
※半年という条件は法的に変更できないものの、アマギフなどもっと低額なものにコンバートできる仕組みは今後あるかも。

カセット抜き差しをエミュで実装

いつものように、4STの新作を見ててふと思う。
「これメモリのゼロクリア処理をカットすればエミュレータでも出来るんじゃね?」


まあ出来ました。

(使用例)
1.SHIFTキーを押しながらスーパーマリオブラザーズのROMをロード。
2.テニスのROMをロード。
3.BGMが消えてから8歩進んでスーパーマリオのROMをロード。
4.タイトル画面でAボタンを押しながらスタートで9-1へ。

エミュレータのダウンロードリンク。
Download : nesterj-hack230905.zip

修正したソースも同梱しているので「他人の野良ビルドなんて怖くて使えねーよ!!」という人は、本家NesterJのソースコードと組み合わせて使うが吉。
※最近のVisualStudio用に再調整するの死ぬほど大変だと思うけど。
 ちなみに上記アーカイブには「カセットずらし版NesterJ」も同梱してるけど、これについてはココ参照。

ピュアオーディオの個人的終着点

どーん

 当ブログでは数年前から中華USB-DACで「良い感じのオーディオ環境」を作ってきましたが、最終的に着地したのは結局ハイエンドというオチ。
 ぶっちゃけ物価が上がる前にその当時から揃えた方が5万円以上安く済んだので無意味に遠回りしただけでしたけど、とりあえず最終構成を列挙。

・ヘッドホン SONY MDR-Z1R (URL)
 ソニーストアで定価253,000円!!!
 いきなり出オチが酷いですが、これだけコスト投入して音が良くないわけがない。
 一度コイツで音を聴いてしまうと、数万円クラスが「プラスチックとか紙がペコペコ鳴ってるように聞こえるようになる」という呪いにかかるので、正直SONY MDR-M1STで満足する方が幸せな気がします。

・USB-DAC GUSTARD A18 (URL※注:再入手不可)
 旭化成AK4499搭載のハイエンドUSB-DAC。
 ただし2020年の工場火災でAK4499の生産ラインが焼けてしまったので、今現在入手できるのは後継のAK4499EX搭載のものを買うしかないうえ、価格もかなりお高め。
 自己責任ですが、デッドストック品のAK4499を流用したと思われるZishanのDual AK4499+MUSES02のヤツ(色:H)が、6万円未満で最高峰の音が鳴る可能性アリ。

・ヘッドホンアンプ Cayin iHA-6 (URL)
 AK4499に無駄な味付けをしないため、フルディスクリートヘッドホンアンプとしては最安のこちらをセレクト。
 ところが数年前に購入した当時は6万円だったのが、物価高の直撃を受けて2023年現在は10万円超というとんでもない値段に。
 GUSTARD A18のXLR3pin(L-R)から出てきた音をコイツに入れると、そのままフロントのXLR3pin(L-R)および、XLR4pinに同時出力されるので使い勝手は大変ヨシ。
 なお、SONY MDR-Z1Rを接続するため、ヘッドホンケーブルはXLR4pin-3.5mm×2バランス接続の特注品を利用してます(ヤフオクとかメルカリで7,000円くらい)

・再生用PC GMKTEC ミニPC-M2 Core i7-11390Hモデル(URL)
 Amazonで売られている中華PCで、普段は5万円前後ですが「クーポンの設定ミス(?)で一瞬だけ35,496円になった」瞬間にポチってオーディオ専用PCにしました。
 そういう変わり種を狙わなくても、2.5万円前後で売られているINTEL N100搭載の省電力PCを使っても全然アリだと思います。

・再生ソフト TuneBrowser Full version有料版(URL)
 私の使い方ならフリー版でも良いのですが、たった3,080円で作者の開発の足しになるのなら、適切な出資と言えます。
 また、前述のミニPCがCore i7+メモリ32GB+SSD1TBでオーディオマシンとしてはやたらとパワフルなので、TuneBrowserのRAMdecodeを有効にして利用しています(※HDDアクセス時のノイズを消すためのバッファリング機能ですが、SSD環境だとおそらく音質に影響ないです)

・安定化電源 Weiduka AC8.8 (URL)
 普通の環境には要らんのですけど、我が家のAC100Vは微妙に不安定で時々モニタにノイズが走るので、コイツをかましてます。音質への影響は謎。

・USBアイソレータ TOPPING HS02 (URL)
 中華PCのACアダプタが信用ならないので、USB-DACを守るため電気的に絶縁するUSBアイソレータを入れてます。
 これでPC側のノイズがヘッドホン側の回路に流入せずに済むので高音質~……って、そんなもん人間の耳で分かるわけねえです。
 ちなみにTOPPING HS01という廉価版があるものの、やたらと激しい発熱&熱暴走で認識しなくなるトラブルが多いので、安定通信できるHS02が発売した今となってはそちらを買う利点はありません。

~接続イメージ~


 総額は……考えたら鼻血が出そうなので、考えないことにしよう。

~音質レビュー~

 SONY MDR-Z1Rに関してはあらゆるサイトで解説し尽くされてるので、ウチみたいな三下が偉そうに語るべきではないですが、BS-TBS火曜日23:00放送の「X年後の関係者たち」のメインテーマ曲 fox capture plan/エイジアン・ダンサー は、それまでSONY MDR-M1STでは感じられなかった「左右に流れるメロディの位置」がハッキリ聞き取れるように。
 また、Pure3 Feel Classics/Feeling Heartは楽器ごとに鳴っている場所の違いが聴き取れるようになったりと、音の情報量が猛烈に増えます。
 最初に述べたとおり、今後は人から数万円のヘッドホンを借りてもショボく感じる呪いにかかり、完全にヘッドホンへの物欲が消失します。

「お高いヘッドホンに憧れ続けるほうが、もしかして幸せなのでは?」

 そんなことを考えながら筆を置くこととします。