ディスクシステムローダー(α版未満)その3

  • 2013/01/20(日) 13:14:45

なんとかデータをdumpできる感触です。

こんな感じ。
もうちょっと煮詰めたら公開したいと思っていますが、その前に目標と簡単な仕様など。

目標は
ファミコンディスクシステムを含むクイックディスク(MZ-1500とかも)をタイムカウント方式でドライブから直接dumpする。
dumpしたデータからバイナリへ変換して、各種エミュレータなどで使用できるイメージを作成する。
dumpしたデータ、もしくは独自のイメージからディスクへ書き戻すことができる。
直接ドライブ自体をエミュレートできる(HxCみたいにRAMアダプターへ直接つなげる)
エミュレートはスタンドアロンでも動作できるようにする。

#無理難題が多いw

今のところこの環境でイケるんでは?というもの
メインのデータ処理部分はAtmega644Pもしくは1284Pを予定。5Vで20MHz動作です。
#パッケージは何でもいいですが、入出力のバスやドライブの制御にピンが多くないとだめなので。今のところAtmega164Pでも大丈夫なぐらいのコードサイズですが、将来肥大化する可能性のために。
デバッグを容易とするために、ファームウェアはブートローダーから自己書き換え可能なものとして作成して、いつでも新しい機能を追加できるようにする。
PCとのデータ転送にはFTDIのFT232Hを利用し、USB2.0で。
#一から作成するのは面倒なのでUM232Hという完成している基板でやり取りしています。秋月で売ってるやつ。
#Atmegaやディスクドライブへもバスパワーから電源を供給するようにしたのでHubとかだと問題かもです。
今後いろいろと問題が起こるようなら外部電源でセルフパワーにするつもり。
PCでの制御ソフトはwindows機32ビットのXP以降、.NET4frameworkがインストール済みのもので、VisualBasic2010で作成したソフトウェアでデータのやりとり。

で、現時点での動作は続きます。


ディスクドライブの電源を入れておく。

ディスクはまだ入れない。

UM232HをWindows機へ接続。

Atmegaへも電源供給され、スイッチを押すように表示される(まだ押さない)

VisualBasicのソフトを起動、UM232Hをイニシャライズ。

Atmega側のスイッチを押す。

ディスクを入れるように表示されるのでディスクを挿入。

ディスクが動作し、ヘッドの位置がディスクの先頭に来てReadyになるまで待機


そこからDump開始。

VisualBasic側でReadDataボタンを押す。

ディスクの最後までdumpされたら終了。

こんな感じです。

出てきたデータはこれ。

各ビットの立ち上がりの間隔をタイムカウントして、そのカウントをどんどん取り込んでいる形です。
1カウントはAtmegaが20MHz動作でプリスケーラが1/8なので400nsecです。
ということで、ざっとデータを見てみると、おおよそ「0x1A」「0x28」「0x35」の3パターンに分離されます。
実際の時間を計算すると、10.4us、16.0us、21.2usとほぼ理論値どうりです。



MFM方式で記録されているので、それぞれが「10」「100」「1000」のビットパターンになります。
#3838hから385Fhまで見てください。
そのパターン当てはめてビットへ変換すると
「10 10 10 10 10 10 100 10 100 10 10 10 10 10 10 100 1000 1000 100 10 100 10 10 100 100 1000 100 100 100 100 100 100 10 10 100 100 100 10 100 1000....」
となります。
これをクロックビットとデータビットに分けると、
「10 10 10 10 10 10 10 01 | 01 00 10 10 10 10 10 10 | 10 01 00 01 00 01 00 10 | 10 01 01 01 00 10 01 00 | 01 00 10 01 00 10 01 00 | 10 01 01 01 00 10 01 00 | 10 10 01 00 0....」
#クロックビット、データビットの順です。

ここからクロックビット、データビットを分離してデータビットだけを抜き出すと、
「00000001 | 10000000 | 01010100 | 01110010 | 10010010 | 01110010 | 0010.... 」
という感じでビットの並びが出てきます。
クイックディスクはLSB→MSBの順で、1バイト(8ビット)ごとにデータが並んでいるので、これをさらにバイトに直すと
#8ビットごとに反転して16進数にします。
「0x80 | 0x01 | 0x2A | 0x4E | 0x49 |0x4E | .....」
となり、これをASCIIコードに変換してやると
「0x80 | 0x01 | * |N | I | N | ......」
という形で、ディスクシステムのヘッダが出てきますよ!

というわけで、dumpできていそうです。
この方法であると、FDSイメージで欠落しているGAP(0x00)の個数やCRCのデータなども全て取れますし、

「ディスクわっかー」とか使えば、MZ-1500とかのディスクもdumpできます。

まだまだ途中ですので、もうちょっと使いやすくして公開したいと思います。
って誰かプログラミング手伝ってほしい。VisualBasicとか始めてですよw
Cとかも理屈は分かるけど構造体のポインタのポインタとか無理ってレベルw
ヒーコラ言って作ってますw

では〜

この記事に対するコメント

おっ!凄いとこまで来てるんですね、非常に興味津々です。
プログラムはお手伝いできないので残念です。

かなり進んでいるんですね〜
ディスクシステムを直接制御している方はおそらくいないと思うので
超期待しちゃいますw
MZ-1500のQDが吸い出せるのもかなり興味深いです。

なんとかここまできましたが、色々とまだまだ山がありそうですw
今、なんとかしてこのデータをバイナリに変換するように色々と試行錯誤しているのですが、部分的にゴミのデータがあるディスク(書き込みのあるディスクなど)の処理など色々と面倒です。
あと、既にAtmegaのピンが限界ですので、SDカードを制御できるような形にする以上の拡張は無理かなって感じです。
もうちょっと煮詰めてみます。

この記事にコメントする

管理者にだけ表示を許可する