Subversion Repositories pentevo

Rev

Rev 627 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1.  
  2. ; LAST UPDATE: 18.10.2023 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
  626.