ベーシックマスタレベル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