2019年9月25日水曜日

FM-7/77のF-BASIC用の仮想ドライブ構築ソフトが完成

F-BASIC(V3.0)のドライブ2,3として仮想ドライブを構築するソフトが完成


[2020年11月3日]仮想ドライブ構築ソフトのバグ修正版Ver1.2に関して追記しました

[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に上げておきました。(単純なバイナリファイルのドラッグ&ドロップ時の処理の修正)

4 件のコメント:

  1. すばらしい!感動しました。

    返信削除
    返信
    1. mskz440さま コメントありがとうございます。
      ファイルをWindowsとの間で自由にやり取りしたくて作成したもので、一応目的は達成できましたが、セクタ単位の読み書きしかサポートしていないので、トラック単位で読み書きしているようなF-BASIC付属のソフトは残念ながら動作しません。
      当面はこの状態で使うつもりですが、そのうち改良できればと思っています。

      削除
  2. 最近FM-7系を触り始めたのですが、こんな事が出来るんですね!面白いです!!

    返信削除
  3. charcreonさま コメントありがとうございます。留守にしておりまして返事が遅れてしまいました。
    私はFM-7本体でプログラムを作成することはほとんどなく、Windows上でプログラムを作成し、FBasDrvWin.exeのドライブ3にセットした.77ファイルにドラッグ&ドロップして、それをF-BASICからドライブ3中のファイルとして読み込んで実行しています。
    面倒なようですが慣れるとそれ程でもなく、作成したファイルをWindows上に保存しておけるので安心です。使ってみていただけると嬉しいです。

    返信削除