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