-
Notifications
You must be signed in to change notification settings - Fork 6
/
X1DISK.ASM
266 lines (233 loc) · 3.69 KB
/
X1DISK.ASM
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
; LSX-Dodgers DISK
; X1/turbo/Z
SEEK:
LD B,16
LD C,(IX+DPB_MAXSEC)
XOR A
EX DE,HL
DIV1:
ADD HL,HL
ADC A,A
CP C
JR C,DIV2
SUB C
INC L
DIV2:
DJNZ DIV1
INC A ;最小のセクタは1固定
LD D,L ;TRACK
LD E,A ;SECTOR
SRL D ;CYLINDER
SBC A,A
AND 010H ;SIDE
LD C,A
LD A,(_DRIVE)
AND 3
OR C
LD (_DRIVE),A ;サイド選択とドライブを保存
LD BC,00FFCH ;モーター制御、サイド選択、 ドライブ選択
OR 080H ;Motor on
OUT (C),A
CALL SETMODE
RET C
CALL DRIVE
CP 0FFH ;A=0FFH Unknown CYLINDER
CALL Z,FDCRES ;Restore
LD C,0F9H ;MB8877A トラックレジスタ
OUT (C),A ;Currrent CYLINDER
SUB D
RET Z ;No seek シークの必要なし
LD A,(_ISEEK)
LD C,A
LD A,(IX+DPB_MAXCYL)
DEC A
CP D ;Over CYLINDER
RET C
CP C
JR C,SETM2 ;2D
BIT 0,(IX+DPB_FDMODE)
JR Z,SETM2 ;2HD
LD A,B ;2DD
IN A,(0FEH) ;1.6M(2HD) タイプ指定 (turbo/Z/CZ-8BF1のみ)
SETM2:
LD C,0FBH ;MB8877A データレジスタ
OUT (C),D
LD (HL),D
LD C,018H ;FDC TypeIコマンド Seek
FDCCMD2:
LD A,(_SEEKSP)
OR C
FDCCMD:
CALL COMSET
LD A,080H ;FDC COMMAND(Self-modifying code)
FDCSWC EQU $-1
AND 020H ;Write data Write track
INC A
SST:
LD C,0
SST1:
DEC C ; 4
JR NZ,SST1 ;12 * 256 / 4 = About 1ms
DEC A
JR NZ,SST1
INC A ;A=1
CALL READY
SETMODE:
LD C,(IX+DPB_FDMODE) ;フロッピーディスクのモード
IN A,(C)
LD A,B
IN A,(0FDH) ;MFM 方式指定
CALL DELAY0 ;Head select time
LD A,081H ;NOT READY,BUSY
READY:
PUSH HL
LD H,A
LD C,0F8H ;MB8877A ステータス/コマンドレジスタ
LD L,C
READY2:
IN A,(C)
AND H
JR Z,READYE
LD A,1AH
IN A,(01H)
RLCA
XOR L
RRCA
JR NC,READY2
DEC L
JR NZ,READY2
READYE:
POP HL
RET
FDCRES:
LD (HL),0
LD C,8 ;FDC TypeIコマンド Restore
JR FDCCMD2
FDMOFF:
PUSH AF
PUSH BC ;Motor off
LD BC,00FFCH ;モーター制御、サイド選択、 ドライブ選択
LD A,(_DRIVE)
OUT (C),A
POP BC
POP AF
RET
SECSET_FDCCMD:
LD A,(FDCSWC)
SECSET:
LD BC,00FFAH ;MB8877A セレクタレジスタ
OUT (C),E
COMSET:
LD C,0F8H ;MB8877A ステータス/コマンドレジスタ
OUT (C),A
DELAY0:
LD A,26
DELAY:
DEC A
JR NZ,DELAY
RET
DRIVE: ;ドライブのシリンダを得る
LD L,(IX+DPB_UNITNO)
LD H,_CYL0/256
SET 7,L
LD A,(HL)
RET
RNF: ;ドライブのシリンダをリセット
CALL DRIVE
LD (HL),0FFH
RET
RETRY: DB 2
; FLOPPY DISK DRIVER(DMA)
WTTRK:
LD B,1
LD A,0F4H ;FDC TypeIIIコマンド Write Track
JR WTTRK1
FDWT:
LD A,0A0H ;FDC TypeIIコマンド Write Sector
WTTRK1:
LD (FDCSWC),A
LD A,079H ;WR0 ポートB←ポートB 転送 (書き込み)
JR DISK
DISKOK:
LD B,1
FDCNT EQU $-1
DJNZ DISK1
RET
FDRD:
LD A,080H ;FDC TypeIIコマンド Read Sector
LD (FDCSWC),A
LD A,07DH ;WR0 ポートA→ポートB 転送 (読み込み)
DISK:
LD (DMASWC),A
DISK1:
LD A,B
LD (FDCNT),A
LD (DMAHL),HL
DISKR:
LD A,2 ;Retry count
LD (RETRY),A
DISK2:
PUSH DE
CALL SEEK
JR C,ERRF
DI
LD A,DMAE-DMAD
LD HL,DMAD
CALL SETDMA
PUSH BC
CALL SECSET_FDCCMD
LD HL,(DMAHL)
INC HL
LD DE,0BB06H ;READ DMA
LD A,3
CALL READY
IN A,(C)
POP BC
OUT (C),D ;読み出しマスク設定
OUT (C),E ;バイトカウンタ(LH)
IN E,(C)
IN D,(C)
ADD HL,DE
POP DE
INC DE
EI
CALL FDMOFF
OR A
JR Z,DISKOK
DEC DE
BIT 4,A
CALL NZ,RNF
DISKE2:
LD HL,RETRY
DEC (HL)
JR NZ,DISK2
OR A
JR Z,ERR
PUSH DE
ERRF:
POP DE
DELP:
CALL RNF
CALL FDMOFF
LD A,0FFH
ERR:
CP A
SCF
RET
DMAD: ;X1turbo DISK DMA
DB 0C3H ;WR6 リセット
DMASWC: DB 07DH ;WR0 ポートA→ポートB 転送 (読み込み)
; DB 079H ;WR0 ポートB←ポートB 転送 (書き込み)
DW 00FFBH ;ポートA開始アドレス (FDC MB8877A データレジスタ)
DW 0FFFFH ;ブロック長(転送サイズ-1)
DB 02CH ;WR1 ポートAアドレス固定 I/O
DB 010H ;WR2 ポートBインクリメント
DB 080H ;WR3
DB 092H ;WR5 WAIT RDY:LOW
DB 08DH ;WR4 バイト ポートB開始アドレス(LH)
DMAHL: DW 0 ;ポートB開始アドレス
DB 0CFH ;WR6 ロード
DB 087H ;WR6 イネーブル
DMAE:
AT_R EQU WTTRK-AT_DWT
AT_TABLE: