-
Notifications
You must be signed in to change notification settings - Fork 6
/
88DISK.ASM
330 lines (297 loc) · 6.7 KB
/
88DISK.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
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
; LSX-Dodgers DISK
; PC-8801mkIISR
; FLOPPY DISK DRIVER
;
PUTCOM_EXECUTE:
LD A,0DH ;エグゼキュート
; コマンド送信
PUTCOM:
PUSH AF
LD A,00FH
OUT (0FFH),A ;ディスクサブシステムI/F 8255 コントロール
POP AF
; 通常ハンドシェイク(ホストが送信)
PUTDAT:
PUSH AF
PUTDAT1:
IN A,(0FEH) ;ディスクサブシステムI/F 8255 ポートC
AND 2 ;RFD
JR Z,PUTDAT1
LD A,00EH ;ATN=0
OUT (0FFH),A ;ディスクサブシステムI/F 8255 コントロール
POP AF
OUT (0FDH),A ;標準状態ではサブシステムへのデータ送信ポート
PUSH AF
LD A,9 ;DAV=1
OUT (0FFH),A
PUTDAT2:
IN A,(0FEH) ;ディスクサブシステムI/F 8255 ポートC
AND 4 ;DAC
JR Z,PUTDAT2
LD A,8 ;DAV=0
OUT (0FFH),A
PUTDAT3:
IN A,(0FEH) ;ディスクサブシステムI/F 8255 ポートC
AND 4 ;DAC
JR NZ,PUTDAT3
POP AF
RET
; 通常ハンドシェイク(ホストが受信)
GETDAT:
LD A,00BH ;RFD=1
OUT (0FFH),A ;ディスクサブシステムI/F 8255 コントロール
GETDAT1:
IN A,(0FEH) ;ディスクサブシステムI/F 8255 ポートC
RRCA ;DAV
JR NC,GETDAT1
LD A,00AH ;RFD=0
OUT (0FFH),A ;ディスクサブシステムI/F 8255 コントロール
IN A,(0FCH) ;標準状態ではサブシステムからのデータ受信ポート
PUSH AF
LD A,00DH ;DAC=1
OUT (0FFH),A ;ディスクサブシステムI/F 8255 コントロール
GETDAT2:
IN A,(0FEH) ;ディスクサブシステムI/F 8255 ポートC
RRCA ;DAV
JR C,GETDAT2
LD A,00CH ;DAC=0
OUT (0FFH),A
POP AF
RET
; 高速ハンドシェイク(ホストが送信)
; HL:アドレス BC:受信サイズ(必ず偶数にする)
FPUTDAT:
FPUTDAT1:
IN A,(0FEH) ;ディスクサブシステムI/F 8255 ポートC
AND 2 ;RFD
JR Z,FPUTDAT1
LD A,00EH ;ATN=0
OUT (0FFH),A ;ディスクサブシステムI/F 8255 コントロール
LD A,(HL)
OUT (0FDH),A ;標準状態ではサブシステムへのデータ送信ポート
LD A,9 ;DAV=1
OUT (0FFH),A
INC HL
DEC BC
FPUTDAT2:
IN A,(0FEH) ;ディスクサブシステムI/F 8255 ポートC
AND 4 ;DAC
JR Z,FPUTDAT2
LD A,(HL)
OUT (0FDH),A ;標準状態ではサブシステムへのデータ送信ポート
LD A,8 ;DAV=0
OUT (0FFH),A
FPUTDAT3:
IN A,(0FEH) ;ディスクサブシステムI/F 8255 ポートC
AND 4 ;DAC
JR NZ,FPUTDAT3
CPI ;HL=HL+1 BC=BC-1 BCが0の場合にP/V=0
RET PO
JR FPUTDAT
; 高速ハンドシェイク(ホストが受信)
; HL:アドレス BC:受信サイズ(必ず偶数にする)
FGETDAT:
LD A,00BH ;RFD=1
OUT (0FFH),A ;ディスクサブシステムI/F 8255 コントロール
FGETDAT1:
IN A,(0FEH) ;ディスクサブシステムI/F 8255 ポートC
RRCA ;DAV
JR NC,FGETDAT1
LD A,00AH ;RFD=0
OUT (0FFH),A ;ディスクサブシステムI/F 8255 コントロール
IN A,(0FCH) ;標準状態ではサブシステムからのデータ受信ポート
LD (HL),A
LD A,00DH ;DAC=1
OUT (0FFH),A ;ディスクサブシステムI/F 8255 コントロール
INC HL
DEC BC
FGETDAT2:
IN A,(0FEH) ;ディスクサブシステムI/F 8255 ポートC
RRCA ;DAV
JR C,FGETDAT2
IN A,(0FCH) ;標準状態ではサブシステムからのデータ受信ポート
LD (HL),A
LD A,00CH ;DAC=0
OUT (0FFH),A
CPI ;HL=HL+1 BC=BC-1 BCが0の場合にP/V=0
RET PO
JR FGETDAT
; 論理セクタ番号からトラック番号とセクタ番号を得る
; in
; DE:論理セクタ
CALC_SECTOR:
PUSH BC
LD C,(IX+DPB_MAXSEC) ;フロッピーディスクの1トラックのセクタ数
LD B,16
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
DIV3:
LD E,A ;SECTOR
POP BC
RET
WTTRK:
SCF
RET
FDWT:
PUSH HL
PUSH DE
CALL CALC_SECTOR
LD A,D ;トラック
LD (FDWT_TRACK),A
LD A,E ;セクタ
LD (FDWT_SECTOR),A
LD A,(IX+DPB_MAXSEC) ;フロッピーディスクの1トラックのセクタ数
SUB E
INC A
LD H,A
POP DE
LD A,(SECSZ_H) ;1セクタのサイズの上位1バイト
LD C,A
XOR A
FDWT2:
ADD A,C
INC DE
DEC B
JR Z,FDWT3
DEC H ;トラック、ヘッドを跨がない
JR Z,FDWT3
CP 03AH ;バッファとして04000H-07BFFHまで使える
JR C,FDWT2
FDWT3:
LD C,A
POP HL
LD A,16H ;高速レシーブメモリ
CALL PUTCOM
LD A,HIGH DSS_DATA ;開始アドレスH
CALL PUTDAT
XOR A ;開始アドレスL
CALL PUTDAT
LD A,C ;バイト数H
CALL PUTDAT
XOR A ;バイト数L
CALL PUTDAT
PUSH BC
LD B,C
LD C,0
CALL FPUTDAT
POP BC
CALL PUTCOM_EXECUTE ;エグゼキュート
LD A,HIGH WRITEDISKEX
CALL PUTDAT
LD A,LOW WRITEDISKEX
CALL PUTDAT
LD A,(IX+DPB_UNITNO) ;デバイスドライバ内におけるユニット番号
CALL PUTDAT
LD A,(IX+DPB_MAXSEC) ;フロッピーディスクの1トラックのセクタ数
CALL PUTDAT
LD A,0 ;セクタ
FDWT_SECTOR EQU $-1
CALL PUTDAT
LD A,0 ;トラック
FDWT_TRACK EQU $-1
CALL PUTDAT
LD A,(IX+DPB_FDMODE) ;フロッピーディスクのモード
CALL PUTDAT
LD A,(SECSZ_H) ;1セクタのサイズの上位1バイト
CALL PUTDAT
LD A,C
CALL PUTDAT ;バイト数H
LD A,(IX+DPB_MAXCYL) ;フロッピーディスクのシリンダ数
CALL PUTDAT
CALL PUTCOM_EXECUTE ;エグゼキュート
LD A,HIGH RESULTEX
CALL PUTDAT
LD A,LOW RESULTEX
CALL PUTDAT
CALL GETDAT
LD C,A
CP 1
RET C
LD A,B
OR A
JP NZ,FDWT
RET
FDRD:
CALL PUTCOM_EXECUTE ;エグゼキュート
LD A,HIGH READDISKEX
CALL PUTDAT
XOR A
CALL PUTDAT
LD A,(_MAX_SEC_SZ_H)
ADD A,A
OR (IX+DPB_UNITNO) ;デバイスドライバ内におけるユニット番号
CALL PUTDAT
LD A,(IX+DPB_MAXSEC) ;フロッピーディスクの1トラックのセクタ数
CALL PUTDAT
PUSH HL
PUSH DE
CALL CALC_SECTOR
LD A,E ;セクタ
CALL PUTDAT
LD A,D ;トラック
CALL PUTDAT
LD A,(IX+DPB_MAXSEC) ;フロッピーディスクの1トラックのセクタ数
SUB E
INC A
LD H,A
POP DE
LD A,(IX+DPB_FDMODE) ;フロッピーディスクのモード
CALL PUTDAT
LD A,(SECSZ_H) ;1セクタのサイズの上位1バイト
CALL PUTDAT
LD C,A
XOR A
FDRD2:
ADD A,C
INC DE
DEC B
JR Z,FDRD3
DEC H ;トラック、ヘッドを跨がない
JR Z,FDRD3
CP 03AH ;バッファとして04000H-07BFFHまで使える
JR C,FDRD2
FDRD3:
POP HL
LD C,A
CALL PUTDAT ;バイト数H
LD A,(IX+DPB_MAXCYL) ;フロッピーディスクのシリンダ数
CALL PUTDAT
CALL PUTCOM_EXECUTE ;エグゼキュート
LD A,HIGH RESULTEX
CALL PUTDAT
LD A,LOW RESULTEX
CALL PUTDAT
CALL GETDAT
LD C,A
CP 1
RET C
LD A,15H ;高速センドメモリ
CALL PUTCOM
LD A,HIGH DSS_DATA ;開始アドレスH
CALL PUTDAT
XOR A ;開始アドレスL
CALL PUTDAT
LD A,C ;バイト数H
CALL PUTDAT
XOR A ;バイト数L
CALL PUTDAT
PUSH BC
LD B,C
LD C,0
CALL FGETDAT
POP BC
LD A,B
OR A
JP NZ,FDRD
RET