[$AB], Y - SNES CIC Bypass

FX-951を買っていろいろできるようになったので。

カートリッジなし駆動

先行事例 - ファミコン

以前「RAM内で実行コードが完結していればカートリッジが挿さっていなくても動作する」という仮説から、 ファミコンにてROM領域やPPUアドレスバスのオープンバス挙動を調べるテストROMや、Resume cartridge(ステートロード)を作成しました。

ファミコンではうまく機能しましたが、NESは未所持のため確認できていません。
おそらく、CICの状態不一致によりリセットが発生してしまうでしょう。

スーパーファミコンもまたCICが搭載されていますが、回路図を眺めるとCIC以外に接続確認をおこなっている信号がないため、ファミコンと同様にROM領域を実行さえしなければ動作可能に見えます。

厳密にはROM領域も実行可能ですが、未接続のROM領域はオープンバスとなり、65C816のMDRの値(WDCのマニュアル P.36や、実際の観測値が参考になります)が都度読み込まれるため、制御が難しい事実上暴走状態となります。

また、Super FXは SCMR.RON = 1 の時にROMを占有するため、その間SNES CPUはRAMに退避してROMアクセスをおこなってはならない事例が当時からあったようです。

CICバイパス基板

SRAM未搭載のジャンクソフトを適当に見繕い、ROMチップを取り外します。
端子部上のレジストを剥がし場所を確保して、ケーブルをはんだ付けしていきます。
今後別用途でも使えるようにブレッドボードへ引き出すためと、被覆を剥くのが面倒くさかったのでデュポンワイヤーにしました。

CICバイパス基板

この際、CIC関係のピンだけはドナーカートのものを使用するようにして、配線はおこなわないようにします。
24, 25, 55, 56 の4つ。

ピンスロットコネクタをこれまた雑にピンヘッダで間隔やピッチ変換をしてブレッドボードに接続できるようにしました。
2.5mm→2.54mmピッチへの変換は結構無理矢理。

FXPAKからRAMにジャンプして画面更新をおこなうテストROMを起動し、FXPAKを引き抜きます。
画面の暗転やCPUリセットは発生せず、画面描画が継続されました。

よって、CICさえ騙してしまえばファミコン同様に活線挿抜が可能であることがわかりました。
こんな面倒なことしなくても本体側のCICを黙らせちゃえばいいんですけどね。

FlashROM 置換

また適当なジャンクソフトを用意してROMチップを取り外してICソケットに交換します。
あ、これHiROMじゃん…。

ソケットに挿すFlashROMを用意します。
ファミコン用に確保していたFlashROMおよび変換基板を使用しました。ありがとうございます。

とはいえスーパーファミコン用のkazzoなんてものはないので、元のFlashROMのDIP版ピン配置となるような変換基板を作成してROMライターで書きこむようにします。
自作変換基板は繋ぎ間違えのせいで配線量が多くて半日ほどかかりました。
とはいえ書き込み装置自作は転送プログラム開発含めたらもっと時間かかるからね…

ROM書き込み

制御信号(マスクROMには /WE がなく、書き込み時には何とかする)の取り扱いが不適切で書き込んだ内容がカートリッジからうまく読みだせず、 しばらくデータシートと回路図を眺めたり、アドレスバスを手動で切り替えてデータ出力をLEDで読みだしたりしていました。
抵抗付きLED初めて使ってみましたが便利ですね。

はんだごて経由でカッターの刃を温めてホットナイフにして、FlashROMが位置するカセット裏をくりぬきます。
ケースを開けなくてもFlashROMが抜き差しできるようになり書き換え効率が

カセットを挿しこむ

…。
次は低ピンソケットを使おう。

早速CICバイパス基板が本来の目的とは異なる形で役に立ちました。
ケースに入れなければ挿さるんですけどね。

適当なHiROMのテストROMを書き込んで、動作確認ができました。

疑似ステートロード

「先人が思いついたけどあえてやらなかった」こと

ここまでたどり着いたらあとはメインメモリが許す限り文字通りなんでもありです。
任意のメモリ状態に初期化して、カートリッジ交換後に任意のアドレスへジャンプすれば実機ステートロードの完成です。

ステートロード自体はFXPAKがもう実現しているし、カートリッジ側のSRAMや拡張RAM、コプロセッサの細かい状態調整までは容量的に厳しいので実用性は劣ります。

SMW Credits warp

手っ取り早く効力を示すためにスーパーマリオワールドのエンディングに直行してみましょう。
リセットベクタからの起動シーケンスやゲームモードを雑に解析して、なるべく少ない手続きを構築します。

  • I/Oレジスタの初期化
  • $7F8000 OAM初期化コードの生成(Dレジスタを使うようにするとコード生成時も実行コード共にサイクル数もバイト数も削れるのに…)
  • サウンドドライバーの転送
  • メモリ初期化
  • サウンドデータの転送
  • ウィンドウHDMAの有効化
  • エンディング遷移用メモリ設定
  • メインループ(ゲームモード処理へのテーブルジャンプ)

少し前にHello, Worldを表示するプログラムを作っていたので、雑に組み込みます。
組み込みました。

SMW Credits warp 実行

Full版はYouTubeまで。

英語版、日本語版両対応させたつもりです。他バージョンは知らん。

カートリッジ交換検出としてチェックサム一致を一定回数連続成功するチェックをしていますが、接続が不安定なためか半分くらい失敗します。
要検討課題ですが実証自体は成功したのでたぶんやらない。

さらなる高みへ

カートリッジには /CART 端子というものがありましてね?

ピンスロットコネクタがもったいないのでやめましょう。

さいごに

Q. ○○に使えますか?

A. うるせえナンセンスなことすな。

諸注意

機器の改造・破壊は自己責任の下おこなってください。
当記事によって発生したいかなるトラブル・損害に対して責任を負いかねます。

更新履歴

  • 2022/08/07 初版作成
  • 2022/08/10 誤字脱字修正