見出し画像

最近任天堂から出ているGame and Watchを改造して遊んでいるので、そのメモを残しておく。

ちょっと前にやったことで、忘れてたりするので、何かエラーが出たりとかしたらコメントもらえたら、そこはこうしないとダメですねー、とか言えると思うし、本文も修正しようと思います。さて。

最近Nintendoからマリオとゼルダのゲームウオッチが出ていて、それを改造して遊んでるので、それのメモを置いとこうと思う。私は基本全ての作業をmacで行なっているので、mac用のメモになるけど、linuxでもほとんど変わらないと思う。brewがapt-getなくらいで。windowsの人は仮想環境とかでもいいからlinux環境を用意したほうが、USBドライバの絡みとかとの兼ね合いで楽だと思う。

gnwには内部フラッシュと外部フラッシュがあって、自分がどっちを書き換えたいのか、書き換えているのか、把握しておくといいかもしれない。基本的にgnwの改造でできることって、今の時点ではエミュレータをブチ込むこと。だから「バックアップを取り終わったら」ゲームウオッチ本体の外部フラッシュチップは付け替えたほうがいいと思う。ROM入れるスペースが全然ないので。付け替えるチップは MX25U12835FM2I-10G (128Mbits/16Mbyte) か、MX25U51245GZ4I00  (512Mbits/64Mbytes) がメジャーっぽい。後者はヒートガンとクリームハンダが要るみたいね。ハンダに失敗すると動作しないばかりか、ヘタをすると基盤上のチップ抵抗が飛んでバッテリー駆動しなくなったりするので、くれぐれも注意。特にマリオはハンダ付けミスって死んでる個体の話を割と聞くので。

gnwにはUSB-Cのポートが付いてるけど、これは信号的には繋がってない電源だけの口みたいなので。その代わり、基盤上にポートが出てる。なので、ここにクリップつけて中身を書き換えたりする。ここにつなぐには、J-LinkとかST-Linkとかが必要。ST-Linkならamazonで数百円で買えたりするので、これを買っとくといいと思う。

あとは精密ドライバー類。Y字ドライバが必要になるので、これも買う。インドネシアのお友達は、このYネジ潰してJoy-Conを修理不可にしたりしてるので、いいドライバーがあると楽だよ。Joy-Conで思い出したけど、gnwのバッテリーはJoy-Conのバッテリーと共通っぽい。

arm用のgccが必要になるので、入れておく。
$ brew install gcc-arm-none-eabi

PCとST-Linkを繋いで、SWDIO, SWCLK, GNDの3本をgnwに繋ぐ。ST-Linkはものによってピンの配置が違うので、ちゃんと確認する。
マリオの基盤側は 1=SWCLK, 3=GND, 4=SWDIO。
ゼルダの基盤側は 3=SWCLK, 5=GND, 6=SWDIO。


まずは、flashloaderを用意する。これはgnwのフラッシュを読み書きするのに他のいくつかのツールが利用する。STM32のDriverフォルダが必要になるので、適宜用意して、このフォルダにぶち込んでおく。


次にbackupをする。この後色々するのにフラッシュの中身のバックアップは必須なので、この段階が終わったら、バックアップはクラウドとかにぶっ飛ばしておく。何に使うかよくわからないけど後々無いと困るファイルは、クラウドに置いておくのが吉。私はVault(金庫)っていうフォルダを作って、なんでもそこにぶち込んである。
これには5つのスクリプトが入っているので、順番に実行する。
1=動作環境チェック、2=外部フラッシュのバックアップ、3=内部フラッシュのバックアップ、4=デバイスのアンロック、5=アンロック後のフラッシュ書き戻し。
失敗しても焦らず、ピンの接続をしっかり確認してやり直す。もしフラッシュの読み書きに失敗するようであれば、バッテリーをつけ外しして電源を入れ直すのだけど、その時にコマンドを実行するまで電源ボタンを押しっぱなしにすると、割とうまくいくっぽい。
$ ./1_sanity_check.sh stlink mario
$ ./2_backup_flash.sh stlink mario
$ ./3_backup_internal_flash.sh stlink mario
$ ./4_unlock_device.sh stlink mario
$ ./5_restore.sh stlink mario
もちろんjlinkを使っているのならstlinkはjlinkに置き換えだし、gnwがゼルダならmarioはzeldaに置き換える。バックアップはbackupsフォルダ内に生成されるので、どこか安全な場所に保管。


フラッシュの書き込みにはopenocdを使うのですが、フラッシュのバンクに対応したクイックハックがされた改造版openocdが必要になります。これを入れないとエラーが出ますので、入れてください。入れる前にautoconfとpkg-configが必要になるかもしれません。私はmac環境でなったので入れました。
$ brew install autoconf
$ brew install pkg-config
$ brew install texinfo
$ export PATH=/usr/local/opt/texinfo/bin:$PATH
$ cd openocd-git
$ make mac
$ cd openocd
$ sudo make install
$ PATH=/opt/openocd-git/bin:$PATH


次にpatchを当てます。これは何かって言うと、エミュレータの起動の為のキーコンビネーションを用意したりだとか、その他諸々の機能を付ける為のもの。マリオのバッテリー駆動時の自動スリープを切ったりとかもできる。これを使わないとエミュレータ専用機になってしまって、gnwが元々持ってる機能が無くなるので、使ったほうがいいと思う。パッチは先に取ったフラッシュのバックアップに当てるので、このフォルダのルートにコピーしておく。外部フラッシュを使わないように元々のデータを圧縮したりして内部フラッシュに書き込めたりもするのだけど、SMB2のクリア記録が保存されなくなるのでお勧めしない。

# 依存関係のインストール
$ pip3 install -r requirements.txt
$ make download_sdk
# マリオの場合
$ make clean
$ make PATCH_PARAMS="--device=mario --disable-sleep" LARGE_FLASH=1 ADAPTER=stlink flash_patched
# ゼルダの場合
$ make clean
$ make PATCH_PARAMS="--device=zelda" LARGE_FLASH=1 flash_patched


エミュレータ本体はretro-go。以前はkbeckmannさんの物を使っていたけれど、現在はsylverbさんのフォークを使っている。こちらはNESのコアがFCEに変更されていて、ディスクシステム(fds)が動くし、i18nも進んでいて、日本語の翻訳は私が作らせていただいた。色変更やCoverflow/Coverlightなどがあって、機能的に充実しているので、sylverb版をお勧めしておく。biosファイルやromファイルはそれぞれromsフォルダの下の機種別のフォルダの中に入れておく。fdsはnesの中。

# これを忘れると普通のopenocdが使われて書き込めなかったりする。
# .zshrcに書いてしまった方がいいかもしれない。
$ export OPENOCD="/opt/openocd-git/bin/openocd"

# マリオ(sylverb版)の場合
$ export GNW_TARGET=mario
$ make clean
$ make -j8 COVERFLOW=1 EXTFLASH_SIZE_MB=63 EXTFLASH_OFFSET=1048576 INTFLASH_BANK=2 flash

# ゼルダ(sylverb版)の場合
$ export GNW_TARGET=zelda
$ make clean
# 60のところは、付け替えたフラッシュのMBytes-4する。
$ make -j8 COVERFLOW=1 EXTFLASH_SIZE_MB=60 EXTFLASH_OFFSET=4194304 INTFLASH_BANK=2 flash

# マリオ(kbeckmann版)の場合
# 63のところは、付け替えたフラッシュのMBytes-1する。
$ make clean
$ make -j8 EXTFLASH_SIZE_MB=63 EXTFLASH_OFFSET=1048576 INTFLASH_BANK=2 flash

# ゼルダ(kbeckmann版)の場合
$ make clean
# 60のところは、付け替えたフラッシュのMBytes-4する。
$ make -j8 EXTFLASH_SIZE_MB=60 EXTFLASH_OFFSET=4194304 INTFLASH_BANK=2 flash


基本的な技
・フラッシュに書き込みをする時はgnwを時計モードに。
・フラッシュに書き込み失敗したら、バッテリーをつけ外しする時からフラッシュの書き込みまでの間電源ボタンを押しっぱなしに。
・エラーが出た時はpathが通ってるかもう一度確認。
・エミュレータの下画面がぐちゃぐちゃだったりしたら、フラッシュチップのハンダ確認。


昔はエミュレータを元々のgnwのゲームと同居させるのにソースの書き換えとかが必要だったのですが、現在は必要なくなりました。動かなかったら、エラーメッセージの内容をよく読むといいです。大体の場合、pathが通ってないか、依存関係が何か足りて無いだけなので…。

まぁこんな感じで私はごちゃごちゃやってたらできました。何かエラーが出てできなかったら、コメントくれれば気まぐれに返信したり修正したりするので、よろしくです。

おそらくコンソール改造界隈では有名なyyoosskさんが、gnwの改造絡みでtwitterでリプくれたりしたのは、うれしかったなぁ。

2023-07-15 retro-go(sylverb)に関する追記とファミコン生誕40周年
2023-07-11 マリオを外部フラッシュを使ってSMB2が正しく動作するように変更


この記事が気に入ったらサポートをしてみませんか?