Sweet Rammy
フラッシュカートリッジを持っている人の為のバックアップツールです。
大量のバス配線やAVR/PICの様なマイコンを使わないので簡単に出来ます。
一通り全てのSRAM・EEPROM・FRAMの読み書きと、一部のROMの読み出しが出来る様になる予定です。
Sweet Rammy is a backup tool for saved data of your Megadrive/Genesis cartridges.
If you have a flashcart and soldering skill,
you will backup SRAM, FRAM, EEPROM and ROM without large scale cart reader.
No 16bit data bus and 24bit address bus wiring, No AVR/PIC microcontroller is needed.
もしフラッシュカートリッジは持ってないけどメガCDなら持ってるという人は、
retrodevにメガCDを使ったバックアップツールがあるから、こっちの方が楽かも。
但しEEPROMの読み書きは出来ない様子。
If you have a Mega-CD/Sega-CD and not have a flashcart, please visit retrodev and review his cart dump tool.
http://www.retrodev.com/
開発のきっかけ
ぽんRev!! に 「メガドライブ セーブデータ読み書きの実験」 という話があって、
オリジナルのカートリッジに簡単にセーブデータを書き込めたら面白いなと思って、
実験してみたのが始まり。
「ぽんRev!! 個人的備忘録」の2011/09/30のログ
Download
開発者向けのベータバージョンです。
消えると困るセーブデータの読み書きには使わない方が良いでしょう。
Current version is Beta version. Do not use with your important carts.
Sweet Rammy Version 0.10
Hardware
- メガドライブ本体に、68000をHALTさせるスイッチを1個付ける
(17番ピンをGNDに落とすとHALTする)
Attach a switch to 68000 HALT pin (When pull down the pin 17, 68000 take a halt state.) - メガドライブの2PポートとPCのCOMポートを繋ぐシリアルケーブル
Connect a cable (4800bps cable or AVR cable) to Player2 port and COM port of Windows PC. - 読み書きプログラムを焼いたカートリッジ
A flashcart with burned Sweet Rammy program. - オリジナルのカートリッジ
Original carts.
4800bps Cable (Low speed) and HALT Switch

AVR Cable (High speed, 115.2kbps)

First procedure
- 読み書きプログラムを焼いたフラッシュカートをメガドライブに差して起動します。
Insert a burned flashcart to Megadrive and power on. - HALTをONにします。
Switch HALT to enable. - オリジナルのカートリッジに差し替えます。
Remove the flashcart and insert a target cart. - HALTをOFFにします。
Switch HALT to disable. - PC側のターミナルソフトから以下の設定でメガドライブに接続します。
Connect to Megadrive/Genesis with the following settings. - 4800bps
- 8bit
- Parity = None
- Stop Bit = 1
- Flow Ctrl = Hardware
- Local Eco = Yes
- PC側のターミナルソフトから読み書きコマンドとデータを送ります。
Send commands and data form PC.
Reading procedure for SRAM
- Type "AT.000000"
- Type "RD.000000"
- Received reading data. (Hex form)
Writing procedure for SRAM
- Type "AT.000000"
- Type "WD.000000"
- Send text data. (Hex form, Not binary)
Task List
何するか忘れて、ぽんRev!!のログを探りまくる羽目になるので。ぉ
- 32kBytesを超えるデータを1度でSRAM/FRAMに書き込める → Version 0.07
- AVRをプログラムする
- バイナリー転送モード
- ファンタシースター復刻版に書き込む
- メガCDのSRAMを読み書きする
- 32XのBIOSを読み書きする
05/08/2012 - Built on Rammy
Flash ROM の書き込みが出来る様になった事から、
汎用Flash ROM Programerとして注目され始めた様です。(笑)
そこで次回 Version 0.11 はちょっと仕様を変えて、
バス幅が 8bit のFlash ROM 1個だけに対しても書き込みが出来る様にしようと企んでいます。
合わせてラミーを汎用Flash ROM Programerもしくはマジコン的な使い方をする場合に限って
「カートリッジをぶっこ抜く時に斜めってるとハングする問題」
と
「メガドライブにHALTスイッチを付ける本体改造」
を回避する意味も含めて、
ラミーのROMと焼かれるROM (ターゲットROM)
が1つのカートリッジに搭載されたカートリッジの作り方を2通り考えて見ました。
ただ、
この回路で動くかどうか検証する為の材料を既に引っ越しのダンボールに詰め込んでしまってるから、
しばらくの間検証出来なさそうです・・・。(´ω`;)
まずシンプルにラミーROMとターゲットROMをスイッチで切り替える方法。
多分この回路をカートリッジに加えればOK。

で、スイッチなんてダセぇと言う方には、
多分この回路をカートリッジに加えれば、
コンソール上で切り替えられるかと思います。

この回路での切り替えは Version 0.10 でも可能だけど、
いちいちいくつもコマンドを打って切り替えるのは面倒だから、
Version 0.11 では以下の方法でも切り替えられる様にしようと思います。
- CH.000000でラミーROM、CH.000001でターゲットROMに切り替えられる。
- 起動時にBボタンが押されていると、Target ROMに切り替わる。
- ラミーROMの120bytes目を「SWeet」にしておくと、起動時に自動でターゲットROMに切り替わる。
3番目の手段については言い換えると、バイナリエディターで予め SRAM.BIN
の先頭から120bytes目の 「Sweet」 を 「SWeet」 に置換しておくと言う事になります。
ちなみにどちらも回路も、ターゲットROMに切り替えた状態でリセットボタンを押した場合、
ターゲットROMのバス幅が16bit (8bit x2個 か 16bit x1個) で且つメガドライブソフトのROMなら、
そのソフトが起動します。
(マジコン的な使い方)
05/02/2012 - PlayStation の MemoryCard
スケルトンなプレステのメモリーカードは中にFladhROMが2個乗ってるのが見えたから買ってみた。
50円。
SST29EE020 と W29EE012 が1個づつ乗ってます。
こいつらはページ単位で書き込むタイプだから Version 0.10 では使えないです。
オマケでPIC16C62Aも乗ってるけど、これは書き換え出来ないから役に立ちませんね。

05/01/2012 - PRO STRIKER と PHANTASY STAR II
最近分解したカートリッジ。
1つ目はファンタシースター2。
これは 8bit MaskROM が使われています。 1989年製です。
但しROM容量が 6Mbit と中途半端だから、
多分 256k x 8bit ROM と 512k x 8bit ROM を SEGA MPR-12377 で 768k x 16bit にまとめてる様な気がします。
SEGA MPR-12377 は裏面にもあります。
当時はICの数を増やしてでもMaskROMの容量が少ない方が安上がりだった様です。
もしこの予想が当ってたとすると、SRAMカートリッジは作れても、Flashカートリッジは作れないですね。
(FlashROMアドレスと68000から見たアドレスが違う)

2つ目はプロストライカー。
プロストライカー2がSRAMなのに対して、
プロストライカー未完全版とプロストライカー完全版はFRAMです。
で、このFRAMなのだけど、
容量は4kBytesしか無い上にアクセスタイムが 250ns とか 200ns とか異常に遅いから、
FRAMカートリッジは作れない罠。
8MHzで動いてる68000のプログラムROMとしては150nsくらい必要です。

ちなみにFRAMのデカップリング コンデンサーは2個刺さってます。
1個じゃ足りないようです。
大概のカートリッジ基板は2種類のコンデンサーの大きさに対応出来る様にスルーホールが3個空いてるけど、
実際には2個のコンデンサーを並列挿入出来る様に設計した方が現実的だった様です。
ちなみにこれって自動挿入出来ないよね?

03/28/2012 - うなぎの蒲焼 (2)
昨日の続き。
コマンドにオフセットを足さないとエケ無い事を忘れてました。
なのでやっぱり2段重ねFlashROMの読み書きはラミー側のバージョンアップが必要です。
Version 0.10の更新内容はELコマンドの変更だけです。
Version 0.09はELコマンドの引数が無かったから常に「EL.000000」としていたけど、
Version 0.10はELコマンドの引数として消去対象FlashROMの先頭アドレスを取るようになりました。
つまり2段重ねの2枚目以降は「EL.000000」では消去出来ません。
2枚目なら2枚目の消去対象FlashROMの先頭アドレスを指定する必要があります。
計算方法は「先頭アドレス = 128 * 1024 * f * (n - 1)」です。
f = FlashROM容量 (byte)、n = 何枚目のFlashROMか? です。
f は例えばMBM29F800みたいな 4M * 16bit のROMなら f = 8 になります。
EN29F002みたいな 2M * 8bit * 2個 のROMなら f = 4 になります。
引数は16進数で指定するから、Windowsの電卓を使って計算結果を16進数表示にすると良いでしょう。
そしてVersion 0.10と関係あるか分からないのだけど、
MBM29F800TA 1個のカートリッジでテストし終えた後、
EN29F002T 2個のカートリッジでテストしたら何でか2個の内の片方だけ、
プロテクト掛かった様な状態になってしまいました。
データとMfg IDの読み込みは出来るけど、消去と書き込みが出来ません。
物理的にどこか配線が取れたのか、チップ内部が壊れたのか謎です。
ちなみにプロテクトは+12Vを!RESETピンに入れられるようなハードウェアでないと出来ないから、
プロテクトは掛からないはず・・・。(´ω`;)
03/26/2012 - うなぎの蒲焼 (1)
元のカートリッジの半分の容量のFlashROMを2枚重ねて、
元のカートリッジと同じ容量にする方法。
多分この回路図であってるハズ・・・。まだ検証してないです。

ラミー側はFlashROM 1個の時と同じ様に書き込めば良いです。
特別な設定は要らないです。
03/23/2012 - Sound Rammy
少し前にSound Rammyと言う音声信号でSRAM/FlashMemoryカートリッジに書き込むシステムを思いついていたのだけど、
最近その回路図を少し考え直してみたら、
ロジックIC (NJU3714) 3個とアナログIC (LM339) 1個で済みそうな事が分かりました。
しかもこれらのICをカードエッジコネクターを取り囲む様に配置するから、
66%くらいのアドレス/データバス配線にジャンパー線を使わずに済みそうです。
以下メリット。
- IC 4個しか使わない (IC単価合計 = 500円)
- Retrode並みにコンパクト
- 配線が楽
- 配線を変えればBIOSプログラマー・他のゲーム機に対応可能
- 書き込み時のホストコンピューターは何でも良い (iPhone, Mac, CDプレーヤー...)
- ROMイメージを音声ファイル (.wav) に変換するプログラムがシンプルなので移植しやすい
以下デメリット。
- 書き込み速度が遅い
- 最大8Mbitまで、大容量カートリッジに対応しない
- 読み出し・ベリファイが出来ない
と言う事でSweet Rammyは少し放置して、Sound Rammy作ってみようと企んでいる今日この頃。
03/23/2012 - Sweet Rammy Version 0.09
やぁみんな。 良い子の見方、ラミーだよ。
Version 0.09を公開しました。
FlashMemoryの書き込みに対応しました。
詳しくは ReadMe.txt に書いてあるから、具体例だけ。
まず書き込みシーケンス。
PB.000008 ← 8bit x2個なら 0x000008, 16bit x1個なら 0x000016 OK PT.00029F ← 必ず 0x00029F (Device type = 29F/49F series) OK PW.000000 ← 試しにアドレス 0x000000 に書き込んでみる OK WD.0000080011223344556677 ← 試しに「0x0011223344556677」を書き込んでみる 0x000008 OK PR.000000 OK RD.000000 0011223344556677 ← 正常に読み出せた OK
次、消去シーケンス。
PB.000008 ← 8bit x2個なら 0x000008, 16bit x1個なら 0x000016 OK PT.00029F ← 必ず 0x00029F (Device type = 29F/49F series) OK EL.000000 ← 消去コマンド OK
ちなみに49Fと29Fの違いは、セクターサイズだけだと思う。
そしてKazzoと同じで使えるFlashMemoryと使えないFlashMemoryがありそうな気がします。
EN29F002Tとか8bitバスのFlashMemoryを2個使う場合 (PB.000008の時) は、
1個づつ消去・書き込みすると、16bitバスのFlashMemory 1個に比べて2倍時間が掛かるから、
2個同時に消去・書き込みしてます。
この都合上、WDコマンドで書き込むサイズも2bytes単位になります。
WD.000003とか奇数サイズを指定すると、端数が切り捨てられます。
03/20/2012 - Sweet Rammy Version 0.08
花粉が減ったらしく脳みそが動くようになったのでVersion 0.08を公開しました。 XModemはまだ実装していないです。 むしろXModemよりも先にFlashROMを焼く機能を付けてしまいそうです。
- メガドライブ側にもコンソールを表示した。
- Sweet RammyのROMイメージを32k x 16bit = 64kBytes ROMに納まるようにした。
実際のファイルサイズは128kBytesありますが、後半64kBytesはダミーデータです。 32k x 16bit = 64kBytes ROMに焼く時は、後半64kBytesで上書きされない様に注意して下さい。 これで元々32k x 8bitのSRAMが乗っているカートリッジに、 もう1個SRAMを足すと言う方法でもラミーを作れます。
03/16/2012 - 149円FlashROMカートリッジ (3)
ぽんさんの方で
説明されてる
からここで更に説明する必要は無いと思うけど、
一応aitendoのMBM29F800TA-70PFTNを買おうかどうか迷ってる人や、
何となく買って放置してる人の為に、ピンアインをPDIP/SOP互換にする図をこさえてみた。

03/15/2012 - 149円FlashROMカートリッジ (2)
99円のMBM29F800TAと50円のJリーグ基板を使った、149円FlashROMカートリッジの続き。
Jリーグカレーが1食130円だから、2食我慢すれば十分です。
半田付けが終わってテストしてみたら何をしても 0xFF しか読み出せなくて 「?」 と思ってたけど、
よく基板を眺めたら、左右を間違えて配線してる箇所がありました。
それを直したら素直にManufacture ID、全消去、プログラムが出来ました。

ところでこのMBM29F800TAはモーター制御プログラムが入っているのだけど、
何でモーター制御の為に8Mbitもある大容量ROMが必要なのだろうと思ってダンプしてみたら、
先頭14kBytesくらいしか使って無いのね。
あとの残りは全部 0xFF で埋まっています。(´ω`;)
ちなみにMBM29F800TAが載ってる変換基板の表面のピンは出っ張って邪魔だから、
ニッパーで切り落としました。
裏面の不要なピンも切り落として更にヤスリで思いっきり削って、
基板に当らない様にしてから半田付けしました。
更に、カートリッジの殻の内側の邪魔な所
(中央の●丸い出っ張りと、ネジ穴の通ってる柱の一部) もカッターで切り落としました。
こうしないとカートリッジの殻が閉じないです。
以下、EN29F002Tと同じくラミーでMBM29F800TAの各コマンドを実行する例。
[Read/Reset] 何かしたら1度リセットしないと期待通りに動かない。 pb.000016 pw.000AAA wd.00000200AA pw.000554 wd.0000020055 pw.000AAA wd.00000200F0 pr.000000 rd.000002 [AutoSelect Mfg ID] 0x04 が読み出せれば正常。 pb.000016 pw.000AAA wd.00000200AA pw.000554 wd.0000020055 pw.000AAA wd.0000020090 pr.000000 rd.000002 [Chip Elase] 消去後は 0xFF で埋まる。 最大で2分以上掛かる。 pb.000016 pw.000AAA wd.00000200AA pw.000554 wd.0000020055 pw.000AAA wd.0000020080 pw.000AAA wd.00000200AA pw.000554 wd.0000020055 pw.000AAA wd.0000020010 [Byte Program] アドレス 0x000000 に 0x1234 を書き込む例。 pb.000016 pw.000AAA wd.00000200AA pw.000554 wd.0000020055 pw.000AAA wd.00000200A0 pw.000000 wd.0000021234
で、EN29F002Tの時と同じ事をもう1回言うけど、 現行のラミーだと速度的にあまり実用的じゃないです。
03/14/2012 - 149円FlashROMカートリッジ (1)
今度はMBM29F800TAを使ったFlashROMカートリッジをこさえてみた。
デンセツノオトコDとかデンセツエノミチDとか数種類のギャンブル基板に載ってる1M x 16bit = 8Mbit ROMです。
aitendoで99円です。
aitendoはこいつらの在庫を時々チャージしてますね。
たまに200円の時があるから気を付けて下さい。

使った基板はJリーグカレーです。1食130円です。
秋葉原行くとこいつが50円で大量に転がってるから、
デンセツノオトコD 99円とJリーグ50円の合計149円でFlashROMカートリッジが作れます。
MBM29F800TAが載ってる変換基板は
ぽんさんのログ
の通りにピンスワップしてSOP/PDIP互換にしたら、そのままJリーグ基板にぽん付けです。
実際には1番ピン (RY/!BYピン) は未接続のままで良いです。
あとはJリーグ基板の42番ピン (A19ピン) に繋がってる配線パターンを切断して、
替わりにSRAMの!WEピンを結線します。
書き込みの時は常に16bitアクセスなのでこれで良いです。
MBM29F800TAの44番ピン (!RESETピン) はVccに繋ぎます。
03/07/2012 - EN29F002Tを使ったFlashROMカートリッジ (2)
EN29F002Tを使ったFlashROMカートリッジの、
下位バイトのEN29F002Tにコマンドを送る例。
上位バイトのEN29F002Tはアドレスが+1されます。
[Read and Reset] 各コマンドを実行する前にこのコマンドでEN29F002Tをリセットする。 pw.000000 wd.000001f0 pr.000000 rd.000001 [AutoSelect Mfr ID] 製造者IDを読み出す。 動作チェック用。 pw.00aaaa wd.000001aa pw.005554 wd.00000155 pw.00aaaa wd.00000190 pr.000000 rd.000001 (読み出した結果が 7F なら正常) [Chip Elase] フォーマットする。 しばらく時間がかかる。 pw.00aaaa wd.000001aa pw.005554 wd.00000155 pw.00aaaa wd.00000180 pw.00aaaa wd.000001aa pw.005554 wd.00000155 pw.00aaaa wd.00000110 [Byte Program] 1byte書き込む。1byte毎にこのコマンドが必要。 pw.00aaaa wd.000001aa pw.005554 wd.00000155 pw.00aaaa wd.000001a0 pw.?????? ← 書き込むアドレス。 16bitバスの下位8bitなので2倍する。 wd.000001?? ← 書き込む値。と説明してみたものの、 実際にはターミナルソフトのマクロで自動化したとしても速度的にあまり実用的じゃないですね。
03/03/2012 - EN29F002Tを使ったFlashROMカートリッジ (1)
何となくEN29F002Tを使ったFlashROMカートリッジを作ってみた。
ラミーを起動してコレを刺してコマンド送ればROMに書き込めます。
元々2Mbit ROMが2個載っていたやきうかゴルフのカセットにPLCCパッケージの2Mbit FlashROMを乗せたから、
配線はピンスワップが無くて楽でした。

※写真では1番ピンが未接続だけど、Vcc (+5V) へ接続しないと動きません。
実際に書き込む時は、ROMアドレスが違う事に気を付けて下さい。
例えばEN29F002Tのプログラムコマンドアドレスの1つ 0x2AAA は、
下位バイトに割り当てたEN29F002Tなら2倍の 0x5554 になります。
上位バイトに割り当てたEN29F002Tなら2倍 + 1 の 0x5555 になります。
って雑な説明してみたけど、
ラミー自体Flash ROMカートリッジが無いと動かせないから、
既にFlash ROMカートリッジを持ってるのに更にもう1つFlash ROMカートリッジを作る人はいなさそうですね。
メガドライブ用マジコン持ってる人が、
他のゲーム機のFlashROMカートリッジを作る手段としては使えそうですけど。
- オリジナル → 下位bit or 上位bit
- 0x5555 → 0xAAAA or 0xAAAB
- 0x2AAA → 0x5554 or 0x5555
所でEN29F002T、 データシートのページによってコマンドアドレスが違ってるのだけど、 コマンドとして認識する有効ビット数は12bitで良いみたいです。 今日は半田付けしただけで実際に書き込みテストしてないから、 自分が検証した訳では無いけど。
02/12/2012 - トランジスター版4800bpsケーブル
前回ブレッドボード上に組んだトランジスター版4800bpsケーブルを、基板上に組んで見ました。
74HC04や28pin AVRと違って、表面実装品やジャンピングワイヤー無しでもかなりコンパクトです。

02/03/2012 - トランジスター版4800bpsケーブル
回路図を追加しました。
4800bps ケーブルの今までの回路図は74HC14を使っていたのだけど、
74HC14の代わりにトランジスターを使った回路図も挙げてみました。

とりあえづ自分のPCにインストールしてあるRS232Cカードでは正常に通信できてます。
片方のトランジスターがプルアップされてないのは、
メガドライブ側に30kΩのプルアップがあるからです。
PC側が正常に受信出来ない場合は、
赤字の抵抗値を下げて見ると良いかも知れません。

ブレッドボードで組むとこんな感じ。
01/23/2012 - 花粉
ウチは花粉が富んでるこの時期はプログラム書かない習慣がある様です。
去年もBad Apple!!をこの時期に中断して忘れた頃に再開してましたね。(´ω`)
以下、最近思いついて少し考えてみた物。
・Sound Rammy
ヘッドフォンの音声出力でSRAMカートリッジにデータを書き込む変態システム。
iPhoneだのAndroidだのでも書き込めると言う、メリットかどうか分からない特徴があります。
マジコンやROM焼き出来る環境が無くても安上がりにSweet Rammyのカートリッジを用意出来る方法を考えて思いつきました。
でも回路図描いたら、割と部品数が多くて (74HCシリーズ6個 + オペアンプ1個) 、
「AVRプログラマー (74HCシリーズ1個) と、AVR搭載のSRAMカートリッジ作った方が簡単じゃん」
と言うオチでボツりました。
・Serial Rammy
Sound Rammyが音声なのに対して、こっちはシリアル通信でSRAMに書き個込むシステム。
シリアルはシリアルでも、専用の制御ソフトやマイコンを使わずに、ROMコンバーターソフトとターミナルソフトと74HCシリーズだけを使った物。
これも部品数が多いのが目に見えてるんで却下。
・Tape Rammy
Sound Rammy又はSerial Rammyを紙テープに対応させた物。
ウケ狙い。実用性はまったく無いです。
01/08/2012 - ラミー様とラミン様
Sweet Rammyと言う名前は30秒くらい考えて思い付いた適当な名前なのだけど、
同時にこんな感じのキャラクターも思い付いていたり。
初めからラベル用に描こうかと思っていたのだけど、
気が向いた時しか絵描かないから、今更になりました。

で、描いたからラベルも作れば良いのだけど、
これ描いた時点で力尽きました。ぉ
とりあえづ元データ置いておくから、もしラベル作りたいとか言う場合はどうぞ。
RAM15A.png
左がラミーで右がラミンなのだけど、ラミンのケツより下の部分はオマケだから、
使う時はこのカットみたいに足が見えない方がラミンが喜びます。(´ω`;)
01/01/2012 - TV側のコンソール表示
これ書こうとしてたら、M7.0の地震が来ました。
ウチの部屋の場合、ドアが少しの気圧の変化や微振動でもドタドタ言うから、
遠くで起きた地震なら大きな揺れが来る前にドアの音で分かる仕組み。
で、XMODEMのデバッグするのにメガドライブ側もコンソールが表示されている方が都合が良いから、
こんな感じで実装して見た。
