ベーシックマスタレベル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 ディスクドライバデバッグの記録^^