[2021年1月13日]仮想ドライブ構築ソフトのバグ修正版Ver1.21に関して追記しました
今まで、FM77AV40SX上でFLEX9とOS-9用にWindows機上の仮想ドライブを構築して、内蔵ドライブ0,1に加えて仮想ドライブを2,3として使用していましたが、最近、常用しているSXに加えて、再びFM-7をいじりだしたこともあり、ディスクドライブを持たないFM-7でDISK-BASICを使いたくて、先日製作したRS232Cカードを使用して何とかしたいと考えていました。
そんな時に、
日本橋電気街徘徊日誌さんからプリンタポートに接続するシリアルメモリからDISK-BASICを起動するカードを頂きましたので、これをベースにして仮想ドライブを構築することとしました。
RS232Cを内蔵しているFM77AV以降の機種ではそのままで、FM-7(DISK-BASICが動作する環境が必要)等ではRS232Cカードを追加すれば仮想ドライブが実現できます。これによって、ファイルは全てWindows上のファイルとして保存でき、簡単にDISK-BASICとの間でやり取りできます。
さらに、私の製作した拡張I/OボードのFT245RLやFT232RLを用いたパラレル/シリアルポートを使用することもできます。
全体の構成図は以下のようです。
|
全体の構成 |
FM-7用のRS232Cカードは8月16日のブログで紹介したもので、拡張I/Oボードは6月12日と8月26日のブログで紹介したものです。
制作したプログラム
(1)仮想ドライブ構築ソフト FBasDrvWin.exe(Windows側)
基本的な考え方は2018年4月16日のブログ「FLEX用Virtual Driveの作り方」で説明した通りですが、DISK-BASICのFMS(ファイルマネージメントシステム)に相当するものを実装する必要がありますので、エミュレータXM7を用いて、ファイルを追加・削除・名称変更などをする毎に変更前と変更後のDSKファイルの全体を比較し、どこが書き変わっているかを調べるという愚直な手法で調査し実装しました。
手間としては、OS-9のような複雑なシステムではなく、比較的単純なFATシステムですので、それ程大変ではありませんでした。
実際に使用してみると、BASICプログラムについては、Windowsで作成して仮想ドライブにDrag/Dropすることで簡単にDISK-BASIC側に持っていけるのですが、機械語プログラムはそのままでは持っていけないので、S-format形式やHex形式のファイルを読み込んでDISK-BASICの機械語ファイル形式に変換して保存する機能を追加しました。
(2)ドライブ拡張ソフト WINDRVxx(FM側)
基本的にはドライブ番号が2,3の場合にBIOSの8,9,10を切り替えて、仮想ドライブにアクセスするようにすれば良いわけですが、それをどこに置くかが問題です。
参考にしたのは、Oh'FM 1984年11月号に掲載された「裏RAMディスク」(轍名聡さん)です。これを見習ってBIOSの変更部のみを$FC30~に置き、その他は裏RAMの$8000~に置くことで表RAMの消費を少なくすることができました。
後はFMとWindows間の通信に関わる部分のみで、3種類の通信経路を実装しました。
RS232Cの8251A、拡張I/Oボード上の6850+FT232RL(または6850+ADM232)と6821+FT245RLの3つです。
8251Aのプログラムに関して
6850と6821を使用した場合のプログラムは、慣れていることもあり、割とすんなりと作成できましたが、8251Aを使用する方には苦労しました。
FM側からの送信はできるのですが受信ができないのです。F-BASICのプログラムでは問題なく送受信ができることからハードに問題がないことは分かりますし、プログラムも単純なもので、それにRTS/CTSによるハードウエア制御を加えただけで、6850では同様な制御がちゃんとできています。
この問題に一ヶ月以上を費やしましたが、ネットにも8251Aを機械語でハードウエア制御した例は見つからず、お手上げ状態でした。そんな時に、ネットのルネサスの質問箱のようなところで、USARTでのRTSは送信・受信の両方を同時には制御できないようだという書き込みを見ましたので、もしかしたらこれかもと思いましたら、ビンゴでした。
つまり、8251AでRTS制御するときには、RxEとTxENを同時にイネーブルにしてはいけないということでした。受信時にはRxEのみをイネーブルにし、送信時にはTxENのみをイネーブルにしなければならないということなのです。その部分のソースリストを示します。
*
MRSTU EQU $40 ;master reset
MODEU EQU $4E ;1stopbit,non pari,8bit,16x
CLRTSU EQU $15 ;RTS=H,ER,RxE,TxEN
SERTSUR EQU $34 ;RTS=L,ER,RxE for receive
SERTSUS EQU $31 ;RTS=L,ER,TxEN for send
TxEMPTY EQU $04
*
*--------------------------------------
* receive from serial port
* (use USART 8251A)
* A <- port
*
RCVCH EQU *
LDA #SERTSUR ;RTS=L
STA SCMD
NOP
RCV1 LDA SSTS
ASRA
ASRA
BCC RCV1
LDA SDATA ;get data
PSHS A
LDA #CLRTSU ;RTS=H
STA SCMD
PULS A,PC
*
*--------------------------------------
* send to serial port
* (use USART 8251A)
* port <- A
*
SNDCH EQU *
PSHS A
LDA #SERTSUS ;RTS=L
STA SCMD
NOP
SND1 LDA SSTS
ASRA
BCC SND1
PULS A
STA SDATA ;send data
PSHS A
SND2 LDA SSTS
BITA #TxEMPTY
BEQ SND2
LDA #CLRTSU ;RTS=H
STA SCMD
PULS A,PC
*
6850では同時にイネーブルにしても何の不都合もありませんので、8251Aのこの制約は何なのだろうかと思います。
知っている方には常識かもしれませんが、どなたかのプログラミングの参考になればと思いますのであえて書き記しておきます。
プログラムですが、メモリ節約のためにすべてに対応するプログラムではなく、別々のプログラムとしました。
FM-7(8251Aカード)用 :WINDRVU7
FM77AV40SX(内蔵8251A)用 :WINDRVUX
FM-7/FM77AV40SX共通(6850+FT232RL用):WINDRVA
(6821+FT245RL用):WINDRVP (要RTS制御)
の4種類です。
動作中の様子
各部の接続の様子を示します。左上に見えるのがシリアルメモリからDISK-BASICを起動するカードで、プリンタポートに接続されており、電源は拡張ポートから取っています。
左が自作の拡張I/Oボードで、FM77AV40SX用に製作したものですが、インターフェースボードを介して32Pスロットに接続しています。
|
動作中の様子 |
Windows機上のFBasDrvWin.exeの画面です。DSKファイルだけでなく、D77ファイルも扱えます。
|
FBasDrvWin.exeの画面 |
RS232Cカードと拡張I/Oボードへのケーブルの接続の様子です。
|
RS232Cカードと拡張I/Oボードへのケーブル |
拡張I/Oボードへのインターフェース基板です。単なるピン配置の変換のみです。
|
拡張I/O ボードへのインターフェース基板 |
プログラムのインストール方法
インストールするためのF-BASICプログラムを用意しました。インストールの手順書を添付しましたので、そちらをご覧ください。
プログラムの使用方法
(1)FM-7,FM77AV40SX側
起動時にドライブ数として4を指定します。
LOADM "x:WINDRVxx",,R と入力して、必要なプログラムを起動します。
(2)Windows側
FBasDrvWin.exeを起動します。
起動時に同じフォルダ中に.INIファイルがあれば、それを読んでポート番号、ボーレート、ハンドシェークを設定します。
ボーレートはFM77AV40SXで8251A使用の場合のみ19200baud、その他は38400baudです。
処理するディスクファイルをDrive 2や3のボックスにDrag/Dropします。
ディスクファイルの形式はDSK形式とD77(D88)形式のどちらにも対応しています。
ファイルリスト欄でファイルの追加、削除、名称変更ができます。
【制約】2DDディスク対応について
FBasDrvWin.exeは2DDディスクファイルに対応するように制作してありますが、WINDRVxxの方は現在のバージョンではF-BASIC V3.0にのみ対応しています。
F-BASIC V3.3では$FC30からの領域を使っているのか、それとも裏RAMの$8000からの領域を使っているのか不明です。保存領域をずらしてみたりしているのですが、今のところ動作させることができていません。もしかしたらBIOSそのものの場所がV3.0とは違っているのかも。(F-BASICのことは良く分からない。。。)
(FBasDrvWin.exe単独で2DDディスクファイルを処理することはできますので、例えばこれを用いて作成したディスクファイルをエミュレータXM7で使用することもできます。)
(3)F-BASICで扱うファイルの形式(の一部)
(3-1)BASICファイル(アスキーセーブ)
先頭に改行($0D,$0A)があればBASICアスキーファイルと解釈される。
(3-2)BASICファイル(バイナリセーブ)
先頭からプロテクトフラグ($FF,$FE)、UNLIST開始行番号、以降にテキストが続く。
(3-3)機械語ファイル
先頭から$00、データ長(2バイト)、格納開始アドレス(2バイト)、データという形のデータブロックが一つだけ。最後に$FF、ダミー(2バイト)、入り口番地(2バイト)という形の終了ブロックが続く。
WinodwsからファイルをDrag/Dropで追加する場合、先頭の文字を見て、以上の3つを判別してディスクファイルに格納しています。
例えばBASICプログラムをWindows上で作成する場合は、先頭に空行を入れておけば良いということです。また、機械語ファイルの場合はS-format形式あるいはHex-format形式にして放り込めば、機械語ファイル形式に変換されて保存されます。
終わりに
もう使わないだろうと思ってFM-7の5インチ・3.5インチディスクシステムやディスプレイ一式を処分してしまっていたのですが、63C09カードなどがあるので全てを処分するには忍びなく、本体2台とソフトだけは残しておいたのですが、これでフロッピィを使わずにDISK-BASICを使うことができるようになりました。
カードを下さった日本橋電気街徘徊日誌さんに感謝いたします。
制作したプログラム(WINDRVxxはソースとバイナリ、FBasDrvWin.exeはバイナリのみ、インストールに使用するBASICプログラム)を
OneDriveに上げておきます。
蛇足というか愚痴というか...
しかし、32Pスロット用のコネクタは入手しにくいですね。1個1,000円近く出せば入手できるようですが高すぎる。ちょっと前には秋葉原の通販で少しは安く買えたのですが、今回注文したら、何と入荷が11月半ばだそうです。(でも待つしかない、トホホ)
手持ちももう切らしているので、工作が進まない。。。
[2020年11月3日追記]
公開したFBasDrvWin.exeにバグが見つかりましたので修正版Ver1.2を
OneDriveに上げておきました。
[2021年1月13日追記]
公開したFBasDrvWin.exeにバグが見つかりましたので修正版Ver1.21を
OneDriveに上げておきました。(単純なバイナリファイルのドラッグ&ドロップ時の処理の修正)