2021/10/08
今更、「RD-512」のドライバを必要とされる方が自分以外にいるのか
と言う疑問を持ちながら制作しましたが自分自身もどうしても必要と
言う訳ではなく、趣味なのでが理由です。現在、当ドライバが動作する
予定の「RD-512」互換基板を製作中です。動作確認できれば回路図は
公開予定してますのでドライバが動作する仕組みより、使ってみたい
と言う方は<ドライバ使い方・補足>と<ユーティリティの追加>を
先に御読み下さい。
尚、著作権を勘案して15行目の「34 07 PSHS CC,A,B」から55行目の
「A6 04 LDA 4,X」までを当面、削除します。国会図書館で、コピー
サービスがありますので、研究したい方は1984年11月号のOH!FM誌に
掲載された「轍名 聡」氏制作の内容(P129-P133)を入手して
P133に掲載されている15行目の「34 07 PSHS CC,A,B」以降から
55行目の「A6 04 LDA 4,X」まで入力して、完成させてください。
現在ソフトバンクの出版部に、この部分の著作権に対する対応を確認
しています。返答がないか公開は不可と返答があった時は残念ながら
この部分で当ブログで公開する訳には行きません。互換基板が存在
しない状況であれば研究・調査と言うことで著作権侵害にはならない
と考えていましたが、状況が変わりました。
<2022/01/08追記>
ソフトの知識を蓄えたことにより、ハードの仕組みが見えてきました。
また互換基板を製作したことにより、ソフトの仕組みを整理することが
できましたので、判りにくかった点で説明を加え、大幅に修正しました。
<ドライバ制作の動機>
「RD-512」が未だ使えるとなると単にFDをコピーするバッファで
使うだけでは物足りなくなりました。先に制作したテストコードは
FDをコピーするバッファ用途として使えますけど、ここまで調べ
取りかかれば、RAMディスク用のドライバが視界に入ってきました。
しかし自力で1から制作する知識は持ち合わせてなく、参考となる
資料を探した所、運良く直ぐに見つかりました。1984年11月号の
OH!FM誌に掲載された「轍名 聡」氏制作のドライバです。全容で
256バイト足らずで、洗練されたコードにも関わらず丁寧で詳しい
説明があり広範囲でコードを流用させて頂きました。また運が良い
時は重なるもので相互リンクさせて頂いている「Old68fun」様が
「6809用クロス逆アセンブラ」を公開してくれましたので、早速、
これも利用させて頂きました。ソフト制作で強力な支援ツールに
なりましたので、御礼申し上げます。
<ドライバ(ソース)の簡単な説明>
「轍名」氏(同氏と略すことあり)制作のドライバを広範囲で
流用させて頂きましたが同記事はFM-7の裏ラムをRAMディスクと
して使うのでI/Oも違い記憶容量も違うので、その部分で修正が
必要でした。逆アセンブラしたリストは下にありますが著作権を
勘案して転載してませんので国会図書館等のコピーサービスを
利用して下さい。逆アセンブラリスト:「XRAMDK77_20220110.lst」
https://onedrive.live.com/?authkey=%21AAYw2tf9YTW2SLo&id=6357DCB7DCA88133%21284&cid=6357DCB7DCA88133
上記URLの「RD-512DRV」の下にありますが「Old68fun」様
制作の「6809用クロス逆アセンブラ」を使い、出力したものです。
1)ワークエリア(以下の情報を一時的に退避して使用する)
$6B02:8個の「データポート」用、デバッグ用に使用
$6B03:256個のセクタ番号を管理する「アドレスポート」用
$6B06:BIOSコールが読みか書きかを判断するフラグ用
2)轍名氏制作のドライバからの流用部分
「RAMディスクか否かの判断」と「パラメータ検査」で流用する。
34行目の「A7 BC BF STA L_6B08,PCR」を除き、15行目の
「34 07 PSHS CC,A,B」から55行目の「A6 04 LDA 4,X」までは、
そのままのコピーになります。
3)今回製作した当ドライバ独自の部分
ポジション・インディペンデント仕様でありますが、配置は
「$6B00ー$6BB2」にあるこを前提として、説明します
I/Oの違いがあるので、逆アセンブラの56行目の
「6B6E 84 07 ANDA #$07」以降になります。
ディスク関連のユーティリティを制作する上で、全セクタに通し
番号をつけて計算すると管理が容易になりますので、ドライバでは
セクタ用のデータを管理する際に↓の式を前提に、制作してます。
(トラック番号)×32 + (サイド番号)×16 +(セクタ番号)- 1
しかし既に説明してますが「RD-512」はリニアに管理はできません。
各データポート1個につき8トラック分の管理しかできません。なので、
変換する必要があります。そこで考え易いように変換表を作成しました。
「RD512_BIOS.png」です。「XRAMDK77_20220110.lst」と同じ
リンク先にあります。尚、「オフセット」とは$FD48をゼロ基点とした
時のオフセットで、「000」の時は$FD48が「データポート」となり
「オフセット」が「001」の時は $FD49が「データポート」になります。
以下「オフセット」が「010」の時は$FD4Aが「データポート」となり、
以下同様に繰り返します。リストの60行の$6B76で、RCBからトラック
番号をAレジスタに取得していますが、この3ビット目から5ビット目の
3ビットが$FD48を基点とするオフセット値になります。なので61行目
以下、3回「ASRA」を繰り返した値を#$FD48に加算してアクセスする
「データポート」を決定してます。
また8トラック分を管理できる最大セクタ数は↓の式になります。
(32セクタ)×8 = 256(セクタ)(16進数では「#$20」です)
この数値が1個の「データポート」で管理できる最大セクタ数です。
RCBから取得したトラック数をセクタ数に変換する際はトラック数を
丸ごとセクタ数に変換はできません。$FD48を基点とする、8個の
「データポート」で、64Kバイト毎に区分けしてバンクメモリ的に
管理するからです。ですのでRCBから取得したトラック数の処理で
下位の3ビットだけを使い、56行目で「ANDA #$07」としてます。
結局、54行目から57行目からの処理はセクタ番号を管理する上で
$FD40 を使っていますが、このアドレスに設定する数値を求めて
います。式としては↓のイメージになります。
(下位の3ビット)×32 + (サイド番号)×16 +(セクタ番号)- 1
尚、「下位の3ビット」とは「トラック数の下位の3ビット」です。
ここが判らないと56行目以降の意味は理解できないと思いますが、
説明が疎く、上手くも説明できません。逆に上記の内容が判れば
56行目以降のコードは判ると思います。
「RD-512」では1個のアドレスポートだけではリニアに管理できない
ので、以上が工夫した点です。尚、「読み」、「書き」の局所的な
コードは1987年2月号の「THE・BASIC」誌のアルゴリズムを取り
入れてます。尚、現状のコードは実FDD数を2個としてますので、
実FDD数が違う時は21行目の「CMPB #$02」の部分を変更して
下さい。
<謝意>
1からドライバを制作することは不可能でしたが、有識者の知恵と
コードとツールをお借りして何とかドライバとして仕上げました。
改めて御名前を上た方々には感謝する次第です。
<ドライバ使い方・補足>
先ずは「RD-512」をFM-7の32ピンコネクタに確り挿し込んで下さい。
特にFM-77では溝(左に窪み)がありますので注意深く挿して下さい。
挿し込みが甘いとブザーがなり、FM-7が起動しませんし、最悪の
ケースは考えたくないですがハードの故障に繋がります。次にFM-7を
起動する際に実FDDの数より1多い数を入力して下さい。ドライバを
$6B00からに配置した時は「EXEC &H6B10」リターンとコマンド
ラインから打ち込んで下さい。BIOSを一旦 $6B20 からに迂回させ、
以降は「RD-512」用のRAMディスクコマンドか否か等の検査をします。
否の時は本来のドライバに処理を任せますし、該当するコマンドの時は
パラメータを検査して、エラーがあればBIOSにエラー設定をして、
コール元に復帰します。該当コマンドであり、なおかつパラメータが
正常であれば、このドライバが対応します。確かめたコマンドは
「files,load,save,kill」です。また、BIOSをFM-7(77)が
起動した時の初期状態にする時は「EXEC &H6B08」リターンと
して下さい。尚、このドライバで「FT245基板」を使い「RD-512」の
セクタデータをwindowsに送るようなことはしないで下さい。
このドライバはBASICから呼ばれ「RD-512」を操作してるからです。
この仕組みはwindowsアプリがイベントから呼ばれwindowsAPIで
コーデイングするサンドイッチ構造に何か似てると思いました。
<ユーティリティ(テストコード)の追加>
FDD ←→ RAMディスク の全セクタのコピー:RD512_RW.dat
「XRAMDK77_20211007.lst」と同じリンク先にあります。
アドレスの配置は固定です:$6700-$68FF
FDD1 → RAMディスク:EXEC &H6850 リターン
RAMディスク → FDD1:EXEC &H6750 リターン
それではまた。