Last Updated on 2022年2月8日 by kabekin
ベーシックマスタレベル3でFLEX9を動作させる作戦の続きです。
こちら でなんとか動作しているFLEX9のMP-1820用ディスクドライバですが、同一トラックでもSEEKしてしまう。
簡易的なドライバなので、割込みを使用した完全版のドライバに整理しております。
一通り整理して安定して動作しているのですが、なぜかカレントドライブ0からDSP,1やCAT,1やFILES,1でドライブ1のファイルリストが表示できません (DELETE 1.FLEX.SYS等もダメ)
しかし、COPY,FLEX.SYS,1でドライブ1にコピーは可能なので原因の特定が難しいです・・・
ドライバ作成の際にFLEXのシステム込みでトレースするのは大変でしたが、FLEX9のアダプテーションガイドのAPPENDIX-Aに掲載されている1セクタの読書きテストユーティリティを使うとシンプルにデバッグできました。
こちらのテストユーティリティですが、FLEX.CORは不要なようでConsole I/Oドライバとディスクドライバのみメモリにロードすれば動作するようです。
64KB拡張メモリに切り替えてコンソールI/Oドライバとディスクドライバをメモリにロードします
Console I/OドライバのINITは実行しないので割込ベクタは手動で設定しておきました
E FFE8 78 M DN CONSOLE.MOT DPL 1 0 DN DRIVER.MOT DPL 1 0 D D370 D DE00 E FFF8 D3 70 E FFF6 D3 70 E FFFC D3 70 D FFF0
アダプテーションガイドの51ページからのAPPENDIX-AをアセンブルしてMOT形式に変換しメモリにロードし、Tで数ステップ確認してからGで実行
DN TEST_UTILITY_LD.MOT DPL 1 0 D 0100 R PC 0100 T T G
テストユーティリティが起動しましたしたので使い方をメモ・・・
F? に R か W で 1セクタの読書きテストができるそうです Rを指定し D?にドライブ番号1桁、T?にトラック番号2桁、 S?にセクタ番号2桁を入力して実行 ドライブ0, 1両方OKなので DRIVEサブルーチンもOKっぽいです
F?R D?0 T?12 S?03 12 04 00 0D 76 8E 25 D9 33 01 C6 02 34 02 A6 E4 34 04 5F 80 0A 25 03 5C 20 F9 8B 3A E7 61 35 04 A7 C5 5A 2A E9 35 02 C6 03 E7 84 A6 01 81 30 26 07 5A 27 04 30 01 20 F1 16 FD 4D 34 02 44 44 44 44 8D 04 02 28 F7 FF 35 02 84 0F 81 0A 25 02 8B 07 8B 30 16 FD 20 34 76 CE 25 D9 34 06 86 05 A7 C0 4A 34 02 EC 61 8E 00 00 83 00 0A 25 04 30 01 20 F7 AF 61 CB 3A 35 02 E7 C6 4A 2A E5 35 06 8E 25 D9 16 FD 07 16 FD 02 B6 78 01 10 26 00 E4 8E 22 88 8D F1 8E 22 98 8D EC B6 78 12 F6 78 0C 8D B5 10 83 00 00 27 2F 17 FC D9 8E 22 AC 8D D6 B6 78 0A 17 FF 1F B6 78 0B 4D 34 01 84 7F 17 FF 2E 86 2E 17 FC B1 B6 78 0D 17 FF 74 8E 22 C1 35 01 2B 02 30 0A 8D AF B6 78 0E 27 0E 17 FC A5 8E 22 D4 8D A2 1F 89 4F 17 FF 6D 7D 78 08 27 0E 17 FC 92 8E 22 F3 8D 8F B6 78 09 17 FE FC B6 78 07 81
F?R D?1 T?12 S?13 12 04 00 0D 76 8E 25 D9 33 01 C6 02 34 02 A6 E4 34 04 5F 80 0A 25 03 5C 20 F9 8B 3A E7 61 35 04 A7 C5 5A 2A E9 35 02 C6 03 E7 84 A6 01 81 30 26 07 5A 27 04 30 01 20 F1 16 FD 4D 34 02 44 44 44 44 8D 04 02 28 F7 FF 35 02 84 0F 81 0A 25 02 8B 07 8B 30 16 FD 20 34 76 CE 25 D9 34 06 86 05 A7 C0 4A 34 02 EC 61 8E 00 00 83 00 0A 25 04 30 01 20 F7 AF 61 CB 3A 35 02 E7 C6 4A 2A E5 35 06 8E 25 D9 16 FD 07 16 FD 02 B6 78 01 10 26 00 E4 8E 22 88 8D F1 8E 22 98 8D EC B6 78 12 F6 78 0C 8D B5 10 83 00 00 27 2F 17 FC D9 8E 22 AC 8D D6 B6 78 0A 17 FF 1F B6 78 0B 4D 34 01 84 7F 17 FF 2E 86 2E 17 FC B1 B6 78 0D 17 FF 74 8E 22 C1 35 01 2B 02 30 0A 8D AF B6 78 0E 27 0E 17 FC A5 8E 22 D4 8D A2 1F 89 4F 17 FF 6D 7D 78 08 27 0E 17 FC 92 8E 22 F3 8D 8F B6 78 09 17 FE FC B6 78 07 81
書込みのテストをしてみても、目的の動作をしており問題ありません・・・
ドライブ0 トラック0 セクター1に記録されているブートローダをセクタをドライブ1のトラック0 セクタ5 のディレクトリデータで上書きし、内容を確認していますが正常に読書できています
F?R D?0 T?00 S?01 20 0A 00 00 00 06 07 00 03 00 00 00 10 CE C0 7F FC 03 05 FD C3 00 10 8E C4 00 8D 35 81 02 27 10 81 16 26 F6 8D 2B B7 03 08 8D 26 B7 03 09 20 EA 8D 1F B7 03 0A 8D 1A B7 03 0B 8D 15 1F 89 4D 27 D9 BE 03 0A 34 14 8D 09 35 14 A7 80 5A 26 F5 20 C9 10 8C C4 00 26 0F 8E C3 00 EC 84 27 0B 8D 0D 26 9E 10 8E C3 04 A6 A0 39 6E 9F 03 08 8D 2D 8E C3 00 86 8C 1A 50 B7 FD 18 8D 43 C6 C0 F5 FD 1F 27 FB B6 FD 1B A7 80 F5 FD 1F 27 F1 1C AF F6 FD 18 C5 1C 39 F6 FD 18 C5 01 26 F9 39 F7 FD 1A 7F FD 1C C1 10 23 05 C6 FF F7 FD 1C B1 FD 19 27 0E B7 FD 1B 8D 09 86 1B B7 FD 18 8D 02 8D D6 17 00 00 17 00 00 39 08 17 00 D3 25 0A A7 A0 5A 26 F6 17 00 C9 24 15 81 2E 26 15 31 48 C6 03 17 00 BC 25 0C A7 A0 5A 26 F6 17 00 B2 10 24 01 3F BE CC 14 AF 4F 17 FF A7 1C FB 39 8E C8 40 A7 84 7E D4
F?R D?1 T?00 S?05 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 46 4C 45 58 00 00 00 00 43 4F 52 00 00 01 01 01 16 00 16 00 00 06 0D 53 45 52 52 4F 52 53 00 00 53 59 53 00 00 01 17 01 1F 00 09 02 00 06 0D 53 43 41 54 00 00 00 00 00 43 4D 44 00 00 01 20 02 02 00 03 00 00 06 0D 53 43 4F 50 59 00 00 00 00 43 4D 44 00 00 02 03 02 07 00 05 00 00 06 0D 53 4C 49 53 54 00 00 00 00 43 4D 44 00 00 02 08 02 0A 00 03 00 00 06 0D 53 41 53 4E 00 00 00 00 00 43 4D 44 00 00 02 0B 02 0B 00 01 00 00 06 0D 53 44 45 4C 45 54 45 00 00 43 4D 44 00 00 02 0C 02 0D 00 02 00 00 06 0D 53 52 45 4E 41 4D 45 00 00 43 4D 44 00 00 02 0E 02 0E 00 01 00 00 06 0D 53 54 54 59 53 45 54 00 00 43 4D 44 00 00 02 0F 02 10 00 02 00 00 06 0D 53 50 00 00 00 00 00 00 00 43 4D 44 00 00 02 11 02 11 00 01 00 00 06 0D 53
F?W D?0 T?00 S?01 OK
F?R D?0 T?00 S?01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 46 4C 45 58 00 00 00 00 43 4F 52 00 00 01 01 01 16 00 16 00 00 06 0D 53 45 52 52 4F 52 53 00 00 53 59 53 00 00 01 17 01 1F 00 09 02 00 06 0D 53 43 41 54 00 00 00 00 00 43 4D 44 00 00 01 20 02 02 00 03 00 00 06 0D 53 43 4F 50 59 00 00 00 00 43 4D 44 00 00 02 03 02 07 00 05 00 00 06 0D 53 4C 49 53 54 00 00 00 00 43 4D 44 00 00 02 08 02 0A 00 03 00 00 06 0D 53 41 53 4E 00 00 00 00 00 43 4D 44 00 00 02 0B 02 0B 00 01 00 00 06 0D 53 44 45 4C 45 54 45 00 00 43 4D 44 00 00 02 0C 02 0D 00 02 00 00 06 0D 53 52 45 4E 41 4D 45 00 00 43 4D 44 00 00 02 0E 02 0E 00 01 00 00 06 0D 53 54 54 59 53 45 54 00 00 43 4D 44 00 00 02 0F 02 10 00 02 00 00 06 0D 53 50 00 00 00 00 00 00 00 43 4D 44 00 00 02 11 02 11 00 01 00 00 06 0D 53 F?
テストユーティリティでは目的の動作もしており、トレース実行してもOKっぽいので今のところバグを発見できず・・・
これまでは、FLEX9を動かした状態でディスクドライバのデバッグをしていましたがFLEX.COR内に入るとトレースが難しいので、このテストユーティリティは便利かも^^;;
あと、もう一息っぽいのですうまくいきませんね
使い方の間違っている部分にお気づきの方、怪しい部分がありましたら教えてください^^;;;
現在のディスクドライバはこんな感じです。
(READ/WRITEルーチンはsamさん作のS1-CP/M80のルーチンとほぼ同様です)
1 # ;********************************************************* 2 # ;* HITACHI BASIC MASTER LEVEL 3 MARK5 * 3 # ;* FLEX9 Disk Driver (MP-1820) for AS63_DOS * 4 # ;* NMI割込版 Ver0.7.16 * 5 # ;* BaseSoft TSC 6809 FLEX Adaptation Guide * 6 # ;* SAM S1-CPM80 DiskDriver / Old68fun 6809SBC DiskDriver * 7 # ;* SNI3 L3-FORTH Disk WORD / 6809の考え方 * 8 # ;********************************************************* 9 0000 10 # ;目標 11 # ;マーク5のMP-1820でMP-3560を操作できるディスクドライバ 12 # ;FDCの完了通知はNMI割込で行う 13 0000 14 00FE HOMECMD EQU $FE ;リストアコマンド($01)の反転=$FE 15 00EE SEEKCMD EQU $EE ;シークコマンド($11)の反転=$EE 16 007F READCMD EQU $7F ;リードコマンド($80)の反転=$7F 17 005F WRITECMD EQU $5F ;ライトコマンド($A0)の反転=$5F 18 002F FORCECMD EQU $2F ;フォースコマンド($D0)の反転=$2F 19 0000 20 0000 21 # ;L3/S1用 イクオータ 22 FF00 CMDREG EQU $FF00 ;コマンドレジスタ(FDC) 23 FF00 STSREG EQU CMDREG ;ステータスレジスタ(FDC) 24 FF01 TRKREG EQU CMDREG+1 ;トラックレジスタ(FDC) 25 FF02 SCTREG EQU CMDREG+2 ;セクタレジスタ(FDC) 26 FF03 DATAREG EQU CMDREG+3 ;データレジスタ(FDC) 27 FF04 UNITREG EQU CMDREG+4 ;ユニットレジスタ(L3/S1) 28 0000 29 FFFC VNMI EQU $FFFC ;NMIベクタ 30 0003 MAXDRVNO EQU 03 ;最大ドライブ番号 31 0000 32 0000 33 DE00 ORG $DE00 34 DE00 35 #; DISK FUNCTION テーブル 36 DE00 DSKTBL EQU * 37 DE00 7E DF50 JMP READ 38 DE03 7E DF59 JMP WRITE 39 DE06 7E DF64 JMP VERIFY 40 DE09 7E DF66 JMP HOME 41 DE0C 7E DF68 JMP DRIVE 42 DE0F 7E DF7C JMP CHKRDY 43 DE12 7E DF7C JMP CHKRDY ;QUICKはCHKRDY 44 DE15 7E DF9B JMP INIT 45 DE18 7E DFAE JMP WARM 46 DE1B 7E DFAF JMP SEEK 47 DE1E 48 #; 変数領域 49 DE1E 07 FF VER FCB $07,$FF ;Ver No 50 DE20 00 XDRVNO FCB $00 ;ドライブNo 51 DE21 00 XTRKNO FCB $00 ;トラックNo 52 DE22 00 XSCTNO FCB $00 ;セクタNo 53 DE23 00 XUNITSEL FCB $00 ;UNITSELの値 54 DE24 00 XWKSCTNO FCB $00 ;FDC.SCTREGに設定する値 55 DE25 00 XRWFLAG FCB $00 ;FDRW Subの機能 0=READ, 1=WRITE 56 DE26 FF XLASTDRV FCB $FF ;最終DRVNo 57 DE27 FF XLASTTRKNO FCB $FF ;ドライブ0の最終TRKNo 58 DE28 FF FCB $FF ;ドライブ1の最終TRKNo 59 DE29 FF FCB $FF ;ドライブ2の最終TRKNo 60 DE2A FF FCB $FF ;ドライブ3の最終TRKNo 61 DE2B 0000 NMIVEC FDB $0000 ;NMIベクタの保存用 62 DE2D 63 DE2D 64 DE2D 65 #; -----[ FDRW 1セクタの読書き ] ---------------------------------------------- 66 #* ENTRY A=TRK, B=SCT, X=SCTBUFADR 67 #* (B)= error condition 68 #* (Z)= 1 if no error / 0 if an error 69 DE2D FDRW EQU * 70 DE2D 34 70 PSHS X,Y,U 71 DE2F 17 0185 LBSR GETUNITSEL ;UNITSEL値を取得 72 DE32 17 01BB LBSR SWAPNMIVEC ;NMIベクタを保存 73 DE35 74 DE35 B6 DE26 LDA XLASTDRV 75 DE38 81 FF CMPA #$FF 76 DE3A 27 08 BEQ FORCEINT_0 ;初回のアクセスならFDCを初期化 77 DE3C 78 DE3C B6 FF00 CHKFDC LDA STSREG 79 DE3F 43 COMA 80 DE40 84 01 ANDA #$01 ;b0=Busy 81 DE42 26 F8 BNE CHKFDC ;b0がクリアされるまで待つ 82 DE44 83 DE44 B6 DE23 FORCEINT_0 LDA XUNITSEL ;FDCへの最初のアクセス 84 DE47 B7 FF04 STA UNITREG 85 DE4A BD DFCF JSR BUSYLOOP 86 DE4D 87 DE4D 86 2F FORCEINT LDA #FORCECMD 88 DE4F B7 FF00 STA CMDREG 89 DE52 17 0185 LBSR WAIT4RDY 90 DE55 81 00 CMPA #0 91 DE57 26 F4 BNE FORCEINT 92 DE59 93 DE59 F6 DE20 FDRW2 LDB XDRVNO ;I/Oループの入り口 94 DE5C CE DE27 LDU #XLASTTRKNO 95 DE5F E6 C5 LDB B,U 96 DE61 C1 FF CMPB #$FF 97 DE63 26 2B BNE CHKSEEK ;最初のアクセスはRESTOREする 98 DE65 99 DE65 17 0172 RESTORE LBSR WAIT4RDY 100 DE68 81 00 CMPA #0 101 DE6A 26 E1 BNE FORCEINT ;準備NGならFORCEINT 102 DE6C CE DE7B LDU #ISR_RESTORE ; 103 DE6F FF FFFC STU VNMI ;NMIベクタをRESTORE完了処理に差替え 104 DE72 1A 50 ORCC #$50 ;IRQ,FIRQ禁止 105 DE74 86 FE LDA #HOMECMD 106 DE76 B7 FF00 STA CMDREG ;RESTORE実行 107 DE79 20 FE RESTORE_LP BRA RESTORE_LP 108 DE7B 109 DE7B 32 6C ISR_RESTORE LEAS 12,S ;NMI割込のスタックを戻す 110 DE7D 1C AF ANDCC #$AF ;IRQ,FIRQ割込許可 111 DE7F 17 0158 LBSR WAIT4RDY 112 DE82 81 00 CMPA #0 113 DE84 1026 FFC5 LBNE FORCEINT ;RESTORE失敗はFORCEINTに戻って再試行 114 DE88 CE DE27 LDU #XLASTTRKNO 115 DE8B F6 DE20 LDB XDRVNO 116 DE8E 6F C5 CLR B,U ;XLASTTRKNOを0に戻す 117 DE90 118 DE90 CE DE27 CHKSEEK LDU #XLASTTRKNO 119 DE93 F6 DE20 LDB XDRVNO 120 DE96 A6 C5 LDA B,U ;最終TRK取得 121 DE98 B1 DE21 CMPA XTRKNO 122 DE9B 27 37 BEQ FDC_SEC2 ;同一TRKはSEEK不要でジャンプ 123 DE9D 124 DE9D 17 013A FDC_SEEK LBSR WAIT4RDY 125 DEA0 81 00 CMPA #0 126 DEA2 1026 FFA7 LBNE FORCEINT 127 DEA6 128 DEA6 CE DED0 LDU #ISR_SEEK 129 DEA9 FF FFFC STU VNMI ;NMIベクタをSEEK完了処理に差替え 130 DEAC 1A 50 ORCC #$50 ;IRQ,FIRQ禁止 131 DEAE 132 DEAE CE DE27 LDU #XLASTTRKNO 133 DEB1 F6 DE20 LDB XDRVNO 134 DEB4 E6 C5 LDB B,U 135 DEB6 53 COMB 136 DEB7 F7 FF01 STB TRKREG ;最終TRKをTRKREGにセット 137 DEBA 138 DEBA B6 DE21 LDA XTRKNO 139 DEBD CE DE27 LDU #XLASTTRKNO 140 DEC0 F6 DE20 LDB XDRVNO 141 DEC3 A7 C5 STA B,U ;最終TRKNoを更新 142 DEC5 43 COMA 143 DEC6 B7 FF03 STA DATAREG ;DATAREGにTRKNOをセット 144 DEC9 145 DEC9 C6 EE LDB #SEEKCMD 146 DECB F7 FF00 STB CMDREG 147 DECE 20 FE FDC_SEEK_LP BRA FDC_SEEK_LP 148 DED0 149 DED0 32 6C ISR_SEEK LEAS 12,S 150 DED2 1C AF ANDCC #$AF 151 DED4 152 DED4 17 0103 FDC_SEC2 LBSR WAIT4RDY 153 DED7 81 00 CMPA #0 154 DED9 1026 FF88 LBNE RESTORE 155 DEDD F6 DE24 LDB XWKSCTNO 156 DEE0 53 COMB 157 DEE1 F7 FF02 STB SCTREG ;SCTREGを設定 158 DEE4 159 DEE4 CE DF1C FDRW3 LDU #ISR_FDRW 160 DEE7 FF FFFC STU VNMI ;NMIベクタをIOSCT完了処理に差替え 161 DEEA 162 DEEA F6 FF00 LDB STSREG ;FDC割込解除 163 DEED 1A 50 ORCC #$50 ;IRQ,FIRQの割込禁止(NMIのみ受ける) 164 DEEF 165 DEEF B6 DE25 LDA XRWFLAG 166 DEF2 26 04 BNE FDRW_WR 167 DEF4 C6 7F LDB #READCMD 168 DEF6 20 02 BRA FDRW_RD 169 DEF8 170 DEF8 C6 5F FDRW_WR LDB #WRITECMD 171 DEFA 172 DEFA F7 FF00 FDRW_RD STB CMDREG ;読書き実行 173 DEFD 174 DEFD B6 DE25 LDA XRWFLAG 175 DF00 26 0D BNE MEM2FDC 176 DF02 177 DF02 B6 FF04 FDC2MEM LDA UNITREG ;FDC->MEM 178 DF05 2B FB BMI FDC2MEM ;DRQ待ち 179 DF07 F6 FF03 LDB DATAREG ;FDC->データ受取り 180 DF0A 53 COMB 181 DF0B E7 80 STB ,X+ ;メモリに書込み 182 DF0D 20 F3 BRA FDC2MEM ;NMI割込まで繰返し 183 DF0F 184 DF0F B6 FF04 MEM2FDC LDA UNITREG ;MEM->FDC 185 DF12 2B FB BMI MEM2FDC ;DRQ待ち 186 DF14 E6 80 LDB ,X+ ;MEM->データ受け取り 187 DF16 53 COMB 188 DF17 F7 FF03 STB DATAREG ;FDCに書込み 189 DF1A 20 F3 BRA MEM2FDC ;NMI割込まで繰返し 190 DF1C 191 DF1C 32 6C ISR_FDRW LEAS 12,S 192 DF1E 1C AF ANDCC #$AF ;IRQ,FIRQ許可 193 DF20 194 DF20 F6 FF00 LDB STSREG ;FDCのリザルトをAccBへ代入 195 DF23 43 COMA 196 DF24 84 9C ANDA #$9C ;b7,b6,b4,b3,b2をチェック 197 DF26 27 03 BEQ FDRW_OK 198 DF28 4F CLRA 199 DF29 200 DF29 20 0A FDRW_NG BRA FINIO 201 DF2B 202 DF2B B6 DE20 FDRW_OK LDA XDRVNO 203 DF2E B7 DE26 STA XLASTDRV ;最終アクセスドライブ更新 204 DF31 86 01 LDA #1 205 DF33 20 00 BRA FINIO 206 DF35 207 DF35 208 DF35 209 #; -----[ FINIO FDRWサブルーチンの後始末 ] ----------------------------------------------〇 210 #; ;設定やNMIベクタを元に戻し、モータを停止して呼び出し元に戻る 211 #; AccA=NO ERROR=1, ERROR=0 AccB=FDC RESULT 212 DF35 34 02 FINIO PSHS A 213 DF37 B6 DE23 LDA XUNITSEL 214 DF3A 84 F7 ANDA #$F7 ;MOTORを0にする(MOTOR OFF)=1111 0111 215 DF3C B7 DE23 STA XUNITSEL 216 DF3F 17 00AE LBSR SWAPNMIVEC ;NMIベクタを元に戻す 217 DF42 35 02 PULS A 218 DF44 27 04 BEQ FINIO_NG 219 DF46 220 DF46 35 70 FINIO_OK PULS X,Y,U 221 DF48 20 67 BRA OKRES 222 DF4A 223 DF4A 1A 01 FINIO_NG ORCC #$01 ;C=1 224 DF4C 1C FB ANDCC #$FB ;Z=0 225 DF4E 35 F0 PULS X,Y,U,PC 226 DF50 227 DF50 228 DF50 229 #; -----[ READ 1セクタのリード ] ----------------------------------------------〇 230 #* ENTRY A=TRK, B=SCT, X=SCTBUFADR 231 #* (B)= error condition 232 #* (Z)= 1 if no error / 0 if an error 233 #; 読書きの本体はFDRWサブルーチン内で行う, リトライはFLEX.CORでやっているらしい, 234 #; エラーコードはFDCのRESULTをそのままAccBに入れて返す 235 DF50 READ EQU * 236 DF50 FD DE21 STD XTRKNO 237 DF53 7F DE25 CLR XRWFLAG ;READ機能 238 DF56 16 FED4 LBRA FDRW ;AccA=TRK, AccB=SCT, X=SCTBUF 239 DF59 240 DF59 241 DF59 242 #; -----[ WRITE 1セクタのライト ] ---------------------------------------------〇 243 #* ENTRY A=TRK, B=SCT, X=SCTBUFADR 244 #* (B)= error condition 245 #* (Z)= 1 if no error / 0 if an error 246 DF59 WRITE EQU * 247 DF59 FD DE21 STD XTRKNO 248 DF5C 86 01 LDA #1 ;WRITE機能 249 DF5E B7 DE25 STA XRWFLAG 250 DF61 16 FEC9 LBRA FDRW ;AccA=TRK, AccB=SCT, X=SCTBUF 251 DF64 252 DF64 253 DF64 254 #; -----[ VERIFY ライト後のCRCチェック ] --------------------------------------〇 255 #* ENTRY NO ENTRY 256 #* (B)= error condition 257 #* (Z)= 1 if no error / 0 if an error 258 #; VERIFYの中身を実装していないので、ここではOKを返す 259 DF64 VERIFY EQU * 260 DF64 20 4B BRA OKRES ;AccB=ERR RESULT 261 DF66 262 DF66 263 DF66 264 #; -----[ HOME ヘッドのHOME ] ----------------------------------------------〇 265 #* ENTRY X=FCB ADR 266 #* (B)= error condition 267 #* (Z)= 1 if no error / 0 if an error 268 #; RESTOREはFDWR内で行うので、ここではOKを返す 269 DF66 HOME EQU * 270 DF66 20 49 BRA OKRES ;AccB=ERR RESULT 271 DF68 272 DF68 273 DF68 274 #; -----[ DRIVE ドライブ番号指定の処理 ] ------------------------------------------〇 275 #* ENTRY X=FCB ADR 276 #* (B)= $0F non-existent drive 277 #* = error condition otherwise 278 #* (Z)= 1 if no error / 0 if an error 279 #* (C)= 0 if no error / 1 if an error 280 #; ドライブ番号をチェックしOKなら変数XDRVNOに代入する 281 DF68 DRIVE EQU * 282 DF68 A6 03 LDA 3,X ;FCBからドライブ番号を取得 283 DF6A 81 03 CMPA #MAXDRVNO 284 DF6C 23 05 BLS DRIVE2 285 DF6E C6 0F LDB #$0F ;ドライブ無しエラー($0F)をセット 286 DF70 1A 01 ORCC #$01 ;エラー有りで戻る 287 DF72 39 RTS 288 DF73 289 DF73 B7 DE20 DRIVE2 STA XDRVNO ;エラー無しの場合DRVNoをセット 290 DF76 5F CLRB ;エラーコード無し 291 DF77 1A 04 ORCC #$04 ;Z=1 292 DF79 1C FE ANDCC #$FE ;C=0 293 DF7B 39 RTS 294 DF7C 295 DF7C 296 DF7C 297 #; -----[ CHKRDY ドライブ準備完了待ち ] ---------------------------------------〇 298 * ENTRY X=FCB ADR 299 * (B)= error condition 300 * (Z)= 1 if no error / 0 if an error 301 * (C)= 0 if no error / 1 if an error 302 DF7C CHKRDY EQU * 303 DF7C A6 03 LDA 3,X 304 DF7E 81 03 CMPA #MAXDRVNO 305 DF80 23 07 BLS CHKRDY2 306 DF82 C6 80 LDB #$80 ;NOT READY エラーコード($80)をセット 307 DF84 1A 01 ORCC #$01 ;C=1 308 DF86 1C FB ANDCC #$FB ;Z=0 309 DF88 39 RTS 310 DF89 311 DF89 B6 FF00 CHKRDY2 LDA STSREG 312 DF8C 43 COMA 313 DF8D 85 80 BITA #$80 ;Bit7=NotReady 314 DF8F 27 07 BEQ CHKRDY_OK ;準備OKへ 315 DF91 C6 80 CHKRDY_NG LDB #$80 ;NOT READY エラーコード($80)をセット 316 DF93 1A 01 ORCC #$01 ;C=1 317 DF95 1C FB ANDCC #$FB ;Z=0 318 DF97 39 RTS 319 DF98 320 DF98 20 17 CHKRDY_OK BRA OKRES ;AccB=ERR RESULT 321 DF9A 322 DF9A 323 DF9A 324 #; -----[ QUICK NOT READYフラグを調べる ] -------------------------------------〇 325 #; QUICKは未使用→CHKRDYを流用( 6809の考え方 P.161) 326 #; 5インチドライブのようにMOTOR ON/OFFするデッキはモータ起動からの安定時間を 327 #; 待ってREADYになるのでCHKRDYと同じ条件でチェックしないといけない 328 DF9A QUICK EQU * 329 DF9A 39 RTS 330 DF9B 331 DF9B 332 DF9B 333 #; -----[ INIT FDC/FDDの初期化 ] ----------------------------------------------〇 334 DF9B INIT EQU * 335 DF9B 8E DE20 LDX #XDRVNO 336 DF9E C6 05 LDB #5 337 DFA0 4F CLRA 338 DFA1 A7 80 INIT2 STA ,X+ 339 DFA3 5A DECB 340 DFA4 26 FB BNE INIT2 ;変数の初期化 341 DFA6 1C AF ANDCC #$AF 342 DFA8 86 2F LDA #FORCECMD 343 DFAA B7 FF00 STA CMDREG ;FDCリセット 344 DFAD 39 RTS 345 DFAE 346 DFAE 347 DFAE 348 #; -----[ WARM WARMスタート時の初期化 ] ---------------------------------------〇 349 DFAE WARM EQU * 350 DFAE 39 RTS 351 DFAF 352 DFAF 353 DFAF 354 #; -----[ SEEK ヘッドのシーク ] -----------------------------------------------〇 355 #* ENTRY A=TRK, B=SCT 356 #* (B)= error condition 357 #* (Z)= 1 no error / 0 an error 358 #; SEEKはFDWR内で行うので、ここではOKを返す 359 DFAF SEEK EQU * 360 DFAF 20 00 BRA OKRES ;AccB=ERR RESULT 361 DFB1 362 DFB1 363 DFB1 364 #; -----[ OKRES OKを返す ] -----------------------------------------------〇 365 #* ENTRY A=TRK, B=SCT 366 #* (B)= error condition 367 #* (Z)= 1 no error / 0 an error 368 DFB1 5F OKRES CLRB ;エラーコード無し 369 DFB2 1A 04 ORCC #$04 ;Z=1 370 DFB4 1C FE ANDCC #$FE ;C=0 371 DFB6 39 RTS 372 DFB7 373 DFB7 374 DFB7 375 #; -----[ UNITSELレジスタセット ] -----------------------------------------〇 376 #; $FF04 UNITSELデータの生成 377 #; 呼ばれる前にXSCTNOとXDRVNOがセットされていること 378 #; 結果はXUNITSELに代入されるが$FF04にはここではセットしない 379 DFB7 34 16 GETUNITSEL PSHS D,X 380 DFB9 86 28 LDA #$28 381 DFBB F6 DE22 LDB XSCTNO 382 DFBE F7 DE24 STB XWKSCTNO 383 DFC1 C1 10 CMPB #16 384 DFC3 23 02 BLS GETUNITSEL_A ;セクタが16以下ならSIDE A 385 DFC5 8A 10 GETUNITSEL_B ORA #$10 ;SideBとする 386 DFC7 387 DFC7 BA DE20 GETUNITSEL_A ORA XDRVNO ;ドライブ指定を反映する 388 DFCA B7 DE23 STA XUNITSEL ;UNITSEL値生成 389 DFCD 35 16 PULS D,X 390 DFCF 391 #;ビジーループによる単純待ち 392 DFCF 34 10 BUSYLOOP PSHS X 393 DFD1 8E 1770 LDX #$1770 394 DFD4 30 1F BUSYLOOP_1 LEAX -1,X 395 DFD6 26 FC BNE BUSYLOOP_1 396 DFD8 35 90 PULS X,PC 397 DFDA 398 DFDA 399 DFDA 400 #; -----[ FDCからのReady待ち(WaitFromReady) ]-------------------〇 401 #;入力=FDC STATUS 出力AccA=0が正常,1=エラー 402 DFDA WAIT4RDY EQU * 403 DFDA CE 0000 LDU #$0000 ;カウンタ初期値 404 DFDD B6 FF00 WAIT4RDY_0 LDA STSREG ;FDC STR 405 DFE0 43 COMA 406 DFE1 84 81 ANDA #$81 407 DFE3 27 09 BEQ WAIT4RDY_1 ;b7=NotReady,b0=Busy b7無視 b0のみチェック 408 DFE5 33 5F LEAU -1,U ;カウントダウン 409 DFE7 EF 7E STU -2,S ;Uをダミー保存 U=0ならZ=1 410 DFE9 26 F2 BNE WAIT4RDY_0 ;リトライ 411 DFEB 86 01 LDA #1 ;ERROR 412 DFED 39 RTS 413 DFEE 414 DFEE 4F WAIT4RDY_1 CLRA ;OK 415 DFEF 39 RTS 416 DFF0 417 DFF0 418 DFF0 419 #; -----[ NMIベクタの入替 ] ------------〇 420 #;NMIVECに設定したベクタをワークのVNMIにセットしワークに入っていたベクタをNMIVECに保存する 421 DFF0 34 50 SWAPNMIVEC PSHS X,U 422 DFF2 BE FFFC LDX VNMI ;現NMIベクタ値取得 423 DFF5 FE DE2B LDU NMIVEC ;新NMIベクタ値取得 424 DFF8 FF FFFC STU VNMI ;新NMIベクタを設定 425 DFFB BF DE2B STX NMIVEC ;現NMIベクタを保存 426 DFFE 35 D0 PULS X,U,PC 427 E000 428 DE00 END Total Errors 0
夜な夜な調べていますが、うまくいかずに眠くなります・・・
そんなFLEX9 ディスクドライバデバッグの記録^^