Last Updated on 2022年1月9日 by kabekin
ベーシックマスタレベル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