Future Driver

12/31/2011

ぽんさんからブツを受け取りました。 このダンボール箱は 「手をけがしないよう、気をつけてあけてください。」 って、 ミミックみたいに箱に歯が付いてるかの様な事が書いてありますが、 歯は付いて無かったです。

貰ったのは32k x 8bit SRAM (バーミリオンに装着かな) 2個と、 128k x 8bit SRAM (ラミー増殖させるかな) 8個と、 2M x 16bit (32M ROM カートリッジ用かな) 1個と、 14MHzのオシレーター 2個。 元々はオシレーターを交換しようと言う話だったのだけど、おまけを沢山もらった。(*´ω`*)

窓付きROMって、小学生の頃だったら1日中眺めてそうな美しさがあります。

12/24/2011

日本人のクリスマス ディナー基本3点セットは、

ウチも今年はこの基本セットにしてみた。
で、バイナリー転送はどういう実装にしようかなと考えつつXMODEMの仕様を見てたら、 今のコードにXMODEMを追加するのはそんなにめんどくさくないな〜と思って、 調べたついでにXMODEMを実装中。 対応するXMODEMはチェックサム付き128bytes。 XR.00000コマンドでXMODEMで受信、XW.000000でXMODEMで送信にしようかな。 あと、従来のASCIIの通信の速度を若干上げてみたけど、 XMODEMを追加するとメガドライブ側の負荷が高くなるんで、 結果的にはASCIIの通信速度が Version 0.07 よりも遅くなってしまうかも。

12/23/2011

1日経ってないけどVersion 0.07を公開しました。 SRAM/FRAM書き込み時の32kBytesの制限を無くした。 SRAMカートリッジの書き込みがやり放題になります。
そしてEEPROMの16bitバスアクセスが出来る様になりました。 但し16bitバスアクセスが必要なEEPROMを使ったソフトを持っていないんで、 動作確認は出来ていないです。 とりあえずバスエラーが出ない事だけ確認しました。 例えばNHLPA Hockey 93 の読み出し例は以下の様になると思います。

NHLPA Hockey 93 の読み出し例:
AT.000000
PR.200000
PW.200000
PC.200000
P+.000000
PB.000016
PT.002401
PM.070706
RD.000080

12/23/2011

Version 0.06を公開しました。 16.000MHzと18.4320MHzに対応しました。 16.000MHzを使った場合の最大通信速度は57.6kbpsまでです。 115.2kbpsを設定する事は出来ますが、エラーに見舞われる確率が高いです。

12/21/2011

Version 0.05を公開しました。 好い加減ブログに移行させないと逝けないと思っている今日この頃。 AVRの送信バグを修正しました。 主に19.2kbps通信時に起きるデータ落ちが無くなります。 ちなみに19.2kbpsはレトロなホストコンピューター用に用意した速度です。 PC-9801とかX68000とかに繋ぐと良いです。

12/20/2011

メガドライブのI/Oポートに関するメモ。 各ピンは30kΩ程度のプルアップ抵抗が付いている様です。 基板上はプルアップ抵抗が無いんで、 I/Oチップ内部で半導体プルアップされている様です。 今のマイコンと違ってプルアップの有無は選択出来ません。 なので無接続のピンを読むと常に 1 になります。 4800bpsケーブルは1〜4ピンが無接続なので0x0Fです。 AVRケーブルはリセット中は1〜4ピンがHigh-Zになるので0x0F、 リセット解除した後ピンのステート変化が無ければ0x09を出力する様にしています。 これでポートに繋がっているケーブルがどっちかを調べています。

12/19/2011

Version 0.04を公開しました。 AVRケーブルと4800bpsケーブルのどちらも使える様にしました。 AVRのファームウェアも更新したんで、 AVRのファームウェアを更新してから遊んでください。 その他の更新は無いです。 データ落ちする問題やEEPROMの16bitバスアクセスが出来てない問題はそのままです。

12/18/2011

12/15の回路図は、CEが2種類 (!CE と CE) あるSRAMが載ってる基板に、 CEが1種類 (!CE だけ) しかないSRAMをROMと置き換える為の回路図です。 アドバンスド大戦略やデビルズコースみたいな、 元々CEが1種類しかないSRAMが載っている基板のROMをSRAMに置き換える場合は、 元々あるバックアップ用SRAMと同じ様にCEを配線すればOKなんで楽です。

そして今日はハードオフでこう言った基板目的でカートリッジを探ってきてみた。 って言ってももうメガドライブソフトは全然無いですけど。 しかも以外にもウチ以外にメガドライブソフトを買うHENTAIが居る様です。 買ったのはヴァーミリオン2本とシャイニング・ザ・ダクネス。 ヴァーミリオンは5MBと言う中途半端なROMサイズなんで、 写真の様に中途半端な中身になってます。 多分これは74HC139でCEを4分割してるのでしょう。 つまりROM 2個とSRAM 1個の他に、もう1個デバイスを繋げる事が出来そうです。 例えばリアルタイムクロックとか。 リセットICにはPST529Fを使ってます。 BA6162みたいなバッテリー管理の機能は無いんで、 ダイオードで電流制御しています。 それにしてもこの基板、容量の割りにコスト掛かってますね。 マスクROMが2個もある上に、バックアップ機能もあると言う。 それで居てクソゲーで売れなかったと言う・・・。 ウチが買ったヴァーミリオンも、8900円 → 980円に値下げしてようやく 「お買い上げ ありがとう ございました」シールが貼られた上に、 ほとんど遊んでなくてカートリッジの端子がちょーキレイと言う悲しさ。


そして今日の目玉というか、得体の知れない物があったから買って見ました。 ATARI互換っぽいコネクターが付いてるTAITOのアルカノイド用パドルです。 調べて見たら、どうやらこれはMSX用のパドルの様です。 但しMSXではパドルは普及しなかった上に、このパドルは独自仕様だそうで。 実際開けて見ると単にCRがI/Oポートに繋がってる原始的な物ではなく、 ある程度処理されたデータが送られてくる仕組みになっている様です。 ちなみにメガドライブはソフト側の対応次第である程度ATARI互換デバイスも変換機無しで直結して使えるから、 このクソマイナーなパドルをメガドライブに繋いでみようかと思ってます。

そういやDSのパドルは可変抵抗器を使わずに、 マウスと同じ光学式ローターを使ってます。 元々可変抵抗は寿命がすごく短くて、 パドルみたいな頻繁に回す用途には向いてないから正しい選択ですね。

12/15/2011

ぽんさんの 12月14日のログ の、HM628511HJPを使ったSRAMカートリッジがバッテリーバックアップ出来ない件について、 「多分これでバッテリーバックアップ出来るだろう」 と言う回路図を描いて見た。

HM628511HJPはHM628511HLJP (低電力バージョン) と違ってバッテリーバックアップに向いていないからCR2032じゃあまり持たない可能性があるけど、 その時は単4電池2本でも使えば良いでしょう。(´^ω^`)

12/15/2011

ぽんRev!! にある役に立ちそうなSweet Rammyネタをまとめてみた。
ウチのページはまともに使い方を解説してないから、 ラミーと回路図をダウンロードしたら、後の詳しい事は ぽんRev!! を見ればいいと思います。 ちょー手抜きとも言います。(´ω`)

  1. MD Sweet Rammy動作リスト(SAVE DATAのみ)
  2. Version 0.01 の使い方
  3. Sonic 3 のセーブデータの読み方
  4. 4800bpsケーブルは74HC04でも74HC14でもOK
  5. USB - COM port 変換ケーブルを使う
  6. ファンタシースター復刻版のセーブデータの読み方
  7. バーチャレーシングのROMの読み方
  8. Sonic & Knuckles + Sonic 2 のROMの読み方
  9. Versio 0.02 の変更点
  10. Mega-CDのBIOSの読み方
  11. スーパー ストII ザ ニューチャレンジャーズのROMの読み方
  12. Version 0.03の変更点とバグ
  13. SRAMカートリッジを作って見る

12/14/2011

つーか4800bpsケーブルって元々ターミナル側のフロー制御がOFFでもONでも動く様に回路図描いておいたから、 4800bpsケーブルもAVRケーブルもフロー制御ONにしとけばややこしくないですね。 そういやそれぞれのケーブルの4.7kΩって要らない気がします。 ハイインピーダンスになった時に必ずLow電圧で安定させる為の抵抗だから一応付けてるけど。
写真はロンドンバスになった4800bpsケーブルとAVRケーブル。

12/09/2011

そういや4800bpsケーブルはハードウェアフロー制御してないのだけど、 AVRケーブルは通信速度と通信手順の性質上ハードウェアフロー制御が必要なんで、 設定間違えない様に気をつけてください。 つーか4800bpsケーブルにもハードウェアフロー制御付けようかな。 ただ、もし付けてしまうと、 若干遅くなる事がある & 従来の4800bpsケーブルが使えなくなる と言うデメリットがあるから微妙。 ただし現状の 1度に書き込めるサイズは32kBytesまで と言う制約が解除されるメリットもあります。

ここでラミーのヒミツその1。 『ラミー割り込み使えないの♪』
ラミーは自身のカートリッジが抜かれた状態で動作する訳なのだけど、 これは言い換えると割り込みベクターテーブルが無い状態で動作してるのですね。
(割り込みベクターテーブルはカートリッジROMの先頭にある)
だから例えば受信制御の場合、 シリアルデータ受信完了割り込みを使ったフロー制御とFIFOは実装出来なくて、 基本的に常時ビジーにしておいて、 データが欲しい時だけレディーにすると言う方法で実装する事になるのですね。
つまりビジー中に一切データを受け取れない分 (FIFOが無い分)、 時間的なロスが起きる機会が多くなるのですね。
そして書き込みに時間の掛かるEEPROMの場合、 書き込みが終わる前に次のデータを受信してしまうから、 それを回避する為に書き込みデータ受信中はひたすらバッファー (最大32kBytes) に貯めておいて、 全部受信し終えた所で書き込みを始める仕組みになってます。
SRAM/FRAMの場合はすぐに書き込みが終わるからバッファーに貯める必要は無いのだけど、 EEPROMとSRAM/FRAMとで処理を別けるのが面倒と言う理由で一緒にしています。

ちなみにVSYNC割り込みももっぱら使えないから、1度受信待機に入ると、画面の更新が止まります。 更新出来なくも無いけど、受信待機してない時間が増えるんで、あまりしたくないです。

12/04/2011

ブレッドボード上にデカデカ載ってるAVRケーブルと4800bpsケーブルの交換がめんどくさいんで基板作りました。 写真はAVRケーブルのAVRの部分。 左のコネクターがメガドライブ側、右のコネクターがPC側。 使ってないピンはテスト出力用に使ってるのと、 将来使うピンが増えた時の為に、とりあえず全部のピンにピンヘッダーを付けといた。 一見コンパクトで良さげに見えるけど、表面実装品を結構使ってるから、 表面実装が苦手な人には参考にならないです。 特に74HC04はゴマみたいなサイズの互換品を使ってます。

11/28/2011

以前2MbitのSRAMカートリッジを作ったのだけど、割と役に立ちますねこれ。 Rammyの動作テスト用に適当なROMヘッダー情報書き込んで Rammyが正常に認識するか試したり、ROMデータの読み書きを試して見たり。

ちなみにこの写真は古いヤツで、アドレスラインの配線ミスってます。 (ROMデータが正常に書き込めなくて気付いた)
そして微妙に持ち始めた野望。
マジコンのUIは基本的に吸い出したROMや割れ物サイトからダウンロードしてきた 複数のROMを書き込んで使う前提で最適化されているのだけど、 デベロッパーの場合は基本的に1本のROMだけを頻繁に書き換えるから、 マジコンのUIだと用途に合ってなくてめんどい問題。
ウチ的にはバッチ処理で コンパイル → 各ファイルを結合してROMが完成 → RAMカートリッジ書き込み → 自動リセットしてゲーム開始 までを1ダブルクリックで済ませたいです。
そこでRammyのAVRケーブルとそれに対応した自己書き換え機能を開発するソフトに組み込んでおいたら 楽なんじゃないかと思ったわけですね。 128kBytes書き込むのに1分以上掛かってるけど、 変更された部分だけ書き換えなら、Bad Apple みたいなバカでかいリソースを書き換えるような事が無い限り、 128kBytesも書き換える事はまれなのですね。ええ。

11/27/2011

先週はベッドの横に棚を増設したり、 冷蔵庫の底に足を付けて移動できる様にしたり、 非常食を整理したり、 公園でカレー喰ったり、 メガドライブと関係無い事を色々やってました。 そして秋月電子の980円のUSB-COMポート変換ケーブルを破壊したっぽいです。 変換ケーブルが可笑しい事に気が付かなくて、しばらく悩んでました。
で、Version 0.03 公開しました。 予告通り高速ボーレート対応しました。 但し現状以下の制限があります。

Version 0.04 では4800bpsケーブルもAVRケーブルも使える様にするつもり。 そして出来ればメガドライブ側から勝手にAVRのプログラミングが出来る様にしたいつもり。
回路は前回の日記とは別物になりました。 使う部品は変わらないけど、配線が変わりました。

11/17/2011

ようやくAVR使った高速版で通信出来たっぽい。 とは言っても別に沢山コードを書いたとかデバッグしたとか言う事は無くて、 物凄いゆっくりなだけだけど。 でもまだオシレーター選択とボーレート選択機能付いてないです。
ところでAVRと言うと、最近のコードはもうめっきりCになってて、 アセンブラソース書いてる人を見かけなくなってきましたね。 ウチはPIC時代の流れで未だにフルアセンブラだけど。
で、ColumnsのROMを読み込んで見た。 1Mbit ROMだから読み出しテストが楽チン。 1Mbit (128kBytes) で 1分30秒掛かりました。 読み込み速度は1,456bytes/sec と言う事になりますね。 実際のシリアル転送量にすると 128*2*1024/90*10=29,127bps。 ん? なんかクソ遅いですね。 バーチャレーシング読み込むと24分掛かる事になります。 でも4800bpsの頃に比べたらクソ早いです。

ちなみにUSB-COMポート変換ケーブルによっては230.4kbps動作時にバグがある様なので、 ドライバーを最新にしてから、 115.2kbpsの時と230.4kbpsの時でそれぞれ8kBytesくらい吸い出してみて、 それらをバイナリー照合してみた方が良いかも。

そしてSweet Rammy専用のUSB-COMポート変換ケーブルとして TTL-232R-5V を使う場合、 配線がやたら楽になります。 例えばAVRを使わない低速版の場合、こんな感じになります。 TxDとRxDが反転して無い様なんで、FTDIのツールで反転しないといけない気がします。

11/12/2011

NBA JAMで以下の様に設定して読み出すとバスエラーでデバッグ画面が出るらしい。

ds.000000 
PR.200001 
PW.200001 
PC.200001 
PS.000080 
P+.000001 
PB.000016 
PT.002402 
PM.000011 
OK 
rd.000100
で、デバッグ画面 を元にCコンパイラが吐いたアセンブラソースを見てみると、
PC 00FF0D12 (このアドレスの命令を実行した際にバス エラーが発生)
SR 00002704 (ステータス レジスター)
D0 00200011 (C演算用, EEPROM I/Oのビット マスク)
D1 0000FFFF (C演算用, 一時計算用)
D2 00000000 (未使用)
D3 00000000 (未使用)
D4 00000000 (未使用)
D5 00000100 (C変数用, 読み出すデータの数)
D6 00000006 (未使用, 呼び出し元の関数で使ってるローカル変数)
D7 00000001 (未使用, 呼び出し元の関数で使ってるローカル変数)
A0 00200001 (C変数用, EEPROM I/Oのポインター) ★
A1 00FF32AC (未使用, 呼び出し元の関数で使ってるローカル変数)
A6 FFFFFF98 (Cローカル変数確保用)
A7 FFFFFF86 (スタック ポインター)
となる様です。ここで★印が問題で、 どうやらRammyはEEPROMを16bitバスアクセスする処理にバグがある様です。

11/07/2011

地味にAVR側をコーディング中。 そして回路は多分こんな感じ。
使えるオシレーターは4種類。 オシレーターの自動認識は出来なかったからジャンパーで決める事にしました。 14.7456MHzの場合はジャンパー線不要です。2ピン共未接続でOK。

ボーレートはスイッチ切り替えで3種類の中から選択します。 中点OFFになるスイッチを使うと良いです。 スイッチが無ければこれもジャンパーピンにします。 230.4kbpsなら74HC04でも足りると思うけど、実際はどうだろう。 あとコントロール2ポートに1kΩが挟まっていますが、 これは接続ミスとバグ対策で挟んでいるだけだから、本来は不要です。 いくらか抵抗値が違っていても良いです。 あまり高いと誤動作の確率が高くなります。 逆に低いと保護抵抗として機能しなくなります。

そして最近パッドの下ボタンがやたら押し難いと思って分解して見たら、 基板が腐食してた・・・。 中古なんでどうしてこうなったのか知らないけど。 とりあえづアルコールで拭いたら直ったからそのまま使ってます。 実はパッドはやたら沢山ある (ハードオフで見かける度に買う) からそんなに大した事では無いけど。

11/03/2011

X68000の最大ボーレートいくつだろうと思ってtmsio.x見たら、 117,180bpsとかあるのね。 この場合、この速度で割り切れる24MHz以下の周波数のオシレーターを使えば良いです。 そして仕様が大体決まったのでピンアサイン (仮)。 サポートデバイスはATmega88だけにしようかな。 将来Rammyから直接AVRに書き込み出来る様にする場合、 色々なデバイスをサポートするのめんどいかも知れないから。

;-------------------------------------------------------------------------------------
;Pin assign
;	RAMMY	FUNCTION	PORT PIN      PIN PORT	FUNCTION	RAMMY
;					_____
;CTRL2.D6 (!RS)	!RESET		PC6  1 |o    |28  PC5 	ADC5 SCL	NC
;	RXD	RXD		PD0  2 |     |27  PC4 	ADC4 SDA	NC
;	TXD	TXD		PD1  3 |     |26  PC3 	ADC3		NC
;	NC	INT0		PD2  4 |     |25  PC2 	ADC2		NC
;	NC	INT1 OC2B	PD3  5 |     |24  PC1 	ADC1		NC
;	NC	XCK  T0		PD4  6 |     |23  PC0 	ADC0		NC
;	+5V	-		VCC  7 |     |22  GND	-		GND
;	GND	-		GND  8 |     |21  AREF	-		0.1uF----|i.
;	OSC_IN	XTAL1 TOSC1	PB6  9 |     |20  AVCC	-		+5V
;	NC	XTAL2 TOSC2	PB7  10|     |19  PB5 	SCK		CTRL2.D5 (!WR)
;	NC	OC0B T1		PD5  11|     |18  PB4 	MISO		CTRL2.D4 (!RD)
;	NC	OC0A AIN0	PD6  12|     |17  PB3 	MOSI OC2A	CTRL2.D3 (D3)
;	NC	AIN1		PD7  13|     |16  PB2 	!SS  OC1B	CTRL2.D2 (D2)
;CTRL2.D0 (D0)	CLKO ICP1	PB0  14|_____|15  PB1 	     OC1A	CTRL2.D1 (D1)
;
;-------------------------------------------------------------------------------------

AVRの開発ツールが無い場合、 AVRのコード書き込みはAVRX Programerのavrspを使うのが一番楽かな。 avrspは下の図の通り簡単に作れるインサーキットプログラマーです。 下の図の 「3x2 Header」 をRammy用シリアルケーブル上のAVRに繋いで、 68000をHALTしたままメガドライブの電源を入れたら、 コマンドプロンプトで「avrsp.exe -FL11100000 -FH11011111」を実行して、 「avrsp.exe RammyAVR.hex」を実行すると自動で書き込まれて完了します。

(図のタイトルが 「AVRSP-COM」 なのは、 MS-DOS時代のまま更新されていなからだと思います。プログラムは32bitです。)
多分Rammyの場合は74HC125/126を抜いて抵抗器の値を変えるだけでもプログラム出来る気がします。 気が向いたらAVRプログラマーをRammyに内蔵して、 このインサーキットプログラマーを不要にするかもしれないです。
AVRX Programerのダンロードと使い方はここから。
http://elm-chan.org/works/avrx/report.html

11/02/2011

手抜き。

11/01/2011

Rammyの高速通信化につて考えて見た。 RetroDevのMega-CDを使った読み出しはパラレルポートを使ってるのだけど、 X68000とかAMIGAとかPC-9801とか、 AT互換機以外でも専用ソフト無しに使える事を考慮して、 今まで簡易RS232Cレシーバー/ドライバーだけだった通信ケーブルにAVRを追加して、 今までより高速だけど今までと同じ様にシリアルポートに繋いで使える様にしようと企んでいます。 使うAVRは今後の入手製を考慮してATmgea48, 88, 168, 328 に対応しようと思います。 ATmega8とかはもう古いし、ATtinyだとUART付きで自己プログラミング対応なの限られるし。 使うオシレーターによる最大通信速度の違いは以下の通り。 オシレーターの種類は自動検出にしたいです。DIPスイッチいじるとかめんどいし。
Sync Oscirator Baudrate UBRR Note
Good 2.4576MHz 76.8kbps 3 2457600/(4*8)=76800
Good 3.6864MHz 230.4kbps 1 3686400/(2*8)=230400
Good 4.6080MHz 115.2kbps 4 4608000/(5*8)=115200
Good 7.3728MHz 230.4kbps 3 7372800/(4*8)=230400
Good 9.2160MHz 230.4kbps 4 9216000/(5*8)=230400
Good 11.0592MHz 230.4kbps 5 11059200/(6*8)=230400
Subtly 12.8000MHz 115.2kbps 14 12800000/(14*8)=114285.7
Good 14.7456MHz 230.4kbps 7 14745600/(8*8)=230400
Subtly 16.0000MHz 76.8kbps 25 16000000/(26*8)=76923
Good 18.4320MHz 230.4kbps 9 18432000/(10*8)=230400
ちなみにメガドライブの非同期シリアルは各コントロールポート共に300〜4800bpsだけど、 1988年当時に個人で買えるモデムの速度が2400bps前後だったらしいから、 当時としては実用的な速度だったみたいです。

10/31/2011

スーパーリーグの基板を使ってRAMカートリッジを作って見た。 見ての通り、SRAMを2個ポン付けしただけです。(笑)
ピンクとパープルのワイヤーは !WE ピンです。 Rammyを使えばプログラムが動くカートリッジも作れるな〜と思って実験用に作って見ました。
ちなみにこのSRAMの代わりに+5V単一電源で焼き込みが出来るFlashROMを載せれば、 マクロ付きターミナルと結構な努力とRammyを使って焼く事が出来ます。 いい加減、超高速シリアルインターフェースを用意した方が良さそうな気配がギュンギュンしてきました。

10/30/2011

Version 0.02を公開して見た。 ATコマンドはEEPROMの場合に24C01決め打ち、ポートアドレス 0x200001 決め打ちになるんで、 それ以外の場合は手動設定が必要です。
将来的にReadMe.txtの下に書いてあるようなデータベースを参照して自動設定するつもりです。 あと大文字小文字を区別しなくなりました。 入力中にEnterキーを押す (CRかLFを送信する) と入力中のコマンドをエスケープします。 書き込みの時にデータを打ち込んでる最中でもエスケープ出来ます。 その場合、書き込みは何も実行されません。

PMコマンド
EEPROMのそれぞれのピンが何ビット目に割り当てられているかを指定します。 EEPROM自体の信号線はSDAピンとSCLピンの2つですが、 カートリッジによってはビットの割り当てがSDAピンが読み取りと書き込みで分かれています。

PM.000000	ビットマスク (3バイト目 = SDA_IN, 2バイト目 = SDA_OUT, 1バイト目 = SCL)
例えばモンスターワールドは ReadMe.txt で以下の様になっている (最後の 「0, 0, 1」 が 「SDA_IN, SDA_OUT, SCL」) ので、
{{"G-4060"}, 0, {7, 0x007F, 0x007F, 0x200001, 0x200001, 0x200001, 0, 0, 1}}, /* Wonderboy in Monster World */
以下の様に設定します。
PM.000001
OK

PTコマンド
デバイスタイプを指定します。 EEPROMの場合は24C01なら PT.002401、 24C32なら PT.002432 と言う様に設定します。 24C65の場合は24C64と同じなので PT.002464 と指定します。 24C65 や 24C1025 はFlashROMと同じ様にデバイスコードの読み出しが可能になっていますが、 Rammyはデバイスコードのチェックはしていないので、24C64 や 24C1024 と同じ扱いになります。 ATコマンドは24C01決め打ちなので、24C01以外の場合はPTコマンドで指定する必要があります。

PT.000000	デバイスタイプ (0x000A = RAM/ROM/IO, 0x000F = FRAM 0x2401〜0x2464 = EEPROM, 0x0128〜0x1024 = EEPROM)

PR, PW, PCコマンド
EEPROMの場合はそれぞれのコマンドで以下の様にEEPROMのI/Oポートアドレスを指定します。 これもATコマンドは全て 0x200001 に決め打ちするので、違う場合は手動設定する必要があります。

PR.000000	SDA_IN (バイト)
PW.000000	SDA_OUT (バイト)
PC.000000	SCLアドレス (バイト)
例によってモンスターワールドの場合、以下の様に設定します。
PR.200001
OK
PW.200001
OK
PC.200001
OK

P+, PBコマンド
PBコマンドで16bitバスを指定した場合は、P+がワード単位になります。 (ReadMe.txt 間違ってる・・・)

PB.0000016
OK
P+.0000001 ← 1ワード = 2バイト になる
OK

HDコマンド
HDコマンドでROMヘッダーを表示します。 タイトル名は海外タイトルのみ表示するので、 国内タイトルしか表記していないソフトの一部は空白になります。 (アドバンスド大戦略等)
また開発がアメリカの場合、 日本向けでもプラットフォームが「SEGA GENESIS」と表示されるソフトがあります。 (GREATEST HEAVYWEIGHTS等)

HD.000000
------------------------------------------------
SEGA GENESIS
(C)SEGA 1993.SEP
GREATEST HEAVYWEIGHTS
GM G-5538  -00
J
ROM: 0x000000-0x1FFFFF, SUM: 0x000000
SAVE: 0x200001-0x200001, TYPE: 0x41E840
------------------------------------------------
OK

UL, LK, BK, REコマンド
それぞれ以下の通りです。

UL.000000	アンロック (メガドライブモードの MMC & SRAM搭載カートリッジ用)
LK.000000	ロック (メガドライブモードの MMC & SRAM搭載カートリッジ用)
BK.000000	バンク切り替え (バンク番号) ...0x080000 - 0x17FFFF に1MBytesを割り当て & その他自動設定
RE.000000	68000リセット命令発行
ストーリーオブトアではULとLKコマンドが必要です。
スーパーストII (40M) でROMを読み出す場合、BKコマンドによるバンク切り替えが必要です。 BKコマンドを発行した時点で、ATコマンドと同じ様にROM読み出し用にある程度自動設定されます。 1MBytes単位の読み出しになるので、1MBytes読み出す毎にバンク切り替えする必要があります。 DSコマンドで状態をチェックしてみて下さい。
REコマンドは68000リセット命令を発行します。 これが必要なケースがあるか分かりませんが、一通り68000から出来ることは出来たほうが良いかなと言う。(笑)

プロテクト
過去のバージョンは公開終了しました。 現バージョン以降は特定の同人ソフトの読み出しを拒否する様にしたつもり。 (ソフト持ってないから検証してない) その特定の同人ソフトの開発者の人達の恩があるのと、 仲良くしとかないと将来的に困る可能性が高いという個人的な理由からです。(´ω`;)
特に最近発売された方はメモリーマッパー搭載な上に 「すぐに解析しちゃイヤン」 と言われてるんで、 セーブデータの読み書き以外にもメモリーマッパーの解析やROM吸出しも出来るRammyは自主規制しておかないとマズいです。(笑)

10/30/2011

10/27のファンタシースター復刻版の配線例。
1回バックアップするだけならテープの方が楽です。 何度も読み書きする都合上スイッチを付けたい人は参考にしてください。

以下注意点。

10/29/2011

ホンコンやRetrobeだと正常なデータが読み出せないと言うヴァーチャレーシング。 どんなもんだろうとRammyでヴァーチャレーシングのヘッダーを読み出したら正常だし、 他のアドレスのROMデータを部分的に読み出して見ても異常らしき感じがしないのですね。 そこでぽんさんに症状を尋ねて見たら、Retrobeではデータが0xFFで埋まってしまうらしい。
で、バーチャレーシングに載っているDSP (SVP) について少し調べて見たら、 どうやら68000側からROMのバンク切り替えやアクセス許可の為の制御をする必要は無い様子。 そこで他に何かDSPの正常動作に必要な条件があるか考えて見たら、以下の事に気付いた。

要するにDSPも1つのプロセッサーだから、クロックが必要なのですね。 あと、DSPはROMアドレス空間 (0x000000 〜 0x3FFFFF) 以外の制御もしているから、 0x3FFFFF までのアドレスバスしか結線されていない様な吸出し機だと浮いてるアドレスピンのせいで誤動作するかも。 但し、ROMの読み出しの為にこれら全てのピンの接続が必要かどうかは分からないです。
ちなみにウチはヴァーチャレーシングのカートリッジを分解するツールを持ってないんで、 このサイトの写真を参考にしました。
Sega Genesis PCB Information
と言う事で、『ROM吸出し』について何も配慮しないない のに 完全なROM読み出しをサポートしてしまいそうな予感 がしてきました。
但し転送速度がクソ遅いRammyで2MBytesや4MBytesのROMを読み出すのは時間的に大変・・・。(,´ω`;)

10/28/2011

下の10/27の日記の回路図を修正しておきました。 スイッチの手前にダイオード入れるの忘れてました・・・。

10/27/2011

ファンタシースター復刻版の続き。
まずマスターシステムの基本から。 マスターシステムで使われているCPUはZ80なので、64kBytesのメモリー空間を持っています。 このメモリー空間の前半48kBytesはカートリッジROMに、 後半16kBytesはメインRAMとI/Oに割り当てらてています。 この48kBytesのメモリー空間はバンク切り替えが可能で、 48kBytesを 16k + 16k + 16k の3つの領域に別けて、 それぞれの領域にカートリッジROMの任意の16kBytesを割り当てられる様にしています。 バンクを切り替えるには、以下のポート アドレスにバンク番号を書き込みます。

Port Address 0x01FFFB (Z80から見て 0xFFFD)
bit7〜bit0: 0x000801〜0x007FFF (Z80から見て 0x0400〜0x3FFF) にマップするROMバンク番号 ※

Port Address 0x01FFFD (Z80から見て 0xFFFE)
bit7〜bit0: 0x008001〜0x00FFFF (Z80から見て 0x4000〜0x7FFF) にマップするROMバンク番号 ※

Port Address 0x01FFFF (Z80から見て 0xFFFF)
bit7〜bit0: 0x010001〜0x017FFF (Z80から見て 0x8000〜0xBFFF) にマップするROMバンク番号 ※

※1バンクは16kBytes。
例えばアドレス 0x01FFFD に 0x01 を書き込むと、 アドレス 0x008001〜0x00FFFF の範囲にROMの 0x4000〜0x8000 の範囲がマップされます。
(Z80が8bitバスなのに対して68000は16bitバスなので、 68000から見ると1Byteおきの飛び飛び配置になります)
カートリッジに搭載されたSRAMを使う場合、 以下のコントロールポートでSRAMの扱いを設定します。
Port Address 0x01FFF9 (Z80から見て 0xFFFC)
bit7: 1 = 書込み禁止, 0 = 書き込み許可
bit6: 0
bit5: 0
bit4: 0
bit3: 0x010001〜0x017FFF (Z80から見て 0x8000〜0xBFFF) にマップするデバイス, 1 = SRAM, 0 = ROM
bit2: 0
bit1: 0
bit0: 0

※Rammyに関係無いビットの説明は省いています。
これらのポートは全てカートリッジ側に搭載されたメモリーマッパーの機能です。 言い換えるとファンタシースター復刻版に載っている SEGA 315-5342 の機能です。 なのでRammyを起動してファンタシースター復刻版を挿したら、 これらのポートに値を書き込む事で全てのROMとSRAMにアクセス出来ると思います。

次にメガドライブはカートリッジの結線状態でメガドライブソフトとマスターシステムソフトを区別しています。 マスターシステムモードで動作させるカートリッジでは、 ソフトリセットピンがGNDに接続されています (リセットが有効な状態)。 そしてあるアドレスピンがVccに、あるアドレスピンがGNDに接続されています。 なのでメガドライブモードで動作しているRammyでファンタシースター復刻版を扱うには、 以下の図の様にこれらのピン配線を切り離せる様にする必要があります。

Rammyを起動したメガドライブにファンタシースター復刻版を挿す前に、 必ずスイッチをOFFにしてから挿します。
回路上はスイッチが2つありますが、2連スイッチ (2回路入りスイッチ) を使ってスイッチを1つにまとめた方が安全です。
もし2連スイッチが無いという理由で、 1連スイッチ2個かジャンパーピン2個で代用する場合は、 確実にどちらのスイッチもOFFになっている事を確認して下さい。 スイッチをOFFにし忘れたまま挿すと、 アドレスバスがショートしてメガドライブかカートリッジが破損する可能性があります。(´ω`;) あと、パターンカットした時に、通電チェックして確実にカット出来てる事も確認して下さい。

余談。 ひぐらしさんがホンコンにファンタシースター復刻版を挿した場合に 「LEDが全部消灯しちゃいました・・・(-ω-;)」、 「電源がOFFになってしまうようです・・・」 との事なのだけど、 これは多分アドレスバスがショートしてるからだと思います。 ホンコンの回路図を見ると74HCT574の出力ピンがアドレスバスに直結されている上に常に出力有効になっています。 なのでホンコンのMDアダプター側で上記の図の様な切り替えスイッチを追加してやって、 ホンコンのソフトウェア側でメモリマッパーを操作してやれば、 ファンタシースター復刻版も吸いだせるはずです。多分。

色々書いたけど、まだ全部確実に吸い出せるかどうか分からないから、 あまり期待しちゃだめです。(*´ω`*)

10/26/2011

ファンタシースター復刻版は吸い出せるっぽい。 復刻版をそのままメガドライブに挿すとRammyが動かないか、 メガドライブを破壊するかのどちらかになるっぽいんで、 挿す前にまず復刻版の基板に吸出しモード用のジャンパーピンかスイッチを付ける必要があります。
詳しい事は別の日に説明するとして、とりあえず自分用にメモ。

!!! DO NOT TRY THIS COMMAND SET FOR PHANTASY STAR !!!
OK
P+.000002
OK
PW.01FFF9	← メモリーマッパー (SEGA 315-5342) のコントロールレジスターのアドレス。
OK
WD.00000108	← 0x08 = SRAMをZ80から見て 0x008000 〜 0x00BFFF にマップし、アンロックした。
0x0001
OK
PR.010001	← 68000から見たアドレスは 0x008000 * 2 + 1 = 0x010001 となる。
OK
RD.000010	← 試しに16Bytes読み出して見る。
5000414E544153592053334152202020 ← データ化けてる? (書き換えても書き変わらないバイトがある)
OK
PW.01FFF9	← メモリーマッパー (SEGA 315-5342) のコントロールレジスターのアドレス。
OK
WD.00000180	← 0x80 = SRAMをロックした。(機能してないかも。)
OK
ROM読み出しも同様で、マッパーを初期化しないと、何も出来ないです。 そして16kBytes読み出す度にバンクセレクトする必要があります。
復刻版の詳しいピンアサインはぽんさんの 2010年5月30日日曜日 ファンタシースター復刻版の吸い出し・・邪道技 にあります。

10/25/2011

色々なEEPROMの書き込みテストをしてみた。 買い足したのと元から持っているの合わせると、 24C01, 24C04, 24C64, 24C256, 24C512, 24C1025 の6種類。 これで128Bytes 〜 128kBytes までの各種EEPROM対応になりました。多分。 めんどくさいから、今の所先頭8バイトしか読み書きテストしてないです。

日曜は秋葉原にEEPROM搭載カートリッジを探しに行ったのだけど、 ジャンク品を漁っても目的のカートリッジが見当たらなかった。 箱入り・説明書付きならあるかもしれないけど、それだと無駄に高くて買えない問題。 なんでこれらのEEPROMは全部Control2ポートに繋いでテストしてます。 このテストの名残で、 次回公開予定の Version 0.02 はEEPROMポートアドレスに 0xA10005 を指定すると、 Control2ポートに繋いだEEPROMを読み書き出来ると言う副作用的な機能が付きます。

10/22/2011

Version 0.01は 「Sports Talk Baseball」 つまり 「プロ野球 スーパーリーグ'91」 以外のセガ基板の24C01だけサポートして見た。
AT.000000でPT.000002になればOK。 ポート設定の変更は出来ません。固定です。 動作確認したソフトはGREATEST HEAVYWEIGHTSだけです。 それ以外の機能追加は無いです。 次回は多分、

あたりがアップデートされるでしょう。
それからEEPROM対応化した関係で、以下の変更があります。

24C01のテストに使ったのはGREATEST HEAVYWEIGHTSです。 プレイヤーキャラをカスタマイズ出来るのだけど、色がヤバいです。

10/18/2011

前回と同じくEEPROM (24C01) の読み書きテスト中。 Cで書いたI2C EEPROMの読み書きルーチンは他の用途 (電子工作全般) でも使いまわせるから、 メガドライブ用ソフトでは使われないタイプにも対応してみた。 そして機種依存な部分を書き換え易い様にコーディングしてみた。 24C01(128Bytes) 〜 24C1024 (128kBytes) まで対応してます。 但し手元にあるのが24C01 (1アドレスバイト) と24C256 (2アドレスバイト) だけだから、 24C02 〜 24C16 (1アドレスバイト + コントロールバイト) の内のどれか1つが欲しいです。
ヲタハバラ逝ったら24CxxとディスクシステムのゴムベルトとメガCDのゴムベルト買います。

そしてSONIC3のFRAMが読み出せない事がある件だけど、 SONIC3の基板をぱっと見た所、74HC74が居るのが怪しいです。 74HC74って事はつまり何かラッチしてる訳で、何かの状態を保持してる訳ですね。

アドバンスド大戦略については、どうやら ぽんRev!! でもダメだったみたいです。 基板をぱっと見た所、他のソフトの基板と同じ様に見えるのだけど。

SONIC3とアドバンスド大戦略は基板を真面目にトレースするか、 とりあえずROM吸い出してデバッガーにかけてみる必要があるかも。
ちなみにその辺のROMサイトに転がってるROMは [!] が付いてるかどうかに関わらず、 密かに改造されてる事があるから、あまり使い物にならないです。

最後に1つ。
あるエミュレーターのソースコードを見たら、 ソフトのID (ROMヘッダーの T-12345 とか G-45678 とか書かれた部分) でEEPROMの種類と回路の種類を決めて居るぽいです。 セガ製造品は24C01且つ回路が1種類なのだけど、 他のメーカーはメーカーが好き勝手にやってるのでバリエーションが色々ある様です。

10/16/2011

EEPROM (24C01) の読み書きテスト中。 読み書きと言ってもI2Cの通信プロトコルから実装しないとエケないから、 カートリッジ上のEEPROMでは無くて、 使い馴染んだコントロール2ポートにEEPROMを繋いで試しています。 成功したらカートリッジ上のEEPROMでも試してみます。

テスト用の丁度良いEEPROMが無いかと引き出しを見てみたら、 昔チューブ入り105円くらいで買ったXICORのX24C01Pがありました。 X24C01Pと言えば、自分が持ってるカートリッジに乗ってるのもX24C01P。

10/15/2011

いくつかSRAM読み書きテストしてみた。
まずSonic3。FRAMだけどアクセス方法はSRAMと変わらないです。 どうもSonic3はWrite Lockが掛かった様な挙動があって、 その状態だと読み出したデータが全部ゼロで埋まってます。 でも実際のFRAMのデータはゼロでは無いです。 1度ゼロじゃないデータが読み出せれば、 あとは成功するまで何度でも書き込めるから特に問題は無いでしょう。


次、シャイニングフォース2。 特に問題無いです。中古で買ったから元の持ち主のお名前が入ってます。 すみれさんです。


次、ストーカー。 これも問題無いです。元の持ち主の経験値とアイテムが入ってます。


最後、アドバンスド大戦略。 テストしたら、中古で買った時点で入ってた元の持ち主のセーブデータが消えてしまったのだけど、 これはテスト前にセーブデータが消えて無い事を確認し忘れてて、 テスト前の時点で既に破損してたのか、 テスト時に破壊したのか分からないです。
1度分解して他の裸カートリッジと一緒に放置してたせいで 接触して一時的に電池が短縮してデータ破損した可能性があります。
そしてウチは時間のかかるシュミレーションゲームをプレイする気が無いから、 このカートリッジのセーブデータを作る為にプレイする事は無いでしょう。

10/14/2011

とりあえず公開。SRAMの読み書きが出来ます。 実装予定のコマンドの内、 SRAM読み書きに必要なコマンドしか実装していないです。
SRAMからデータ読み出す場合はまず以下のコマンドを送信します。改行は入力しません。

AT.000000
「AT.000000」はセーブデータアクセスに必要なプロパティーを自動設定するコマンドです。 コマンドを打ち終わるとメガドライブからレスポンスが帰ってきます。 レスポンスは設定されたプロパティーのリストになります。
(初期設定の場合レスポンスには改行が含まれてます)
次に以下の読み出しコマンドを送信します。改行は入力しません。
RD.000000
「000000」の部分は読み出すデータサイズ (16進数24bit) ですが、 「000000」の場合はデータサイズを省略したと見なして、 現在設定されているデータサイズで読み出します。 この例では直前にATコマンドでデータサイズが自動設定されたので、そのデータサイズが使われます。

SRAMにデータを書き込む場合もまずATコマンドでプロパティーを自動設定します。
AT.000000
次に以下の書き込みコマンドを送信します。
WD.000000
WDコマンドも「000000」の部分は書き込むデータサイズ (16進数24bit) になります。 「000000」の場合は読み出しデータサイズを省略したと見なします。
ここでメガドライブからのレスポンスは帰ってきません。 続けて書き込むデータを送信します。
データは連続した16進数表記のテキストです。 つまりRDコマンドで読み出したデータテキストをそのまま送信すれば、 セーブデータを復元出来る事になります。
データサイズに達した時点でメガドライブから「OK」と言うレスポンスが帰ってきます。

例として16bytesのSRAMが搭載されたカートリッジで読み書きした場合のログを挙げます。
OK
AT.000000
PR.200001
PW.200001
PC.000000
PS.000010
P+.000002
OK
RD.000000
00112233445566778899AABBCCDDEEFF
OK
AT.000000
PR.200001
PW.200001
PC.000000
PS.000010
P+.000002
OK
WD.00000000112233445566778899AABBCCDDEEFF
OK

10/12/2011

仕様が多分決まった。
意味不明なROMヘッダーで無ければ、 セーブデータの読み出しはハイパーターミナルからATコマンドとRDコマンドを打つだけで出来る仕組み。 書き込みはATコマンドとWDコマンド。

/*	[コマンド一覧]

	コマンド	説明 (引数の説明)
	AT.000000	ヘッダー情報によるプロパティーの自動設定 (0x00 = セーブデータ, 0x01 = ROM)
	RD.000000	指定サイズのデータを読み出す (バイト数)
	WD.000000	指定サイズのデータを書き込む (バイト数)
	DS.000000	現在のプロパティーを表示する (未使用)

	PR.000000	SDA_IN 又は 読み出し開始アドレス (バイト)
	PW.000000	SDA_OUT 又は 書き込み開始アドレス (バイト)
	PC.000000	SCLアドレス (バイト)
	P+.000000	インクリメント (バイト数)
	PB.000000	バスサイズ (0x00 = 8bit, 0x01 = 16bit)
	PT.000000	デバイスタイプ (0x00 = RAM/ROM/IO, 0x01〜 = EEPROM)
	PM.000000	ビットマスク (1バイト目 = SDA_IN, 2バイト目 = SDA_OUT, 3バイト目 = SCK)
	|  |		
	| 引数24bit
	コマンド名2文字
*/
Pで始まるコマンドは全部プロパティーの設定。 WDコマンドだけ引数に続けて書き込むデータが必要。
ここには無いけど、通信モードを設定出来るようにするつもり。 改行送信 (有り/無し) とデータ送受信方法 (ASCII/Binary) の設定です。 今は改行送信が有りでデータ送受信方法がASCIIだからハイパーターミナルで手打ちで使える代わりに転送速度が遅いです。

ちなみにデバイスタイプに0x00を設定してバスサイズをターゲットに合わせて設定すれば、 VRAM、Z80のRAM、FM音源、PSG音源、メガドライブ本体のリージョン&レビジョン情報にもアクセス出来ます。 ストII (512kBytes * 10Banks) みたいなROMバンク切り替えが必要なカートリッジのバンク切り替え操作も出来ます。

10/10/2011

今までSRAMの読み書きだけサポートする前提で作ってたけど、 ROMの読み出しとEEPROMの読み書きにも対応させる事にしました。
そして回路図はこうなった。超簡易版。 本当はスイッチを68000に直結せずに、 74HC14とCRでスイッチのチャタリングを防止して、 トランジスターや74HC125なんぞでオープンドレイン出力にした信号を68000に入力した方が安全です。 68000のHALTのピン番号は、DIPかPLCCかで違うから注意。 あと、基板のパターンカットは不要。

メガドライブ1は後期がPLCC、メガドライブ2は多分全部PLCC。 PLCCの場合はVccピン (14番ピン) とGNDピン (16〜17番ピン) の間を0.1uFが跨いでるから、 それを目印にすると良いです。(ピン番号を数えるのは面倒)
DIPの場合もピンの傍に0.1uFが跨ってるかは不明。

そしてコード書いてて気づいた事。 以下の例はint型が16bitの場合、期待通りにならない。

	long i;
	switch(i){
	case 0xA0000001:
		c = 120;
		break;
	case 0xB0000002:
		c = 37;
		break;
	case 0xC0000003:
		c = 45;
		break;
	}

次、 ROMに配置された以下の関数を自力でRAM上に配置して関数ポインターを使って呼び出しても、 ROMアクセスが発生してしまう。
32bitの割り算は68000に無いから、ROM上の割り算ルーチンを参照している罠。
long divdiv(long x32, long y32){
	return x32 / y32;
}

10/09/2011

とりあえずROMヘッダー読み込みとSRAM読み書き出来る事を確認出来た。
書き込みの時と読み出しの時で手順が違うのはめんどいし、 書き込みだけする人って居なさそうだから、 読み込みも書き込みもシリアル通信にしようかと思う今日この頃。

10/06/2011

棚を漁ったらバックアップ機能付きカートリッジが3つ出てきた。 しかも3つそれぞれバックアップ回路が違うと言うすばらしさ。 買い足さなくても3種類の回路のテストが出来ます。

左が24C01、下がFRAM、右がSRAM。
ふと気づいたのだけど、これってバックアップメモリーだけじゃなくてROMも読み出せますね。 その場合は通信速度が問題になるけど。

バックアップ回路の認識方法だけど、 まずROMヘッダーのSRAMスタートアドレスが奇数になっている場合は常に奇数アドレスにだけデータがあります。 偶数アドレスは0xFFか不安定です。 基本的にプルアップされてると思うから基本的に0xFFのはず。
そしてROMヘッダーのSRAMスタートアドレスが偶数になっている場合は常に偶数アドレスにだけデータがあります。
SRAM/FRAMの場合はまんまROMヘッダーのSRAMエンドアドレスからSRAMスタートアドレスを引いて2で割った数がSRAMサイズになります。
EEPROMの場合は3種類くらい回路バリエーションがあって、 それぞれI/Oポートのアドレスとバスサイズが違っています。 更にEEPROMの種類も色々あります。
ROMヘッダーに回路とEEPROMの種類を認識する為の情報があるかどうか分からないから、 EEPROMの場合はアクセス方法を手動設定する必要があるかも。

10/05/2011

メガドライブが以下の状態を保っている間はカートリッジが刺さって無くても動くと言う事と、 この状態に加えて68000をHALTさせている間はカートリッジの抜き差しも出来ると言う所までしか確認してないです。

1. 68000はZ80をHALTさせておく
2. 68000は全ての割り込みを停止しておく
2. 68000は自身のRAMに、カートリッジ アクセスの無いプログラムをロードし、そのプログラムを実行する

要約すると、どこからもカートリッジへのアクセスが無ければ良いと言う事です。
もしかしたら差し替え後のカートリッジのバックアップデータが破損するか期待通りに読み込めないとか問題があるかもしれないです。
その場合は、この企画はボツになります。

カートリッジ交換後は読み書きプログラムが勝手にカートリッジ ヘッダーのバックアップ メモリー情報を読む事が出来るから、 ユーザーがバックアップ メモリーのアドレスやサイズやメモリータイプを指定する必要が無いです。
(元のヘッダー情報が狂ってる場合は手動設定。)

inserted by FC2 system