2020年5月2日土曜日

CP/M用の仮想ドライブの構築ソフト(その2)

仮想ドライブ構築ソフトCpmDrvWin.exeをCP/Mに接続してみました。


前回報告したCpmDrvWin.exeをCP/Mに接続してみました。
書き直したのは、CP/MのBIOSの6809側のルーチンのみで、DrvNoが0(A:),1(B:)の時は従来のFDDアクセスルーチンのままで、2(C:),3(D:)の場合にはRS232Cを通してCpmDrvWinと通信して仮想ドライブ中のファイルを読み書きします。

具体的には、ファイルを読む場合にはCpmDrvWinに対して’R',DrvNo,TrkNo,SctNo(+チェックサム)という文字列を、書き込む場合には’W',DrvNo,TrkNo,SctNo(+チェックサム)という文字列を送って、その結果を受け取るだけです。



ディレクトリを表示

ドライブA:はフロッピーディスクで、ドライブC:とD:が仮想ドライブです。
まだテスト中ですので、BaudRateを4800baudと遅くしてありますが、完成時には38400baudになります。


ドライブC:のディレクトリ表示時

右のテキストボックスは受信したコマンド列を表示しています。
Trk2,Sct1から始まって、各2回ずつ読んでいるのが分かりますが、これはブロッキング・デブロッキングをちゃんと行っていないためです。(何とかしなければ...)


ドライブD:のディレクトリ表示時

ディレクトリの範囲はTrk2のSct1~16なのですが、ドライブD:の場合のように、ファイル数が少なくても、その範囲のセクタを全て読んで、空を表示しています。(これはBDOSの仕様なのか、それとも自作BIOSの責任なのか...)

前回のブログで書きましたように、左のリストボックス中にWindows上のファイルをドラッグ&ドロップしてファイルを追加すれば、CP/Mからそのファイルにアクセスすることができます。

また、CP/MとWindows上のCpmDrvWinとの間の通信部分は、Flex9用、F-Basic用などと共通で、8251A使用のRS232Cカードや以前発表した拡張I/Oボード上の6850(ACIA)使用の場合の通信ルーチンが使用できますが、FM-7でも6850(ACIA)の方はあっさりと38400baudで動いています。

未だ完成ではありませんが、とりあえずこの程度でできるのだというサンプルとして、BIOSに追加した仮想ドライブアクセスルーチンを記しておきます。

*================================================
*read windows virtual drive
RDWDRV EQU *
*read 256bytes
 BSR READSUB2
 LBRA RE0

*read 256bytes
READSUB2 EQU *
RDS0 CLR CSUM
 LDA #'R
 LBSR SNDCH read cmd
 BSR ADDCS
 LDA DRVNO
 LBSR SNDCH drv
 BSR ADDCS
 LDA TRKADR
 LBSR SNDCH trk
 BSR ADDCS
 LDA SCTADR
 BSR SETSCT2
 LBSR SNDCH sct
 BSR ADDCS
 LDA CSUM
 LBSR SNDCH csum
*wait receive ACKorNAKorESC
*  if NAK then re-send 'R',Drv,Trk,Sct,csum
*  if ESC then error return
*  if ACK then next
RDS1 LBSR RCVCH
 CMPA #NAK
 BEQ RDS0
 CMPA #ESC
 BNE RDS2
 LDA #$FF *error
 RTS *error end
*
RDS2 CMPA #ACK
 BNE RDS1
* send ACK
 LBSR SNDCH ACK
*receive data(256bytes),csum
*  data is saved to Buffer(X)
*  if csum error then send NAK
*  if csum ok then send ACK and to next process
RDS3 LDX #RCBBUF
 CLRB counter(256)
 CLR CSUM
RDSLOP LBSR RCVCH data
 STA ,X+
 BSR ADDCS
 DECB
 BNE RDSLOP
 LBSR RCVCH csum
 CMPA CSUM
 BEQ RDS4
 LDA #NAK
 LBSR SNDCH NAK
 BRA RDS3
*
RDS4 LDA #ACK
 LBSR SNDCH ACK
*wait receive ACK
RDS5 LBSR RCVCH
 CMPA #ACK
 BNE RDS5
 RTS
*
*return A:sct,BUFHL:0or1
SETSCT2 EQU *
 CLR BUFHL
 LDA SCTADR ;sct
 BITA #$01
 BEQ SE21
 DECA
 INC BUFHL ;0:even, 1:odd
SE21 LSRA
 INCA
 RTS
*
*--------------------
*add check sum
ADDCS EQU *
 ADDA CSUM
 STA CSUM
 RTS
*--------------------
*write windows virtual drive
WRWDRV EQU *
*read 256bytes
 LBSR READSUB2
*set write data
 BSR WRDTSET
*write
WRW2 CLR CSUM
 LDA #'W
 BSR SNDCH write cmd
 BSR ADDCS
 LDA DRVNO
 BSR SNDCH drv
 BSR ADDCS
 LDA TRKADR
 BSR SNDCH trk
 BSR ADDCS
 LDA SCTADR
 BSR SETSCT2
 BSR SNDCH sct
 BSR ADDCS
 LDA CSUM
 BSR SNDCH csum
*wait receive ACKorNAK
*  if NAK then re-send 'W',Drv,Trk,Sct,csum
*  if ESC then error return
*  if ACK then next
WRW3 BSR RCVCH
 CMPA #NAK
 BEQ WRW2
 CMPA #ESC
 BNE WRW4
 LDA #$FF  *error
 BRA WRW7 *error end
*
WRW4 CMPA #ACK
 BNE WRW3
*send data(256bytes),csum
*data is in Buffer(X)
WRW5 LDX #RCBBUF
 CLRB counter(256)
 CLR CSUM
WRWLOP2 LDA ,X+
 BSR SNDCH data
 BSR ADDCS
 DECB
 BNE WRWLOP2
 LDA CSUM
 BSR SNDCH csum
*wait receive ACKorNAK
*  if NAK then re-send data(256bytes),csum
*  if ACK then next
WRW6 BSR RCVCH
 CMPA #NAK
 BEQ WRW5
 CMPA #ACK
 BNE WRW6
 CLRA *no error
WRW7 STA PTOZ80
 LBRA TOZ80
*
*======================================

ということで、あちこちに不備があってまだまだ修正の必要がありますが、CP/M用の仮想ドライブのプロトタイプがとりあえずできたという報告でした。

0 件のコメント:

コメントを投稿