Subversion Repositories pentevo

Rev

Rev 627 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
627 savelij 1
 
1120 savelij 2
; LAST UPDATE: 18.10.2023 savelij
627 savelij 3
 
4
DG      MACRO   PAR
5
        CALL    PRN
6
        DB      PAR,0DH,0AH,0
7
        ENDM
8
 
9
 
10
; ������� 1818��93
11
 
12
FDC_DRV         DW      FD_RES
13
                DW      FD_SEEK
14
                DW      FD_FRM
15
                DW      FD_REC
16
                DW      FD_RD
17
                DW      FD_NOP
18
                DW      FD_WR
19
 
20
;-----------------------
21
; ��������� � ���������� FD
22
FD_TVL: LD      HL,FD_TRKS
23
        LD      A,(IY+_DUS)
24
        JP      ADD_HL_A
25
 
26
;-----------------------
27
; ��������� ����������
28
FD_ADR: LD      (SV_SP),SP
29
FD_ADR1:
30
;       CALL    RET_ROM
31
        LD      C,(IY+_DUS)
32
        XOR     A
33
        SUB     (IX-_RQHEAD)
34
        CPL
35
        AND     10H
36
        OR      C
37
        LD      C,(IY+_DFMFM)
38
        XOR     C
39
        AND     0BFH
40
        XOR     C
41
        OR      0CH
42
        OUT     (0FFH),A
43
        CALL    FDREC1
44
        CALL    FD_TVL
45
        LD      A,(HL)
46
        INC     A
47
        JR      NZ,FD_SIT
48
        CALL    FR_SK1
49
        JP      NZ,ERR_PAS
50
        LD      A,1
51
FD_SIT: DEC     A
52
        OUT     (3FH),A
53
FD_NOP: XOR     A
54
        RET
55
 
56
;-----------------------
57
; ����� ����������
58
FD_RES:
59
;       CALL    TST_RT
60
        DI
61
;        CALL    RET_ROM
62
        LD      A,8
63
        OUT     (0FFH),A
64
;       LD      C,0
65
;$1:    
66
        LD      B,0
67
        DJNZ    $
68
;       DEC     C
69
;       JR      NZ,$1
70
        LD      A,0CH
71
        OUT     (0FFH),A
72
        LD      A,0D0H
73
        OUT     (1FH),A
74
        CALL    FD_PAS
75
RET_OK: XOR     A
76
        EI
77
                RET
78
;        JP      RET_RAM
79
 
80
;.COMMENT @
81
;-----------------------
82
; DELAY
83
;DELAY:  LD      B,50H
84
;DELAY1: PUSH    AF
85
;DLP1:   LD      C,-1
86
;DLP2:   DEC     C
87
;        JR      NZ,DLP2
88
;        DEC     B
89
;        JR      NZ,DLP1
90
;        POP     AF
91
;        RET
92
;@
93
 
94
FD_PAS: PUSH    AF
95
        CALL    FD_TVL
96
        LD      (HL),0FFH
97
        POP     AF
98
        RET
99
 
100
 
101
;-----------------------
102
; SEEK
103
FR_SEEK: LD     A,(RQCYL)
104
FR_SK1: LD      C,(IY+_DFSRHUT)
105
        SET     3,C
106
        OR      A
107
        LD      (HL),A
108
        JR      Z,FR_HM
109
        OUT     (7FH),A
110
        SET     4,C             ; SEEK COMMAND
111
        LD      A,(RQCOM)
112
        CP      _FORMAT         ; FORMAT
113
        JR      Z,FRS_D
114
        SET     2,C             ; 'VERIFY TRACK NUM' FLAG
115
        JR      FRS_D
116
FR_HM:  DEC     A
117
        OUT     (3FH),A
118
FRS_D:  LD      A,C
119
FR_SW1: OUT     (1FH),A
120
        JP      FD_WAIT
121
 
122
FD_SEEK:CALL    FD_ADR
123
        LD      A,(RQCYL)
124
        CP      (HL)
125
        JR      Z,RET_OK
126
FD_SKAL:EX      AF,AF'
127
        CALL    FR_SEEK
128
        JR      Z,RET_OK
129
        EX      AF,AF'
130
        OR      A
131
        JR      Z,ERR_PAS
132
        LD      A,0C0H
133
        LD      HL,ED_BUF
134
        LD      BC,87FH
135
        LD      DE,0
136
        DI                      ; READ TRACK NUMBER
137
        OUT     (1FH),A
138
        CALL    FD_RM
139
        EI
140
        IN      A,(1FH)
141
        AND     1CH
142
        JR      NZ,ATT3         ; IF ERROR - SKIP ATEMPT 2
143
        LD      A,(ED_BUF)
144
        OUT     (3FH),A         ; ELSE - SET IT
145
        CALL    FR_SEEK         ; ATEMPT 2
146
        JR      Z,RET_OK        ; O'K
147
ATT3:   XOR     A
148
        CALL    FR_SK1          ; ATEMPT 3. HOME & SEEK
149
        CALL    FR_SEEK
150
        JR      NZ,ERR_PAS
151
        JR      RET_OK
152
 
153
;-----------------------
154
; CALCULATE TIMEOUT VALUE
155
EV_TOUT:LD      A,(SYS_P)
156
        LD      B,4
157
        AND 8
158
        RET     Z
159
        SLA     B
160
        RET
161
 
162
;-----------------------
163
; WAIT FOR READY (WITH TIOME OUT CHECK)
164
FD_WDN: POP     DE              ; END OF WAIT
165
        POP     BC
166
        IN      A,(1FH)
167
        BIT     4,A
168
        RET
169
 
170
FD_WAIT:PUSH    BC              ; WAIT ITSELF
171
        PUSH    DE
172
        CALL    EV_TOUT
173
        LD      DE,0
174
FD_WL:  IN      A,(0FFH)
175
        AND     80H
176
        JR      NZ,FD_WDN
177
        DEC     DE
178
        LD      A,D
179
        OR      E
180
        JR      NZ,FD_WL
181
        DJNZ    FD_WL
182
;---------------------------
183
;   SOME ERRORS
184
; TIME OUT ERROR
185
T_OUT:  LD      A,_NRDY
186
        DB      21H             ; LD HL,...
187
; UNKNOWN ERROR
188
H_ERR:  LD      A,_HRDERR
189
; ANY ERROR
190
ERR_RET:LD      HL,(SV_SP)
191
        INC     HL
192
        INC     HL
193
        LD      SP,HL
194
        LD      H,A
195
;        CALL    RET_ROM
196
        LD      A,0D0H
197
        OUT     (1FH),A
198
        LD      A,H
199
        OR      A
200
                RET
201
;        JP      RET_RAM
202
; ERROR & PASSIVATE
203
ERR_PAS:CALL    FD_PAS
204
        JR      H_ERR
205
 
206
;-----------------------
207
; COMMON PART FOR READ/WRITE PROC'S
208
FD_RW:  LD      (SV_SP),SP
209
        CALL    FD_ADR1
210
        IN      A,(1FH)
211
        AND     20H             ; HEAD LOADED?
212
        JR      NZ,FD_RWL       ; YES - JUMP
213
        LD      A,(HL)          ; CURRENT TRACK
214
        OUT     (7FH),A         ; SEEK IT
215
        LD      A,(IY+_DFSRHUT)
216
        OR      18H             ; SEEK WITH 15MS DELAY COMMAND
217
        CALL    FR_SW1          ; SEEK & WAIT
218
        JR      NZ,ERR_PAS      ; RET IF ERROR
219
FD_RWL: LD      A,(RQSECT)
220
        INC     A
221
        OUT     (5FH),A
222
        CALL    EV_TOUT
223
        XOR     A
224
        SUB     (IX-_RQHEAD)
225
        AND     8
226
        LD      HL,(DCBUF)
227
        LD      C,7FH
228
        LD      DE,0
229
        EXX
230
        RET
231
 
232
;-----------------------
233
; COMMAND 'READ'
234
FD_RM:  IN      A,(0FFH)                ; READ LOOP
235
        AND     0C0H
236
        JP      M,TRY_ERR
237
        JR      NZ,FD_R1
238
        DEC     DE
239
        LD      A,D
240
        OR      E
241
        JR      NZ,FD_RM
242
        DJNZ    FD_RM
243
        JP      T_OUT
244
FD_R:   IN      A,(0FFH)
245
        AND     0C0H
246
        JR      Z,FD_R
247
        RET     M
248
FD_R1:  INI
249
        JR      FD_R
250
 
251
FD_RD:  CALL    FD_RW                   ; 'READ' COMMAND ITSELF
252
        LD      C,1CH
253
        EXX
254
        OR      80H
255
        DI
256
        OUT     (1FH),A
257
        CALL    FD_RM
258
;-----------------------
259
; TEST FOR R/W ERROR
260
RW_ERR_:IN      A,(1FH)
261
        EXX
262
        AND     C
263
RW_ERR1:EI
264
                RET Z
265
;        JP      Z,RET_RAM
266
        LD      C,A
267
ERR_R:  BIT     4,C
268
        JR      NZ,TRY_SK
269
;        CALL    RET_RAM
270
        BIT     3,C
271
        LD      A,_CRC_ERR
272
        RET     NZ
273
        BIT     2,C
274
        LD      A,_OVERRUN
275
        RET     NZ
276
        BIT     5,C
277
        LD      A,_IOERR
278
        RET     NZ
279
        BIT     6,C
280
        LD      A,_WR_PROT
281
        RET     NZ
282
        LD      A,_FATAL_ERROR
283
        OR      A
284
        RET
285
;--- IF 'NO ADDR MARK' ERROR - TRY TO SEEK
286
TRY_SK: CALL    FD_TVL
287
        LD      A,(RQCYL)
288
        CALL    FD_SKAL
289
        LD      A,_NO_DATA
290
        OR      A
291
        RET
292
;--- IF NO ERROR & NO DATA - ERROR TOO
293
TRY_ERR:IN      A,(1FH)
294
        EXX
295
        AND     C
296
        JP      Z,H_ERR
297
        POP     BC
298
        JR      RW_ERR1
299
 
300
;-----------------------
301
; COMMAND 'WRITE'
302
FD_WR:  CALL    FD_RW
303
        LD      C,7CH
304
        EXX
305
        OR      0A0H
306
        DI
307
        OUT     (1FH),A
308
        CALL    FD_WM
309
        JR      RW_ERR_
310
 
311
FD_WM:  IN      A,(0FFH)                ; WRITE LOOP
312
        AND     0C0H
313
        JP      M,TRY_ERR
314
        JR      NZ,FD_W1
315
        DEC     DE
316
        LD      A,D
317
        OR      E
318
        JR      NZ,FD_WM
319
        DJNZ    FD_WM
320
        JP      T_OUT
321
 
322
FD_W:   IN      A,(0FFH)
323
        AND     0C0H
324
        JR      Z,FD_W
325
        RET     M
326
FD_W1:  OUTI
327
        JR      FD_W
328
 
329
;-----------------------
330
; RECALIBRATE SUBROUTINES
331
FD_REC: CALL    FD_ADR
332
        XOR     A
333
        CALL    FR_SK1
334
        JP      NZ,H_ERR
335
        XOR     A
336
                RET
337
;       JP      RET_RAM
338
 
339
FD_SK:  OUT     (7FH),A
340
        LD      B,A
341
        LD      A,C
342
        OR      18H
343
        OUT     (1FH),A
344
        CALL    FD_WAIT
345
        LD      E,A
346
        SCF
347
        RET     NZ
348
        IN      A,(3FH)
349
        CP      B
350
        RET
351
 
352
FDREC1: BIT     7,(IY+_DCYLN)
353
        CALL    NZ,REC_TR
354
        BIT     7,(IY+_DFSRHUT)
355
        CALL    NZ,REC_TM
356
        RET
357
 
358
REC_TR: LD      A,0FH
359
        OUT     (1FH),A
360
        CALL    FD_WAIT
361
        JP      NZ,H_ERR
362
        LD      D,80
363
        LD      C,13H
364
        LD      A,79
365
        CALL    FD_SK
366
        JP      C,ERR_PAS
367
        JR      NZ,TR40
368
        LD      A,1
369
        CALL    FD_SK
370
        JP      C,ERR_PAS
371
        JR      Z,TR80
372
TR40:   LD      D,40
373
TR80:   BIT     1,(IY+_DHEADR)
374
        LD      (IY+_DCYLN),D
375
        LD      A,D
376
        JR      Z,$+3
377
        ADD     A,A
378
        LD      (IY+_DTRACK),A
379
        RET
380
 
381
REC_TM: LD      C,0FFH
382
FD_SLOW: INC    C
383
        BIT     2,C
384
        JP      NZ,H_ERR
385
        LD      A,C
386
        OR      8
387
        OUT     (1FH),A         ; HOME
388
        CALL    FD_WAIT
389
        JR      NZ,FD_SLOW
390
        LD      A,20
391
        CALL    FD_SK           ; SEEK 20 TRACK
392
        JR      NZ,FD_SLOW
393
        LD      A,1
394
        CALL    FD_SK           ; SEEK 1 TRACK
395
        JR      NZ,FD_SLOW
396
        BIT     2,E
397
        JR      NZ,FD_SLOW
398
        LD      A,C
399
        OR      38H
400
        OUT     (1FH),A         ; STEP -1
401
        CALL    FD_WAIT
402
        JR      NZ,FD_SLOW
403
        BIT     2,A             ; IS 0 TRACK ?
404
        JP      Z,FD_SLOW       ; IF NOT - SLOW
405
        LD      (IY+_DFSRHUT),C
406
        RET
407
 
408
;-------------------------------------
409
; FORMAT
410
OUT_R1: LD      A,C
411
        JR      OUT_R
412
OUT_1:  LD      B,1
413
OUT_R:  EX      AF,AF'
414
_O_W:   IN      A,(0FFH)
415
        AND     0C0H
416
        JR      Z,_O_W
417
        RET     M
418
        EX      AF,AF'
419
        OUT     (7FH),A
420
        DJNZ    OUT_R
421
        RET
422
 
423
_FRM_TR: LD      A,(IY+_DFN)     ; SECTOR SIZE
424
        LD      C,A             ; C - COUNTER
425
        OR      A               ; CONVERT (0,1,2,3) -> (1,1,2,4)
426
        JP      PO,$+4
427
        INC     C
428
        LD      B,0             ; B - SIZE OF FIRST BLOCK FORMAT
429
        SUB     1               ;     FILLER  (0,1,2,3) -> (128,256,256,256)
430
        RR      B
431
        PUSH    BC              ; SAVE FOR LATE USE
432
        LD      DE,ED_BUF       ; INTERLIVE TABLE
433
        LD      A,0F4H
434
        DI
435
        OUT     (1FH),A
436
        LD      A,04EH
437
        LD      B,(IY+_DFGPF)    ; GAP3 X 4E
438
        CALL    OUT_R
439
        LD      BC,0C00H
440
        CALL    OUT_R1
441
        LD      BC,3F6H
442
        CALL    OUT_R1
443
        LD      A,0FCH
444
        CALL    OUT_1
445
FR_LP:  LD      BC,324EH
446
        CALL    OUT_R1
447
        LD      BC,0C00H
448
        CALL    OUT_R1
449
        LD      BC,3F5H
450
        CALL    OUT_R1
451
        LD      A,0FEH
452
        CALL    OUT_1
453
        LD      A,(RQCYL)       ; TRACK
454
        CALL    OUT_1
455
        LD      A,(RQHEAD)      ; SIDE
456
        CALL    OUT_1
457
        LD      A,(DE)          ; SECTOR
458
        INC     DE
459
        CALL    OUT_1
460
        LD      A,(IY+_DFN)      ; SECTOR SIZE
461
        CALL    OUT_1
462
        LD      A,0F7H
463
        CALL    OUT_1
464
        LD      BC,164EH
465
        CALL    OUT_R1
466
        LD      BC,0C00H
467
        CALL    OUT_R1
468
        LD      BC,3F5H
469
        CALL    OUT_R1
470
        LD      A,0FBH
471
        CALL    OUT_1
472
        LD      A,(RQBLN)
473
        POP     BC
474
        PUSH    BC
475
FR_L1:  CALL    OUT_R
476
        DEC     C
477
        JR      NZ,FR_L1
478
        LD      A,0F7H
479
        CALL    OUT_1
480
        POP     HL
481
        RET     M
482
        PUSH    HL
483
        LD      A,(DE)
484
        OR      A
485
        JR      NZ,FR_LP
486
        POP     HL
487
        LD      C,5
488
FR_L2:  DEC     C
489
        RET     M
490
        LD      A,4EH
491
        CALL    OUT_R
492
        JP      P,FR_L2
493
        XOR     A
494
        RET
495
 
496
FD_FRM          LD A,(SYS_P)
497
                LD (TMP_W),A
498
                RES 3,(IX-_SYS_P)
499
                CALL SET_SYS
500
        CALL    FD_ADR
501
        CALL    FR_SEEK
502
        LD      A,_HRDERR
503
        RET     NZ
504
        LD      A,(RQBADR)
505
        CALL    FR_FIL
506
        LD      B,8
507
        DI
508
FRM_1:  PUSH    BC
509
        CALL    _FRM_TR
510
        POP     BC
511
        IN      A,(1FH)
512
        LD      C,A
513
        JP      P,FR_OK
514
        BIT     0,C
515
        JR      Z,F_SH1
516
        LD      A,0D0H
517
        OUT     (1FH),A
518
F_SH1:  BIT     6,C
519
        JP      NZ,ERR_R
520
WER_FL: DJNZ    FRM_1
521
        JP      ERR_R
522
FR_OK:  LD      DE,ED_BUF+1
523
WER_LP: LD      A,(DE)
524
        OR      A
525
        JR      NZ,$+3
526
        INC     A
527
        OUT     (5FH),A
528
        LD      A,80H
529
        OUT     (1FH),A
530
WER_WT: IN      A,(0FFH)
531
        AND     0C0H
532
        JR      Z,WER_WT
533
        IN      A,(1FH)
534
        AND     18H
535
        LD      C,A
536
        LD      A,0D0H
537
        OUT     (1FH),A
538
        JR      NZ,WER_FL
539
        LD      A,(DE)
540
        INC     DE
541
        OR      A
542
        JR      NZ,WER_LP
543
                LD A,(TMP_W)
544
                LD (SYS_P),A
545
                CALL SET_SYS
546
        JP      RET_OK
547
 
548
FR_FIL: LD      HL,ED_BUF       ; A - INTERLIVE FACTOR
549
        LD      DE,ED_BUF+1
550
        LD      C,(IY+_DSECTT)
551
        LD      B,0
552
        LD      (HL),0
553
        LDIR
554
        LD      HL,ED_BUF
555
        LD      C,A
556
        LD      B,(IY+_DSECTT)
557
        LD      D,1
558
        JR      FF_LP
559
FF_2:   PUSH    BC
560
        LD      C,1
561
        CALL    FF_MOV
562
        POP     BC
563
FF_LP:  LD      A,(HL)
564
        OR      A
565
        JR      NZ,FF_2
566
        LD      (HL),D
567
        INC     D
568
        PUSH    BC
569
        CALL    FF_MOV
570
        POP     BC
571
        DJNZ    FF_LP
572
        RET
573
FF_MOV: PUSH    DE
574
        LD      B,0
575
        ADD     HL,BC
576
        LD      C,(IY+_DSECTT)
577
        EX      DE,HL
578
        LD      HL,ED_BUF
579
        ADD     HL,BC
580
        DEC     HL
581
        SBC     HL,DE
582
        EX      DE,HL
583
        JR      NC,FF_R1
584
        OR      A
585
        SBC     HL,BC
586
FF_R1:  POP     DE
587
        RET
588
 
589
;.COMMENT @
590
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
591
;_PRN_M: LD      A,(HL)
592
;        OR      A
593
;        INC     HL
594
;        RET     Z
595
;        CALL    CONOUT
596
;        JR      _PRN_M
597
 
598
;PRN:    EX      (SP),HL
599
;        PUSH    AF
600
;        CALL    _PRN_M
601
;        POP     AF
602
;        EX      (SP),HL
603
;        JP      RET_ROM
604
 
605
;PHEX:
606
;        PUSH    AF
607
;        RRCA
608
;        RRCA
609
;        RRCA
610
;        RRCA
611
;       CALL    DHEX
612
;        POP     AF
613
;       CALL    DHEX
614
;        LD      A,":"
615
;        JP      CONOUT
616
 
617
;
618
; TYPE ONE HEX DIGIT
619
;
620
;DHEX:   AND     0FH
621
;        ADD     A,90H
622
;       DAA
623
;        ADC     A,40H
624
;       DAA
625
;        JP      CONOUT