MB-6892 マーク5の拡張RAMでFLEX9を試す その8 (ディスクドライバの仕上げ1)

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 ディスクドライバデバッグの記録^^

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください