仮想ドライブ構築ソフト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 件のコメント:
コメントを投稿