レトロフリークカートリッジアダプタ活用テクニック(3)SFメモリカセットの書き換え


俺が、俺たちが、Loppiだ...!(ただし遅い)


このページについて・概要
このページではSFメモリカセット書き換えについて調査を行った内容を記しています。そのような能書きに興味はねえ!すぐ書き換えをやってみたいんじゃ!という方は こちらをどうぞ。
別のプラットフォームでSFメモリカセットの吸出し&書き換えを行いたいと思う方には、本ページの内容が参考になると思います。


SFメモリカセットの内容を書き換えろ!
前からやってみたかったSFメモリカセットの書き換えに着手しました。
書き換えは、先人の知恵を借りて(具体的には、こちらのarduino用ソースNP.inoに、書き込み処理がある)、それらの処理を移植すればいっか、と思っていました。

これによると書き換え用イメージは、SFメモリカセットを一括で書き換えるようなイメージを前もって用意しておく必要があるようです。 イメージ作成は、SF-Memory-Binary-Makerというツールを使えばよさそうでした。
ただしイメージ作成の注意として、前もってSFメモリカセットからMENU PROGRAM部のみを吸い出しておく必要があります。このため、自作ツールでも「[SFM]Wakeup&ゲーム選択吸出し&ROMファイル作成」で、MENU PROGRAMのみを吸い出せる機能を付けました。0番のゲームが常にMENU PROGRAMです。

SF-Memory-Binary-Makerでは「mapping」というデータ(マップ情報)というデータも出力するみたいですね。ほーん、何に使うんだろ、とりあえず後回しでいっかな。(のちのち、これが大ハマりの原因になりますが、後述します)


SFメモリカセットの書き換えが遅いのだが・・・?⇒プロトコルの仕様とシリアル通信速度が原因です!
SFメモリカセットの内容書き換えは、
ということが分かりましたので、NP.inoを参考に実装してみました。
実際に動かすと、お、遅いな・・・!?C0チップ1つだけで1時間程度、SFメモリ全体で2時間くらいかかりました。
昔の人がいくら我慢強いとはいえ、ローソンのLoppiで書き換えサービスを申し込んで、2時間待ちなんて長すぎだろ!?

一応、最大限頑張りましたが、この速度が現状の最大速度です。
RFCAを使ったカセットへの書き込みは、

(1)カセットへの書き込み要求コマンドをRFCAに送信
(2)RFCAからの肯定応答を受信
(3)書き込みデータをRFCAに送信
(4)RFCAからの肯定応答を受信
・・・

という手順を踏んで行う必要がありますが、このやりとりがボトルシップ・・・いやボトルネックになっています。バースト書き込みコマンドのようなものが見つかれば、もっと速くなるかも?
また、PCとRFCA間のシリアル接続速度が115200bps(?)なのも原因ですかね?
レトロフリーク実機とRFCA間の通信はもっと速いはずです。というのも、1本のカセット内容吸出しにかかる時間も、本サイトで紹介している自作プログラムより断然短いためです。
CDCデバイスの初期化処理で、もっとなんかやりようがあるのだろうか・・・?

ただし、データ通信自体はできているので、この問題は後回しにしています。
解決策が、見つかるといいですね!(他人事)


実機上でゲーム変更できません(マップ情報書き換えの必要性)
長時間の書き換え時間を経て、いよいよ書き換えたSFメモリカセットを実機上で動作チェックしてみました。
・・・が、メニュープログラム、1本目のゲーム選択までは行えたのですが、2本目以降のゲーム選択が行えません。
書き換えに使った元のSFメモリカセットは、トルネコが1本のみ入っていたものでした。
ああ!ここの処理でマップ情報を見てるんだ!?と気づきました。おそらくマップ情報未書き換えでも、古いトルネコの情報を使って1本目のゲームへの切り替えのみが行えたのでしょう。

マップ情報は、C0/E0のチップ上の、隠しセクターに存在するようです。これらの情報は、ROMファイルとは別個の情報となります。
だからSF-Memory-Binary-Makerでは「mapping」出力機能があったのかあ・・・。
というわけで、マップ情報の書き換え機能も実装することになったのですが・・・

うおーなんで切り替えられないんじゃあ!?
見えにくいが1本目:ヴァルケン、2本目:キャラバンシューティング、3本目:スマッシュTVを書き込んである


最終・最大ハマりポイント「C0チップのマップ情報が消えない!?」
マップ情報の書き換えはゲーム本体ROMと同様、イレーズ&消去の組を実施することになります。
NP.inoを見ると、以下のような処理を実施しているようでした。

(1)チップC0の隠しセクターのマップ情報を参照する
(2)すでにイレーズ済み(全部0xff)か?をチェックし、イレーズ済みなら(5)へ。
(3)チップC0のイレーズ実施。
(4)チップC0のイレーズ状態を再度チェックし、イレーズ済みでなければエラー終了
(5)チップC0の隠しセクターにマップ情報書き込み
(6以降)(チップE0について同様な処理を実施)
・・・

上記の処理において、どうしても(4)で「イレーズ済み」と判定されなかったのです。
おかしい・・・処理はNP.inoと同じことをしているはずなのに・・・?

SFメモリカセットのプロテクト設定がなにか邪魔をしているのかと思い、カセット全体のプロテクト設定や、セクター毎のプロテクトの設定をチョコチョコ変えたりしてみたのですが、効果がありません。
また、こちらのページにある、スーファミ上で動作するSFメモリ書き換えについてもソースを見たりしましたが、 特に処理に違いは無いようでした。

掲示板でNINTENDO POWER(SFメモリカセット)の書き換えについて議論されているページも見つけ、掲示板の記事を追いかけたりもしました。 こちらは英語で書いてあるのはともかく、話題が途中でGB版のメモリカセットに飛んだりして、追いかけにくかったですが・・・。
ヒントになりそうなこととして「最初のflashrom(C0)のマップ情報がerase/writeできない⇒違うバンク番号を使ったらできた」などもありましたが、同様に試してみても効果はありませんでした。

次に、隠しでないほうのセクターのプロテクト状態が影響している(と、書いてあったように見えた)ので、念のため手持ちのSFメモリカセットのセクタープロテクトの一覧を調べてみたりもしました。
すると不思議なことに、調査に使っていてマップ情報を消せないSFメモリカセットと、その他の特に設定変更していないメモリカセットで、セクタープロテクトの状態が確かに違っていました。

(1)マップ情報を消せないメモリカセット・・・
⇒全セクターがプロテクト無し状態になっていた

(2)特に設定変更していないメモリカセット・・・
⇒C0チップのセクター0&1がプロテクトあり、その他セクターがプロテクト無し状態になっていた。またチップE0は全セクタープロテクト無し

何か違うのかな?と思い、これまで特に設定変更していない、他のSFメモリカセットでマップ情報消去を試してみると・・・なんと!?マップ情報が消せました!!

C0チップのセクター0&1のプロテクトをあえて有効にすることがポイントかな?と思い、(1)のカセットでセクタープロテクトを有効にしてみたりしましたが、効果はなく、依然、マップ情報は消せないままでした。
もしかすると、調査の一環でチョコチョコ設定を変えている際、判明しているコマンドでは復帰できないような設定を変えてしまったのかもしれません。もしくは、Flashの寿命・・・?

本サイトで公開するdumpfreak.pyでは、スーパーファミコン向けメニューにおいて、1〜14の操作は、特に問題なく使えると思います。 ただし、メニュー15〜20については、もしかするとSFメモリカセットの動作不具合を引き起こすかもしれないため、その旨、ツール上で警告文を記載しています。


(付録)SFメモリカセット書き換えイメージを、さらに書き換えるツール「SFMImgEdit.py」
SFメモリカセット書き換えイメージ&マップ情報を出力できるSF-Memory-Binary-Makerは強力なツールで使いやすく、大変便利なのですが、以下の点が少し気になりました。
やっとSFメモリカセットを書き換えられるようになったのですから、これらの情報もいい感じに整えたものをメモリカセットに書き込みたいものです。
そこで、SF-Memory-Binary-Makerで出力されるファイルを、さらに編集するツールを作成しました。
こちらのdumpfreakに同梱しています。

第1引数に、SF-Memory-Binary-Makerで出力したイメージファイルを与えて起動してください。
c:\Temp\Python\df>python SFMImgEdit.py SFM_003_z.sfc
ファイルSFM_003_z.sfcを読み込みました。

==========================================================
                     <<トップメニュー>>
==========================================================
SFメモリカセットイメージファイル: SFM_003_z.sfc
----------------------------------------------------------
1: ディレクトリ情報編集
2: メニュー文字列bitmap編集
q: 終了
----------------------------------------------------------
選択してください:

ディレクトリ情報の編集は、メニュー1で行ってください。
SFメモリカセットのメニューで表示されるゲームタイトル文字列は、あらかじめbmpファイルを作成しておく必要があります。

◆タイトル文字列bmpファイルの作成方法
1.EDGEを起動します。
2.メニュー>新規作成>横幅192、縦幅12にしてOK

3.文字列描画で「塗りつぶす色」=白にして、文字を入力

4.「標準ビットマップファイル」として保存


作成したbmpファイルは、SFMImgEdit.pyと同じフォルダに保存してください。
上記の方法で生成されたbmpファイルであれば、内容を解析して、SFメモリカセットのディレクトリ情報のビットマップ情報に埋め込むことが可能です。
bmpファイル保存後、SFMImgEdit.pyを起動し、メニューで2を選択してください。

ここで書き換えたディレクトリ情報とタイトル文字列ビットマップは、ROM Checkerというツールで確認可能です。

1本目:ヴァルケン、2本目:キャラバンシューティング、3本目:スマッシュTV
左下部分はカセット内のMENU PROGRAMのビットマップ情報から表示している(と思う)

いざSFメモリカセット書き換えを始めるとクッソ長い時間がかかるので、それまでに完璧なイメージを作っておきたいものです。


SFメモリカセット書き換えのまとめ

参考にさせて頂いたサイト、情報
nocash先生のfullsnes.txt
sanni先生のcart reader
moldovさんのSF-Memory-Binary-Maker
sanmaiwashiさんのニンテンドウパワーを書き換えて遊ぼうのページ
BABさんのROM Checker
TAKABO SOFTさんの高機能ドット絵エディタEDGE


(2020/01/12)



トップへ戻る