2022/02/11
512K_RAMディスクのドライバの説明としてコードに説明を加えた
「XRAMDK77.DATの説明書」を作成しましたので公開します。
https://onedrive.live.com/?authkey=%21AAYw2tf9YTW2SLo&id=6357DCB7DCA88133%21284&cid=6357DCB7DCA88133
・512K_RAMディスクを使うために、2つの方法を用意しました
1)RD512_RW.DAT︓ドライブ1の内容を RAMディスクにコピーします。
実行は配置位置を「$6700ー$68FF」にしてあることを前提として
「EXEC &H6850 リターン」です。尚、RD512_RW.DATは RAMディスク
の内容をドライブ1にコピーする機能も持っています。
実行は配置位置を「$6700ー$68FF」にしてあることを前提として
「EXEC &H6750 リターン」です。
2)RAM512SR.DAT︓Windows 上のディスクイメージをRAMディスクに
転送します。FT245カードとFDDIMG_RW77.EXE(VER2.0)が必要です。
その後、512K_RAMディスクのドライバ「XRAMDK77.DAT」を実行します。
尚、RAM512SR.DATは RAMディスクの内容をWindows に転送する機能も
持っています。この方法はFDDIMG_RW77.EXE(VER2.0)も使いますので
改めて説明します。
3)上記のユーティリティを実行後に、ドライバの「XRAMDK77.DAT」を
「$6B00ー$6BB2」に配置して下さい。この状態を前提とし説明しますが
「XRAMDK77.DAT」自体は256バイト毎の配置位置が変更可能な、所謂
ポジション・インディペンデント仕様です。配置位置が、この状態の時に
コマンドラインから「EXEC &H6B10 リターン」と実行して下さい。
事前にユーティリティの「RD512_RW.DAT」か「RAM512SR.DAT」を
使った設定がないと、filesコマンドを実行すると「FD構造エラー」的な
メッセージが出力します。説明通りに設定した後に「files"2:」とすると
RAMディスクの内容が表示されます。ただし、 RAMディスクをドライブ2に
設定した場合です。ドライブ数の設定はDISK-BASIC起動時に
「HOW MANY DISK DRIVES?」で「3」と入力(実ドライブより1大きい値)
して下さい。FILE数は任意です。RAMディスクをドライブ1に設定する時は、
この内容の最下部を参照して下さい。
・ドライバの構造と仕組み
重点とした内容を御読み頂くと理解の一助になるのではと考えています。
尚、「49行目の$6B61」から「53行目の$6B69」までの7バイトを
意図的に空白にしました。この7バイトは1984年11月号のOH!FM誌に
掲載されたP133にある「轍名 聡」氏のコードの一部です。
著作権を勘案して国会図書館からコピーを入手し、空白の7バイトを
補充して下さい。そうすることによりドライバが完成します。
因みに、試してはいませんが空白の7バイトを補充せずに実行すると
FM-7は暴走すると考えています。7バイトの補充後も入念にコードは
検査して下さい。何かありましても責任は持てません。
また、7バイトを空白にした理由は「FM-7」だからです・・・???
更に、「XRAMDK77.DATの説明書」は著作権を保有してる方より
削除要求があった時には速やかに削除することを御了承下さい。
1)15行目から55行目まではRAMディスクか否か、とパラメータ検査に
1984年11月号のOH!FM誌に掲載された轍名氏のコードを参考にしてます。
2)56行目から64行目までは、全セクタに通し番号を振ると言う考えは
取り入れてますが「RD-512」の「I/O」仕様による制約から、自分が
工夫して作成したコードです。
3)65行目から85行目までは、「RD-512」の「I/O」仕様に基ずく
「RD-512」とメインメモリ間のデータ転送コードになります。
1987年2月号の「THE・BASIC」誌のP137に掲載された
「猿人 留夢」氏が制作したコードのアルゴリズムを参考にしました。
4)この後に再度、轍名氏のコードを参考にし完了します。
ポジション・インディペンデント仕様とRD-512のI/Oに対応させた部分が
当方の独自内容になります。尚、参考にした轍名 聡氏のドライバ自体が対応
可能な作りとも言える訳で同ドライバが秀逸だった証左になると考えています。
「轍名 聡」氏のドライバは「FM-7」の裏RAMを使い、RD-512のドライバは
「データポート」として$FD48を基点にバンクメモリ的な「I/O」にアクセス
します。
重点としてはRCBから取得したトラック番号の処理で、2つの事をする必要が
あります。1つはトラック番号の下位3ビット分をセクタ数に変換し、セクタ
番号、サイド番号×16とを合算した「通算のセクタ数」を求めることです。
理由はこの数値の合計の最大値が256セクタになり、RD-512のバンク的な1つの
メモリ空間の限界だからだからです。もう一つの処理は、このトラック番号の
3ビット目から5ビット目の3ビットが$FD48をゼロ基点とする「オフセット値」
になり、アクセスする「データポート」を決定します。
重点を補足すると、実際には下記の処理をしています。
下記のリンク先にある「RD512_BIOS.png」で単に「オフセット」と言う値は
https://onedrive.live.com/?authkey=%21AAYw2tf9YTW2SLo&id=6357DCB7DCA88133%21284&cid=6357DCB7DCA88133
$FD48をゼロ基点とした時のオフセット値で、「オフセット」が「000」の時は
$FD48を「データポート」として「オフセット」が「001」の時は$FD49が
「データポート」になります。以下「オフセット」が「010」の時は$FD4Aが
「データポート」になり、以下同様に繰り返します。リストの60行の$6B76で、
RCBからトラック番号をAレジスタに取得していますが、この3ビット目から
5ビット目の3ビットが$FD48を基点とする「オフセット」になります。
ですので61行以下3回「ASRA」を繰り返した値を#$FD48に加算しアクセスする
「データポート」を決定してます。判り難い点は全セクタに通し番号をつける
考えですが、「アドレスポート:$FD40」で使う数値は、RCBから取得した
トラック番号の下位3ビット分のみ使います。そのためのコードが56行の
$6B6E における「ANDA #$07」になっています。全セクタに通し番号を
つけて考えるとは説明してますが「RD-512」のI/Oに制約されますので、
RCBのトラック番号の下位3ビットは「$FD40」に設定する数値を決定する
ために使い、3ビット目から5ビット目の3ビットは$FD48を基点とする
「データポート」を決定する数値として使ってる訳です。
またI/Oにアクセスするコードは1987年2月号の「THE・BASIC」誌のP137に
掲載された「猿人 留夢」氏制作のドライバ(コード)ですが、誰が書いても
変わらないと思います。なので分かり易く、「RD-512」の「I/O」である
「$FD40」、「$FD41」、「$FD48」の3個は、あくまでも比較としてですが
他の「I/O」よりは容易に発見できました。尚、「猿人 留夢」氏のコードが
判り易かったことは同氏の技術力が低いことを意味しません。逆に判り易い
と言うことは同氏の技術力も熟練の域に達していたと考えています。
(1)$6B08 ー $6B0E:BIOSのエントリアドレスの復元
(2)$6B10 ー $6B1A:BIOSのエントリアドレスをRAMディスク用に設定
(3)$6B1B ー $6B1E:リクエスト番号8で何もする必要がない時の最後の処理
上は「轍名 聡」氏の説明でラベル名は「NOSECT」となっています
(4)$6B20 ー $6B32:1984年11月号のOH!FM誌のP133に掲載されたコピー
(5)$6B35がエントリになり、更に真の「RAMDSK」の処理ルーチンへJSR
理由は「轍名 聡」氏のドライバは裏RAMを使っていて裏RAMとの遷移で、$FD0Fを
変更してますが、自分はこのコードを削除してるので、エントリのみ残りました。
「轍名 聡」氏のドライバではラベル名が「URAMDK:$8000」にJSRしますが
自分のコードでは「L_6B40」からの処理が該当します。「L_6B40」以降では
RCBパラメータの検査をします
(6)の演算でリクエスト番号9(書き込み)は:A=0 となり、リクエスト番号10
(読み出し)は:A=$FF となる(巧妙なコードで、驚くばかりです)
(7)セクタ番号が1から16であるかの検査ですが、「セクタ番号が1から16」なら
Aレジスタの値は 0 から $0F になると説明されてます
(8)「セクタ番号 ー 1」とスタックに入っていた「サイド番号 × 16」を加算
(9)御存知とは思いますが、RAMディスク用ドライバを制作する上で、トラック
番号をセクタ数に変換しセクタに通し番号をつけ計算する考えで、Windows用の
「FDDIMG_RW77」でも、同じ計算はセクタ内容の書き換え機能で使ってます。
因みに全セクタをリニアにアクセスできるなら計算式は下になります
(トラック番号)×32 + (サイド番号)×16 +(セクタ番号)- 1
残念ながら「RD-512」の「I/O」の仕様より、この式のままでは使えません。
しかし、考え方(着想)は取り入れてプログラムを制作しました。
(10)実FDD数が1個なら「CMPB #$01」にしますが、他のドライブ数では
テストしてません