-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathLDFILE2.ASM
More file actions
464 lines (427 loc) · 5.86 KB
/
LDFILE2.ASM
File metadata and controls
464 lines (427 loc) · 5.86 KB
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
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
; LSX-Dodgers FILE2
;Write random block
_SYS26: ;(BDOS)ランダムブロック書き込み
XOR A
LD (DRDN1),A ;NOP
LD (RBSIZE),HL ;HL←書き込むレコード数
LD (LEFTX),HL
CALL SETDRV
CALL RBX0
JP C,RBWERR
CALL WOPEN
JP C,RBWERR
LD A,H
OR L
JP Z,RBW1
DEC HL
CALL GET_RR_BCDE ;BCDE=Random record
ADD HL,DE ;BCHL=HL+BCDE
JR NC,S26X1 ;
INC BC ;
S26X1:
CALL RWXR
CALL C,WRDFX
JP C,RBWERR
CALL RBX2
JR Z,RBWB ;NZ=セクタ以下の端数がある
CALL RBXA
JR C,RBWERR
EX DE,HL
PUSH BC
LDIR
LD (DTAX),HL
CALL WTDB ;バッファデータは更新された
LD HL,(LEFTX)
POP DE
SBC HL,DE
LD (LEFTX),HL
JR Z,RBWEND
RBWB:
CALL RBXB
JR Z,RBWC
RBWB1:
PUSH BC
PUSH DE
CALL CLUSTX
CALL DWTC
POP DE
POP BC
CALL NC,GNCLX
JR C,RBWERR
DJNZ RBWB1
CALL DRW_FLUSH
RBWC:
CALL RBXC
JR Z,RBWEND
PUSH BC
CALL CLUSTX
CALL DRDN
POP BC
JR C,RBWERR
LD DE,(_DTBUF)
LDIR
CALL WTDB ;バッファデータは更新された
RBWEND:
CALL RBXEND
CALL RBX1
JR NC,RBW1 ;ランダムレコードの方が大きい場合はサイズを合わせる
CALL GET_RR_BCDE ;BCDE=Random record
LD (IY+16),E ;ファイルのサイズ(バイト単位)
LD (IY+17),D ;
LD (IY+18),C ;
LD (IY+19),B ;
RBW1:
POP IY
POP BC
POP DE
POP HL
DD_NUL:
XOR A
DRDF0:
DWTF0:
RET
RBWERR:
PUSH IY
POP DE
LD C,010H ;(BDOS)ファイルのクローズ
CALL BDOS0
RBRERR1:
LD A,001H
RBRERR2:
POP IY
POP BC
POP DE
POP HL
SCF
LD HL,0
RET
RBRERR:
LD A,0FFH
JR RBRERR2
RBRFL:
RBRFLP: LD A,000H
CP 00DH
JR NZ,RBRFL1
PUSH DE
LD E,00AH
JR RBRFL2
RBRFL1:
PUSH DE
CALL _SYS07
LD E,A
RBRFL2:
CALL _PRINT
LD A,E
POP DE
LD (RBRFLP+1),A
RET
;Read random block
_SYS27: ;(BDOS)ランダムブロック読み込み
LD (LEFTX),HL
CALL SETDRV
BIT 4,(IY+13) ;(FCB)属性(アトリビュート)
JP NZ,RBRDIR ;ディレクトリ
CALL RBX0
JP C,RBRERR
CALL RBX1
CALL NC,RBX1R
JP C,RBRERR1
EX DE,HL
SBC HL,DE ;CP 00HL,BCDE
ADD HL,DE
LD A,C
SBC A,0
LD A,B
SBC A,0
JR C,RBR1
EX DE,HL
RBR1:
SBC A,A
AND 1
LD (RBRA_SWC),A
LD A,H
OR L
JR Z,RBREND0
LD (RBSIZE),HL ;HL←読み込むレコード数
LD (LEFTX),HL
CALL RBX2
JR Z,RBRB
CALL RBXA
JP C,RBRERR
PUSH BC
LDIR
LD (DTAX),DE
LD HL,(LEFTX)
POP DE
AND A
SBC HL,DE
LD (LEFTX),HL
JR Z,RBREND
RBRB:
CALL RBXB
JR Z,RBRC
RBRB1:
PUSH BC
PUSH DE
CALL CLUSTX
CALL DRDC
POP DE
POP BC
CALL NC,GNCLX
JP C,RBRERR
DJNZ RBRB1
CALL DRW_FLUSH
RBRC:
CALL RBXC
JR Z,RBREND
PUSH BC
CALL CLUSTX
CALL DRDX
POP BC
JP C,RBRERR
EX DE,HL
LD HL,(_DTBUF)
LDIR
RBREND:
CALL RBXEND
RBREND0:
POP IY
POP BC
POP DE
POP AF ;(HL)
XOR A
LD A,000H
RBRA_SWC EQU $-1
RET
RBRDIR:
LD L,(IY+26) ;(FCB)ファイルの先頭クラスタ
LD H,(IY+27)
CALL CHDIR
XOR A
LD H,A
LD L,A
INC A
LD (RBRA_SWC),A
JR RBREND0
;(15)
RBX0:
LD HL,(_DTA)
LD (DTAX),HL
LD HL,(LEFTX)
LD A,(IY+28) ;(FCB)オープンモード
SUB 0FDH
RET
RBX1: ;ファイルサイズとランダムレコードを比べる
PUSH HL ;Record byte
;AHL=File size
LD L,(IY+16) ;ファイルのサイズ(バイト単位)
LD H,(IY+17) ;
LD A,(IY+18) ;
CALL GET_RR_BCDE ;BCDE=Random record
AND A
SBC HL,DE
SBC A,C
LD C,A
LD A,(IY+19) ;ファイルのサイズ
SBC A,B
POP DE
RET
RBX1R: ;(8)
LD B,A
OR C
EX DE,HL ;BCDE=File byte HL=Record byte
OR D
OR E
RET NZ
SCF
RET
RBX2: ;Cluster settings
LD H,(IY+34) ;(+33)(FCB)ランダムレコード
LD C,(IY+35)
LD B,0
BIT 7,(IY+32) ;(FCB)カレントレコード
JR NZ,RBX3
LD B,(IY+36)
RBX3:
CALL RWXR
LD A,(SECSZ_H) ;1024=4 / 512=2 / 256=1
DEC A
AND (IY+34)
OR (IY+33)
RET
RBXA:
PUSH BC
PUSH DE
CALL CLUSTX
CALL DRDX
POP DE
POP BC
CALL NC,GNCLX
RET C
LD (_CLPS),DE
LD C,(IY+33) ;(FCB)ランダムレコード
LD HL,0400H ;自己書き換え 1024=0400H / 512=0200H ここに1セクタのサイズが格納される
SECSZ EQU $-2
SECSZ_H EQU $-1
LD A,H
DEC A ;1024=3 / 512=1
AND (IY+34) ;(FCB)ランダムレコード
LD B,A ;BCに1セクタ以下の端数が入る
SBC HL,BC ;残りを計算
LD DE,(LEFTX)
SBC HL,DE ;CP HL,DE
ADD HL,DE ;
JR C,RBXA1 ;DEとHLを比較して大きい方をHLに
EX DE,HL
RBXA1:
PUSH HL
LD HL,(_DTBUF)
ADD HL,BC
LD DE,(DTAX)
POP BC
RET
RBXB:
LD HL,(DTAX)
LD DE,(_CLPS)
LD A,(LEFTX+1)
LD B,A
LD A,(SECSZ_H) ;1024=4 / 512=2 / 256=1
RBXB1:
RRA ;->CF
JR C,RBXB2
SRL B ;B=B/2
JR RBXB1
RBXB2:
LD A,B
OR A
RET
;(12)
RBXC:
LD BC,(LEFTX)
LD A,(SECSZ_H) ;1024=4 / 512=2 / 256=1
DEC A
AND B
LD B,A ;1セクタ以下の端数がない場合はZ
OR C
RET
; ランダムブロックアクセスの連続したセクタをまとめる
DWTC:
PUSH HL
LD HL,DWT24B
JR DWTC1
DRDC:
PUSH HL
LD HL,DRD24B
DWTC1:
LD (DRWF_MODE),HL
POP HL
LD A,(DRWF_B)
OR A
JR NZ,DRDC1
SAVE_DRWC:
LD B,1
LD (DRWF_C),BC
LD (DRWF_E),DE
LD (DRWF_HL),HL
JR INC_HL_DRWC
DRDC1:
PUSH HL
LD HL,DRWF_E
ADD A,(HL)
PUSH AF
CP E
JR NZ,DRDC2
POP AF
INC HL
LD A,(HL)
ADC A,0
PUSH AF
CP D
JR NZ,DRDC2
POP AF
LD A,(DRWF_C)
ADC A,0
CP C
JR NZ,DRDC3
LD HL,DRWF_B
INC (HL)
POP HL
INC_HL_DRWC:
LD A,(SECSZ_H) ;1セクタのサイズの上位1バイト
ADD A,H
LD H,A
RET
DRDC2:
POP AF
DRDC3:
CALL DRW_FLUSH
POP HL
JR SAVE_DRWC
; ランダムブロックアクセスの連続したセクタをまとめたものをフラッシュする
DRW_FLUSH:
PUSH BC
PUSH DE
LD BC,0
DRWF_C EQU $-2
DRWF_B EQU $-1
LD A,B
OR A
JR Z,DRDF1
LD DE,0
DRWF_E EQU $-2
DRWF_D EQU $-1
LD HL,0
DRWF_HL EQU $-2
XOR A
LD (DRWF_B),A
CALL DRD24B
DRWF_MODE EQU $-2
DRDF1:
POP DE
POP BC
RET
RB_WRITE:
PUSH BC
LD C,026H ;(BDOS)ランダムブロック書き込み
JR RBRW
RB_READ:
PUSH BC
LD C,027H ;(BDOS)ランダムブロック読み込み
RBRW:
RRA ;AHL = AHL*128
LD A,H ;AHL = AHL0/2
RRA ;A
LD H,L ;
RR H ;H
LD L,0 ;
RR L ;L
CALL SET_RR_AHL
LD HL,128
PUSH BC
SETSEQ_SWC_RND:
CALL SETSEQ1 ;CALL SETSEQ1 or LD BC,SETSEQ1
POP BC
SET 7,(IY+32) ;(FCB)カレントレコード
PUSH IY
POP DE
PUSH DE
CALL BDOS0
POP IY
CALL SETSEQ ;SETSEQ or POPRR
SETSEQ_SWC_SEQ_RR EQU $-2
RES 7,(IY+32) ;(FCB)カレントレコード
POP BC
RET
;(22)
INIT_SEQ:
LD A,1 ;LD BC,????
LD HL,SETSEQ
CALL PUSHRR
GETSEQ:
LD L,(IY+32) ;(FCB)カレントレコード
LD H,(IY+12) ;(FCB)カレントブロック
XOR A
SLA L ;L=L*2
SRL H ;HL=HL/2
RR L ;
RET