レトロフリークカートリッジアダプタ活用テクニック(1)ウルトラコアの吸出し


カートリッジアダプタ+ウルトラコア全体写真
マブいナオンちゃんはキューティー鈴木さんです


概要


発端
2019年にメガドライブ用ソフト「ウルトラコア」が発売されましたが、レトロフリークでは動かず、しばらく箱に入れたままでした。
しょうがないから自作の吸出し機でも作るか、基板デザインして、カセット用のコネクタも買ってきて・・・と思っていたのですが、 ふと横を見ると、レトロフリークが目につきました。

レトロフリークのカートリッジアダプタは、ファミコン/SFC/メガドラ/PCエンジン/ゲームボーイのカセット差し込み用の口がついており、 もしこれを使えたら、わざわざ数千円以上のお金やはんだ付けの手間をかけて、吸出し機を作る必要もありません。
PCとかからでも使えるようにならないか?と調査をしてみました。


RFCAとはそもそも、何なのか? ⇒CDCシリアルデバイスとして動作する吸出し機です
レトロフリークカートリッジアダプタ(長いので、以下RFCA)とは一体なんなのか?レトロフリーク本体とはUSB接続されているようだが・・・、と思い、ネットで情報を色々あさってみました。
すると、こちらのページで、

・2本のUSBコネクタのうち、片側はUSB-HUB、もう片側は吸出し機のコネクタ
・Windows PCに接続すると、デバイスとして認識はする(が、ドライバが無いので使えない?)
・CDC serialデバイスである

という情報が見つかりました。

CDCデバイス??というのは、ものすごく大雑把に言うと、PCと接続すると、仮想シリアルポート経由で通信できるようになるデバイス、とでも言えばいのかな?
自宅のWindows10 PCでも確認してみました。
接続には、USB延長ケーブル(タイプAのオス&メスのやつ)を使用しました。ダイソーなどでも買えるかな?


(左)RFCAを裏から見て左が吸出し機へのポート、右がUSB-HUB
(右)Windows10と繋げると、仮想シリアルポートが自動追加される(このPCでは「COM7」)

PCに接続すると、シリアルポートCOM7が追加された!?
さっそくTeraTermなどで色々文字を送ったりしてみましたが・・・ダメでした。
多分ASCII文字じゃない方法でホスト側とやり取りをしているとみられました。

どんなデータがやり取りされてるかは、レトロフリーク本体とのやり取りを中間でキャプチャして、覗いてみるしかないなー、というわけで、 中間で覗き見できるような基板をお手軽に作り、ロジアナ(LAP-C)で見てみることにしました。


LAP-Cは、追加プロトコル解析ライセンスが必要、だったと思う。
あと、一般人に買えるモデルだと圧縮機能を使っても0.5msec位しかデータは取れないので、気合を入れよう。


RFCA、意外にも高度なことやってるな!(上から目線)
USBパケットを中間でキャプチャしながら、各種ゲーム機のカセットを挿したり抜いたり、また、レトロフリーク本体がカセットを読み書きするような操作(バッテリーバックアップの読み込み/書き戻し)などをしてみました。

判った範囲で書くと・・・

(1)CDCデバイスのシリアル通信の内容は、そのままWiresharkなどで内容を確認できる
(2)レトロフリーク本体<->RFCA間でやり取りされるデータは、バイナリデータ(ASCII文字ではない)
(3)レトロフリーク本体がRFCAに要求を出す⇒RFCAが応答を返す形式でやり取りされている
(4)RFCAがレトロフリーク本体に急にデータ送信をすることはない(例えば、イベント通知とか)
(5)RFCAは、カセットが挿されたことを認識すると、その種類を自動的に判定している
(6)レトロフリーク本体は一定時間おきに、RFCAに状態取得要求(?)のようなものを出している
(7)RFCAは、状態取得応答で、接続されているカセットの種別(ファミコン、メガドラ、SFC・・・)を返す
(8)レトロフリーク本体とRFCAの間のデータ(ROM吸出しデータやSRAMデータ)は、暗号化されていない平文

RFCAを分解してみると、マイコンか何かが入っていました。恐らくこれがUSBホストとの通信や、カセットの自動判定を行っているのでしょう。
調査を始めたときには、もっと低レベルなやり取り、

・レトロフリーク本体から、カセットのアドレスバスに設定すべき値と、/RD線をGNDに落とすよう要求

・RFCAは、前項の設定完了したらOK応答を返す

・レトロフリーク本体から、データバスの内容を読み取り要求

・RFCAは、前項で要求されたデータを返す

みたいなやり取りをしているかと思ったのですが・・・実際にはRFCAはもっとインテリジェントな吸出し機でした。



こういう感じで要求/応答をExcelで記録しながらね・・・

これら、レトロフリーク本体<->RFCA間でやり取りされるコマンドについては、個別に説明しようかと思いましたが、やめました。
どうせRFCAでしか使えないコマンドですし、不正確かもしれないし・・・。後述のプログラムソースを見てください。
完全なコマンド一覧は、レトフリ本体かRFCA内のファームウェアのソースから調べるのがよいでしょう。今のところするつもりはありませんが・・・。
あとPS3はプレステ3じゃなくて「時の継承者 ファンタシースターIII」のことです。

また、(8)の平文通信であることもラッキーでした。
レトロフリークを持っている人はご存じでしょうが、レトロフリークで吸い出したROMデータは、SDカードに暗号化されて保存されます。
もし通信が暗号化されていたら、復号化処理なんてできないな、あきらめよ、と思っていました。


pythonでRFCAを操作してみよう!!!!!
USBパケットキャプチャで情報を集めつつ、シリアルポートを操作するプログラムを作りました。
最近pythonを勉強中なので、pythonを使います。

いやーpythonいいですよ!

・スクリプト言語なのに、TCPソケットやシリアルポートを簡単に扱える(ライブラリを後で入れる必要があるのもある)
・Windows/Raspberry-pi/Linuxで同じコードが動く
・配列やリストなど、データの集まりに対する処理が強力&お手軽。文字コード変換も強い
・タプルとかもいいね!

rfca_test.zip
ダウンロード後、zipファイルを展開すると「rfca_test.py」が入っています。

pythonのインストール方法は本ページでは説明しません。
Windows+python3+pyserialを入れた環境で開発しています。

◆実行方法
ファイルをpythonへのパスの通ったフォルダに置き、引数をつけずに実行してみてください。
使用方法と、現在使用可能なシリアルポート一覧が表示されます。

c:\Temp\Python\test>python rfca_test.py
usage: rfca_test.py ComPortName
       ComPortName : シリアルポート名(例: COM1)

使用可能なシリアルポート名一覧:
COM5
COM6
COM7

RFCAをPCに繋いだ状態で増えたシリアルポートが、RFCAと通信するためのシリアルポートです。
シリアルポート名が分かったら、あらためて
> python rfca_test.py COM7
などと実行してください。メニューが表示されます。

==========================================================
                     <<トップメニュー>>
==========================================================
接続中カセット種別: メガドライブ
----------------------------------------------------------
1: 先頭512バイトをダンプ表示
2: 指定アドレスから512バイトダンプ表示
3: 指定アドレスから指定サイズダンプ表示
4: 16MbitメガドラROM読み出し&ROMファイル作成
5: 指定サイズROM読み出し&ROMファイル作成
q: 終了
----------------------------------------------------------
選択してください:
RFCAにカセットやらカードやらを挿した状態でEnterキーを押すと、内部でRFCAに対して状態要求コマンドが発行され、 「接続中カセット種別」欄が更新されます。


メガドライブ用ソフト「ウルトラコア」を吸い出す
ここまで前置きが長くなってしまってすみませんでした。「ウルトラコア」の吸出しですが、前項のツールの「4: 16MbitメガドラROM読み出し&ROMファイル作成」から行うことができます。
以下、そこにたどり着くまでの流れです。

ツイッターやネットの広大な海でウルトラコアの情報を集めていたところ、以下のようなツイートを見つけました。

MD互換機用ウルトラコアがレトロフリークで起動しないという話をみて検証したけど、レトフリでは8メガしかダンプされない一方、Rerrode2では9メガビットとキリの悪い容量だけど、レトフリでも起動します。バイナリエディタで見ると16メガROMの余り7メガ程をFF詰めした感じ。

— mnemonic (@mne_mon_ic) October 17, 2019

つまり、レトロフリークが大丈夫だと思って吸い出したデータは、不完全なものになってしまうという事か・・・? これを見て、もし吸出し機ができたら、データを多めに吸い出せばいいんだなあと思いました。

pythonによるツールでメガドライブカセットからの任意のアドレスの読み取りが行えるようになった時点で、16Mbit(2メガバイト、16進数でいうと0x200000バイト)の吸出し機能を実装して試してみました。すると・・・やった!動いた!


エミュレータで動作確認(白目)

吸い出したデータをレトロフリークのSDカードに直接入れれば、レトロフリークでも遊べます。

吸出しに成功したデータの、ヘッダー部を確認してみました。
メガドライブのROMの先頭部には、そのゲームの内容が記載されたヘッダー部があります(参考:こちらのサイト
これによると、$1A0からの8バイトに、前半4バイト=ROMデータ開始アドレス、後半4バイト=ROMデータ終了アドレス(に+1したもの)が記載されているようです。
吸い出したウルトラコアのヘッダー部を見てみると・・・


$1A0からの8バイトを黒くマークしました

ROMデータ終了アドレス+1が0x100000ということは、1Mバイト、つまり8Mbitですね。これは足りん!!
なんとこのゲーム、ヘッダー部に嘘が書いてあるということなのか!

推測ですが、レトロフリークはこのヘッダ部の終了アドレスを見て、不正確なデータしか吸い出せなかったのでしょう。レトロフリークは無罪!


次回予告
RFCAが思ったより高機能なので、レトロフリークと組み合わせてはうまく吸い出せなかったゲームも、やり方によっては吸出しができるようになるかもしれません。
次回は、こないだ横浜でファイアーメン目当てで買ってきたSFメモリカセットの吸い出しに挑戦予定です。


トルネコや麻雀ゲームも入っていて、もうけたぜーっ!


参考にさせて頂いたサイト、情報
kako blog
PLUTIEDEV


(2019/12/19)



トップへ戻る