Categories: R10旧型PC

MB-6892 マーク5の拡張RAMでFLEX9を試す その5 (Disk Driver)

ベーシックマスタレベル3でFLEX9を動作させる作戦の続きです。

レベル3 の5インチ2D用FDCカードのMP-1802とMP-3560の組み合わせで使えるFLEX9用のDisk Driverを作ります。

相変わらず割込み関連でうまくいかないので、最初はシンプルに割込みを全く使わない仕様で実装しました。

参考にしたのはsni3さんのL3-FORTHのディスク関連のワードで、ブートローダも同じ仕組みでできています。

一応動作OKっぽい DiskDriverはこんな感じ。

1                       # ;*********************************************************
2                       # ;* HITACHI BASIC MASTER LEVEL 3                          *
3                       # ;* FLEX9 Disk Driver (MP-1802) for AS63_DOS              *
5                       # ;* BaseSoft TSC 6809 FLEX Adaptation Guide               *
6                       # ;* old68fun 6809SBC DiskDriver / SNI3 L3-FORTH Disk WORD *                                     *
8                       # ;* 6809の考え方                                          *
10                      # ;*********************************************************
11   0000
12                      # ;目標
13                      # ;マーク5のMP-1802でMP-3560を操作できるディスクドライバ
14   0000
15                      # ;作業メモ
16                      # ;v0.03 WRITEサブルーチン追加
17   0000
18   00FE               HOMECMD         EQU             $FE             ;リストアコマンド($01)の反転=$FE
19   00EE               SEEKCMD         EQU             $EE             ;シークコマンド($11)の反転=$EE
20   007F               READCMD         EQU             $7F             ;リードコマンド($80)の反転=$7F
21   005F               WRITECMD        EQU             $5F             ;ライトコマンド($A0)の反転=$5F
22   0000
23                      # ;L3/S1用 イクオータ
24   FF00               CMDREG          EQU             $FF00           ;コマンドレジスタ(FDC)
25   FF00               STSREG          EQU             CMDREG          ;ステータスレジスタ(FDC)
26   FF01               TRKREG          EQU             CMDREG+1        ;トラックレジスタ(FDC)
27   FF02               SCTREG          EQU             CMDREG+2        ;セクタレジスタ(FDC)
28   FF03               DATAREG         EQU             CMDREG+3        ;データレジスタ(FDC)
29   FF04               UNITREG         EQU             CMDREG+4        ;ユニットレジスタ(L3/S1)
30   0000
31   0000
32   DE00                               ORG             $DE00
33                      #; DISK FUNCTION テーブル
34   DE00               DSKTBL          EQU             *
35   DE00 7E   DE25                     JMP             READ
36   DE03 7E   DE5D                     JMP             WRITE
37   DE06 7E   DE9E                     JMP             VERIFY
38   DE09 7E   DEA4                     JMP             RESTORE
39   DE0C 7E   DEB5                     JMP             DRIVE
40   DE0F 7E   DEC9                     JMP             CHKRDY
41   DE12 7E   DEC9                     JMP             CHKRDY          ;QUICKはCHKRDY
42   DE15 7E   DEEC                     JMP             INIT
43   DE18 7E   DEF8                     JMP             WARM
44   DE1B 7E   DEF9                     JMP             SEEK
45   DE1E
46                      #; 変数領域
47   DE1E 00 FF 00      VER             FCB             $00,$FF,$00
48   DE21 00            DRVNO           FCB             $00             ;ドライブNo
49   DE22 00            TRKNO           FCB             $00
50   DE23 00            SCTNO           FCB             $00
51   DE24 00            STATUS          FCB             $00             ;FDC STATUS RESULT
52   DE25
53   DE25
54                      #; -----[ READ 1セクタのリード ] ----------------------------------------------
55                      #* ENTRY A=TRK, B=SCT, X=SCTBUFADR
56                      #* (B)= error condition
57                      #* (Z)= 1 if no error
58                      #*    = 0 if an error
59                      #; ※残件→エラー処理
60   DE25               READ            EQU             *
61   DE25 FD   DE22                     STD             TRKNO           ;AccA=TRK, AccB=SCT
62   DE28 17   00DF                     LBSR            UNITSEL         ;UNITSELセット
63   DE2B
64   DE2B FC   DE22                     LDD             TRKNO
65   DE2E 17   00C8                     LBSR            SEEK            ;シーク実行
66   DE31
67   DE31 B6   DE23                     LDA             SCTNO           ;AccA=TRK, AccB=SCT
68   DE34 43                            COMA
69   DE35 B7   FF02                     STA             SCTREG          ;Sctセット
70   DE38 86   7F                       LDA             #READCMD
71   DE3A B7   FF00                     STA             CMDREG          ;リード実行
72   DE3D 17   00E9                     LBSR            DELAY28         ;遅延
73   DE40 1A   50                       ORCC            #$50            ;割込禁止
74   DE42 B6   FF03                     LDA             DATAREG         ;空読み?→フラグリセット?
75   DE45 B6   FF00     READ2           LDA             STSREG
76   DE48 43                            COMA
77   DE49 44                            LSRA                            ;Busyチェック
78   DE4A 24   0B                       BCC             READ3           ;Busyがクリアなら終了
79   DE4C 44                            LSRA
80   DE4D 24   F6                       BCC             READ2           ;DRQオンならデータ未転送で転送待ち
81   DE4F B6   FF03                     LDA             DATAREG         ;DRQクリアならデータ転送済みでFDリード
82   DE52 43                            COMA
83   DE53 A7   80                       STA             ,X+
84   DE55 20   EE                       BRA             READ2
85   DE57               READ3
86                      #;                ANDCC           #$AF            ;割込み許可
87   DE57 5F                            CLRB                            ;エラーコード無し
88   DE58 1A   04                       ORCC            #$04            ;Z=1
89   DE5A 1C   FE                       ANDCC           #$FE            ;C=0
90   DE5C 39                            RTS
91   DE5D
92   DE5D
93                      #; -----[ WRITE 1セクタのライト ] ---------------------------------------------
94                      #* ENTRY A=TRK, B=SCT, X=SCTBUFADR
95                      #* (B)= error condition
96                      #* (Z)= 1 if no error
97                      #*    = 0 if an error
98                      #; ※残件→エラー処理
99   DE5D               WRITE           EQU             *
100  DE5D FD   DE22                     STD             TRKNO           ;AccA=TRK, AccB=SCT
101  DE60 17   00A7                     LBSR            UNITSEL         ;UNITSELセット
102  DE63
103  DE63 FC   DE22                     LDD             TRKNO
104  DE66 17   0090                     LBSR            SEEK            ;シーク実行
105  DE69
106  DE69 1A   50                       ORCC            #$50            ;割込禁止
107  DE6B B6   DE23                     LDA             SCTNO
108  DE6E 43                            COMA
109  DE6F B7   FF02                     STA             SCTREG          ;セクターセット
110  DE72 86   5F                       LDA             #WRITECMD
111  DE74 B7   FF00                     STA             CMDREG          ;リード実行
112  DE77 17   00AF                     LBSR            DELAY28         ;遅延
113  DE7A B6   FF03                     LDA             DATAREG         ;空読み?→フラグリセット?
114  DE7D B6   FF00     WRITE2          LDA             STSREG
115  DE80 43                            COMA
116  DE81 1F   89                       TFR             A,B
117  DE83 44                            LSRA                            ;Busyチェック
118  DE84 24   0B                       BCC             WRITE3          ;C=0 Busyがクリアなら終了
119  DE86 44                            LSRA                            ;DRQオンならデータ未転送で転送待ち
120  DE87 24   F4                       BCC             WRITE2          ;DRQクリアならデータ転送済みでFDライト
121  DE89 A6   80                       LDA             ,X+             ;バッファからリード
122  DE8B 43                            COMA
123  DE8C B7   FF03                     STA             DATAREG         ;FDCにライト
124  DE8F 20   EC                       BRA             WRITE2
125  DE91 F6   FF00     WRITE3          LDB             STSREG
126  DE94 53                            COMB
127  DE95 F7   DE24                     STB             STATUS
128                     #;                ANDCC           #$AF            ;割込み許可
129  DE98
130  DE98 5F                            CLRB                            ;エラーコード無し
131  DE99 1A   04                       ORCC            #$04            ;Z=1
132  DE9B 1C   FE                       ANDCC           #$FE            ;C=0
133  DE9D 39                            RTS
134  DE9E
135                     #;                LDB             #$80            ;NOT READY エラーコード($80)をセット
136                     #;                ANDCC           #$FB            ;Z=0
137                     #;                RTS
138  DE9E
139  DE9E
140                     #; -----[ VERIFY ライト後のCRCチェック ] --------------------------------------
141                     #* ENTRY NO ENTRY
142                     #* (B)= error condition
143                     #* (Z)= 1 if no error
144                     #*    = 0 if an error
145  DE9E               VERIFY          EQU             *
146  DE9E 5F                            CLRB                            ;エラーコード無し
147  DE9F 1A   04                       ORCC            #$04            ;Z=1
148  DEA1 1C   FE                       ANDCC           #$FE            ;C=0
149  DEA3 39                            RTS
150  DEA4
151  DEA4
152                     #; -----[ RESTORE ヘッドのHOME ] ----------------------------------------------
153                     #* ENTRY X=FCB ADR
154                     #* (B)= error condition
155                     #* (Z)= 1 if no error
156                     #*    = 0 if an error
157  DEA4               RESTORE         EQU             *
158  DEA4 8D   0F                       BSR             DRIVE
159  DEA6 86   FE                       LDA             #HOMECMD
160  DEA8 B7   FF00                     STA             CMDREG          ;レストア実行
161  DEAB B6   FF00     RESTORE2        LDA             STSREG
162  DEAE 43                            COMA
163  DEAF 85   04                       BITA            #$04            ;0000 0100
164  DEB1 27   F8                       BEQ             RESTORE2        ;TRACK00完了待ち
165  DEB3 20   66                       BRA             COMPWAIT        ;FDCコマンド完了待ちへ
166  DEB5
167  DEB5
168                     #; -----[ DRIVE ドライブ番号指定の処理 ] ------------------------------------------
169                     #* ENTRY X=FCB ADR
170                     #* (B)= $0F non-existent drive
171                     #*    = error condition otherwise
172                     #* (Z)= 1 if no error / 0 if an error
173                     #* (C)= 0 if no error / 1 if an error
174  DEB5               DRIVE           EQU             *
175  DEB5 A6   03                       LDA             3,X             ;FCBからドライブ番号を取得
176  DEB7 81   03                       CMPA            #3
177  DEB9 23   05                       BLS             DRIVE2
178  DEBB C6   0F                       LDB             #$0F            ;ドライブ無しエラー($0F)をセット
179  DEBD 1A   01                       ORCC            #$01            ;エラー有りで戻る
180  DEBF 39                            RTS
181  DEC0
182  DEC0 B7   DE21     DRIVE2          STA             DRVNO           ;エラー無しの場合DRVNoをセット
183  DEC3 5F                            CLRB                            ;エラーコード無し
184  DEC4 1A   04                       ORCC            #$04            ;Z=1
185  DEC6 1C   FE                       ANDCC           #$FE            ;C=0
186  DEC8 39                            RTS
187  DEC9
188  DEC9
189                     #; -----[ CHKRDY ドライブ準備完了待ち ] ---------------------------------------
190                     * ENTRY X=FCB ADR
191                     * (B)= error condition
192                     * (Z)= 1 if no error / 0 if an error
193                     * (C)= 0 if no error / 1 if an error
194  DEC9               CHKRDY          EQU             *
195  DEC9 A6   03                       LDA             3,X
196  DECB 81   03                       CMPA            #3
197  DECD 23   07                       BLS             CHKRDY2
198  DECF C6   80                       LDB             #$80            ;NOT READY エラーコード($80)をセット
199  DED1 1A   01                       ORCC            #$01            ;C=1
200  DED3 1C   FB                       ANDCC           #$FB            ;Z=0
201  DED5 39                            RTS
202  DED6
203  DED6 B6   FF00     CHKRDY2         LDA             STSREG
204  DED9 43                            COMA
205  DEDA 85   80                       BITA            #$80            ;Bit7=NotReady
206  DEDC 27   07                       BEQ             CHKRDY3         ;準備OKへ
207  DEDE C6   80                       LDB             #$80            ;NOT READY エラーコード($80)をセット
208  DEE0 1A   01                       ORCC            #$01            ;C=1
209  DEE2 1C   FB                       ANDCC           #$FB            ;Z=0
210  DEE4 39                            RTS
211  DEE5
212  DEE5 5F            CHKRDY3         CLRB                            ;エラーコード無し
213  DEE6 1A   04                       ORCC            #$04            ;Z=1
214  DEE8 1C   FE                       ANDCC           #$FE            ;C=0
215  DEEA 39                            RTS
216  DEEB
217  DEEB
218                     #; -----[ QUICK NOT READYフラグを調べる ] -------------------------------------
219                     #; QUICKは未使用→CHKRDYを流用( 6809の考え方 P.161)
220                     #; 5インチドライブのようにMOTOR ON/OFFするデッキはモータ起動からの安定時間を
221                     #; 待ってREADYになるのでCHKRDYと同じ条件でチェックしないといけない
222  DEEB               QUICK           EQU             *
223  DEEB 39                            RTS
224  DEEC
225  DEEC
226                     #; -----[ INIT FDC/FDDの初期化 ] ----------------------------------------------
227  DEEC               INIT            EQU             *
228  DEEC 8E   DE21                     LDX             #DRVNO
229  DEEF C6   03                       LDB             #3
230  DEF1 4F                            CLRA
231  DEF2 A7   80       INIT2           STA             ,X+
232  DEF4 5A                            DECB
233  DEF5 26   FB                       BNE             INIT2           ;変数の初期化
234  DEF7 39                            RTS
235  DEF8
236  DEF8
237                     #; -----[ WARM WARMスタート時の初期化 ] ---------------------------------------
238  DEF8               WARM            EQU             *
239  DEF8 39                            RTS
240  DEF9
241  DEF9
242                     #; -----[ SEEK ヘッドのシーク ] ------------------------------------------------
243                     * ENTRY A=TRK, B=SCT
244                     * (B)= error condition
245                     * (Z)= 1 no error / 0 an error
246  DEF9               SEEK            EQU             *
247  DEF9 F7   DE23                     STB             SCTNO
248  DEFC B7   DE22                     STA             TRKNO
249  DEFF 43                            COMA
250  DF00 B7   FF03                     STA             DATAREG         ;Trkセット
251  DF03 86   EE                       LDA             #SEEKCMD
252  DF05 B7   FF00                     STA             CMDREG          ;シーク実行
253  DF08 20   11                       BRA             COMPWAIT        ;FDCコマンド完了待ちへ
254  DF0A
255  DF0A
256                     #; -----[ UNITSELレジスタセット ] -----------------------------------------
257                     #; ※残件→ドライブNo代入
258  DF0A               UNITSEL         EQU             *
259                     #;              LDB             DRVNO
260  DF0A B6   DE23                     LDA             SCTNO
261  DF0D 81   10                       CMPA            #16
262  DF0F 22   04                       BHI             UNIT3
263                     #;UNIT2           LDB             #$28            ;0010 1000
264  DF11 C6   29       UNIT2           LDB             #$29            ;0010 1001
265  DF13 20   02                       BRA             UNIT4
266                     #;UNIT3           LDB             #$38            ;0011 1000
267  DF15 C6   39       UNIT3           LDB             #$39            ;0011 1001
268  DF17 F7   FF04     UNIT4           STB             UNITREG
269  DF1A 39                            RTS
270  DF1B
271  DF1B
272                     #; -----[ FDCコマンド完了待ち ]--
273  DF1B B6   FF00     COMPWAIT        LDA             STSREG
274  DF1E 43                            COMA
275  DF1F 85   81                       BITA            #$81            ;1000 0001 Bit7=NotReady, Bit0=Busy
276  DF21 26   F8                       BNE             COMPWAIT        ;コマンド完了待ち
277  DF23 5F                            CLRB                            ;エラーコード無し
278  DF24 1A   04                       ORCC            #$04            ;Z=1
279  DF26 1C   FE                       ANDCC           #$FE            ;C=0
280  DF28 39                            RTS
281  DF29
282  DF29
283                     #; -----[ 遅延 ]-----------
284  DF29 17   0000     DELAY28         LBSR            DELAY14
285  DF2C 17   0000     DELAY14         LBSR            DELAY
286  DF2F 39            DELAY           RTS
287  DF30
288  DF30
289  DE00                               END
    Total Errors 0


FLEX.CORのディスクをドライブ0に入れてメモリにロードしているのでFLEXのディスクはドライブ1で実験中です。

UNITSELサブルーチンは現状ドライブ1固定なので、将来的に全て完成したら手直しが必要です。
最終的には解決しないといけないのですが、とりあえずは割込みを気にせずディスク入出力の操作ができるのは便利です^^;;;

エミュ上だけで確認し、実機では試していませんがMP-3560に対してDRVCHK,HOME,SEEK,1セクタREAD/WRITEはできているようです。

そんなMP-1802+MP3560用のFLEX9 Disk Driver 作成の記録・・・

ベーシックマスタの情報をお探しの方は是非こちらからどうぞ → Amazon

kabekin