「GAME & WATCH スーパーマリオブラザーズ」、例のごとく分解・魔改造していきます。
基板の詳細な画像などは、例えばこちらとか
もっときれいに分解しているほかの方のサイトがありますので、
そちらのほうを是非参照してください…
ゲーム&ウォッチ分解した
— ひろみつ(honeylab) (@bakueikozo) 2020年11月13日
うええええええ!!!!STM32!!??!!!?まじか!! pic.twitter.com/3hhfWqPacW
はい、我々甘ちゃんなので、このハード、いつものようにLinux+エミュで構成されているものと思い込んでNintendoのOSSサイトをリロードしまくっていたのですが、その期待を全力で裏切って、STM32という極めて効率的なハードを選定してきました。
改めてゲーム&ウォッチのスペック
— ひろみつ(honeylab) (@bakueikozo) 2020年11月13日
CPU:STM32H7B0 最大280MHz,Flash128kB内蔵。たぶんここにメインのプログラムも書かれてる(と思う)
最近のミニのLinux SoCじゃなくて、「マイコン」寄りのチップ。
いわゆるOSは入っていなくて、普通にマイコンのプログラム。https://t.co/Z7uHmWtxZ3 pic.twitter.com/nqZ6Qfz7fk
基板をよく見るとわかるのですが、メインクロックの水晶振動子は実装されず、代わりに32.768の時計 RTC用の水晶が実装されています。
メインクロック端子が未接続で、時計用のだけ繋がってる。ほんとにスリープ時に時計動作に切り替えてるみたいだな。メインクロック内部なのかな? pic.twitter.com/qiVR2Ijaek
— ひろみつ(honeylab) (@bakueikozo) 2020年11月14日
このため、スペック表にきちんと月差を記載することができたんですね。
任天堂さすがすぎる。
液晶はINNOLUX製おそらく320x240と思われました。
なか開いたところ pic.twitter.com/hXn0tOKQGq
— ひろみつ(honeylab) (@bakueikozo) 2020年11月13日
この形のフレキ/コネクタ なんて名前で探せばいいんだろう pic.twitter.com/1skhkwNKLL
— ひろみつ(honeylab) (@bakueikozo) 2020年11月15日
この型番でググっても何の情報も出てきません。カスタムだと思われます。
基板上にはゲームのROMや動画像データが収録されていると思われるFlashが実装されていました。
ROM:MXIC MX25U8035F (8MBit = 1メガバイト)
— ひろみつ(honeylab) (@bakueikozo) 2020年11月13日
吸い出しはできたけど、中身はデコードできてない。
CPUにアタッチしたハッカーによればこの中に暗号化されたROMが入ってるのは確定っぽい。https://t.co/Yz89UkPaeS pic.twitter.com/XHVeJhZSKn
中身を読みだしてみましたが、完全にランダムであり、圧縮か暗号化が全体にかけられているものと推測されました。この時点で私は割とスキル不足で完全解析をあきらめましたw
FLASH読んでみた。とりあえずなんかしらの暗号化かな。キーはMCUの中、多分リードビットは落ちてるんだろう。
— ひろみつ(honeylab) (@bakueikozo) 2020年11月13日
わかんない他人向けに書くと、さっと他のROMを突っ込むのは今は出来ないです。
というわけで、I/Fを生かしてSTMでなんか描くことのできる良い評価ボードにはなり得る、かなw pic.twitter.com/fx5wxeRRn3
仮に内蔵されているROMイメージを既存の別のROMイメージに書き換えたとしても、内蔵エミュレータはおそらくマリオブラザーズほぼ専用になっていて、それ以降に発売された、標準マッパー以外のROMイメージなどに対応させるのは困難だと思われます。
そのため、そういった改造を行うには汎用のNESエミュレータをポーティングすることが一番の近道になります。
この評価基板(言い切った)、CPU内蔵Flashへの書き込みやデバッグのためのSWDポートがきちんと残されています。
SWDポートにSTLink繋いで適当にビルドして突っ込んだら動くよ。
— ひろみつ(honeylab) (@bakueikozo) 2020年11月19日
ああその前にRDPv1をunlockしないとだけど。その時に内蔵ファーム飛ぶけど。 pic.twitter.com/rndpsNFzJ3
ST謹製の開発ツールでCPUを指定し、C言語でプログラムを書き込むことで自由にプログラムを動作させることができます。
また、通常の開発環境であれば、書き込まれたプログラムの読出しやデバッグが可能ですが、さすがにこの辺はプロテクトがかかっていて、単純に読み出すことは不可能でした。加えて、私の持っているツールでは高度なデバッグ操作ができないようで、その辺はもうあきらめることにしました。
ということで、この基板をSTM32H7の評価基板として使い倒すための調査を行いました。
ボタン配線などは割と簡単にパターンをたどることでわかります。
LCDの配線もデータ、クロックなどはSTM32内蔵のLCDドライバのピンアサインをもとに推測、およびトレースで判別させました。
STM32とLCDフレキの根元当たって、LTDCのデータピンマップがあってることは確認できたけど、肝心のENが見つからないなぁと考えてたが、どうやらSPIでの初期化っぽい。ここまでわかればLCDONにできるやろ pic.twitter.com/Ckk3b2oAMh
— ひろみつ(honeylab) (@bakueikozo) 2020年11月24日
しかし、どうやらLCDの初期化にはSPIでコマンドを投げてやる必要があるらしいということがわかり、ロジックアナライザでの解析を行いました。
うーんうーん… pic.twitter.com/kn31szlNse
— ひろみつ(honeylab) (@bakueikozo) 2020年11月24日
どうにか初期化シーケンスが判明し、LCDにフレームバッファの内容を表示させるところまでは到達しました。
後はボタン、音声周りですが、ここはまぁそんなに難しくないと思います
STM32評価ボード、LCD初期化コードに辿り着くまで時間がかかったのでようやくここです
— ひろみつ(honeylab) (@bakueikozo) 2020年11月25日
FramebufferをARGB8888で取ってフル転送なので、これで10fpsぐらいしか出てないね
565にすれば事実上倍は出るはず pic.twitter.com/b5SnIvFKwN
が、まぁここから先はぶっちゃけ誰でもできるので…w
なんか面白いネタ無いかなぁ…w
海外のハッカーの人がFlash内の解読、再Packに成功したようで、ROMイメージの書き換えなどには成功しているようです。
おそらくこちらの方が最速で突っ走っているかと
ところで、みんなが期待している簡単にROMを差し替えるツール的なもの、
今回のハードに関してはそもそも、USBコネクタの配線がSoCまで届いていないこと、
プログラムの書き換えには専用のハードがいることから、
特定の電子工作マニア以外にはおそらくできないものになると思います。
例えばCPU内蔵のプログラムの書き換えには
こういうのが必要
とか
FlashROMの書き換えには
こういうのとか
ここはハードの制限なので、ソフトではどうにもならんですねぇ。