;+---------------------------------------+
;!        vErY c00L WG'93 dRiVeR         !
;!  (c) 1998 Paracels/ETERNITY INDUSTRY  !
;!       especially for FAST GROUP       !
;+---------------------------------------+
;
;           * USER MANUAL *
;           ---------------
;   оняке напюыемхъ й ондопнцпюллюл disk,
;load & save б ъвеийе error лнфмн кхжег-
;перэ якедсчыхе йндю ньханй:
;
;оняке бшгнбю disk:
;------------------
; 0 - BCE 'OK !
; 1 - WRITE PROTECT ! дхяй еярэ, мн мю мел
;     гюйкеемю опнпегэ.
; 2 - NO DISK ! дхяй, мюбепмне, нрясрярбсер
;     хкх он йюйхл-кхан опхвхмюл ме унвер
;     йпсрхрэяъ;
;
;оняке бшгнбю load/save:
;-----------------------
; 0 - BCE 'OK !
; 3 - READ ERROR ! ньхайю времхъ. врн-рн
;     цде-рн ме вхрюеряъ;
; 4 - WRITE ERROR ! ньхайю гюохях. онвелс-
;     рн ме унвер охяюрэяъ. днкфмн ашрэ,
;     дхяй нвемэ кебши.
;-----------------------------------------
;Some comments & advice:
;-----------------------
;* дкъ ашярпнцн нярюмнбю дпюибю хяонкэгси-
;  ре ондопнцпюллс stop;
;* лни дпюибеп юаянкчрмн ме чгюер яхярел-
;  мше оепелеммше, йпнле #5D16 б яюлнл мю-
;  вюке дкъ нопедекемхъ рейсыецн дпюибю;
;* еякх бш гюунрхре, врнаш дпюибеп пюанрюк
;  я дпсцнцн дхяйнбндю, опнярн гюмеяхре б
;  ъвеийс drive+1 ецн мнлеп (0=A, 1=B, 2=C
;  3=D).
;-----------------------------------------
;Note: еякх асдере чгюрэ дпюибеп хг XAS'ю
;      (the best assembler), онфюксиярю ме
;      сдхбкюиреяэ х ме псцюире лемъ, еякх
;      опх гюосяйе кнюдепю хкх ящибепю нмх
;      асдср б мювюке рнплнгхрэ - щрн цкчй
;      XAS'ю, ю ме лни. б йювеярбе днйюгю-
;      рекэярбA бшидхре б TR-DOS, ядекюире
;      LIST (хкх CAT), врнаш  бняярюмнбхрэ
;      бц'ьйс (р.й. XAS ее чгюер он-ярпюь-
;      мнлс), онрнл бшидере напюрмн  б аю-
;      гхй х гюосярхре вепег RANDOMIZE USR
;      лни дпюибеп лмнцн пюг  ондпъд - бяе
;      днкфмн  ашрэ 'OK - OB ! он  йпюимеи
;      лепе с лемъ бяе COOL'эмн !
;
;Date: 2-Sep-98               я сбюфемхел,
;Time: 00:35:25 (msk)          Paracesl/EI
;
;       ORG     #6000
;       DI
;       CALL    L_DRIVE
;       CALL    DISK
;       LD      A,(ERROR)
;       CP      2
;       JR      C,DSK_PR
;       CALL    STOPD
;       EI
;       RET
;
;DSK_PR  LD      HL,#C000
;       LD      DE,#7000
;       LD      BC,#4010
;       CALL    LOAD
;       CALL    STOPD
;       EI
;       RET
;ячдю гюмняхряъ йнд ньхайх.
;
;хмярюккъжхъ рейсыецн дпюибю.
L_DRIVE LD      A,(#5D16)
        AND     #03
        LD      (drive+1),A
        RET 
;
;опнбепйю мю мюкхвхе дхяйю.
DISK    DI 
        LD      A,(LASTTRK)
        LD      D,A
        CALL    POS
        CALL    READ_1F
        AND     #42
        LD      E,A
        LD      BC,#1000
DISK_LP PUSH    BC
        CALL    POS
        CALL    READ_1F
        POP     BC
NO_WP   AND     #42
        CP      E
        JR      NZ,DISK_P
        DEC     BC
        LD      A,B
        OR      C
        JR      NZ,DISK_LP
        LD      A,6
        LD      (#5D0F),A
        RET 
DISK_P  BIT     6,A
        LD      A,0
        JR      Z,DISK_P-4
        LD      A,7
        JR      DISK_P-4
;
;кнюдеп:
;HL - йсдю цпсгхрэ
;DE - рпей/яейрнп
;B  - яйнкэйн яейрнпнб
;C  - б йюйсч аюмйс цпсгхрэ
;LOAD
;       LD      A,C
;       CALL    EIPAGE
LOAD_L  PUSH    BC
        PUSH    DE
        PUSH    HL
        CALL    POS
        LD      A,E
        INC     A
        CALL    OUT_5F
        LD      A,#80
        CALL    OUT_1F
        LD      C,#7F
        LD      IX,#3FE5
        CALL    EIDOS
        CALL    READ_1F
        POP     HL
        JR      Z,L_OK
L_ERR1  LD      A,0
        INC     A
        AND     3
        LD      (L_ERR1+1),A
        JR      NZ,LOAD_L+2
        CALL    TRK_0
L_ERR2  LD      A,0
        INC     A
        AND     3
        LD      (L_ERR2+1),A
        JR      NZ,LOAD_L+2
        LD      A,5
        LD      (#5D0F),A
        JP TRDOS9
;
L_OK    LD      (L_ERR1+1),A
        LD      (L_ERR2+1),A
        POP     DE
        POP BC
        CALL    N_SEC
        DJNZ    LOAD_L
        LD (#5CF4),DE
        RET 
;
;ящибеп:
;HL - нрйсдю охяюрэ
;DE - рпей/яейрнп
;B  - яйнкэйн яейрнпнб
;C  - хг йюйни аюмйх охяюрэ
;SAVE   LD      A,C
;       CALL    EIPAGE
SAVE_L  PUSH    BC
        PUSH    DE
        PUSH    HL
        CALL    POS
PAUS    CALL    PAUSE
        LD      BC,#3D2F
        LD      (PAUS+1),BC
        LD      A,E
        INC     A
        CALL    OUT_5F
        LD      A,#A0
        CALL    OUT_1F
        LD      C,#7F
        LD      IX,#3FCA
        CALL    EIDOS
        CALL    READ_1F
        POP     HL
        JR      Z,S_OK
S_ERR1  LD      A,0
        INC     A
        AND     7
        LD      (S_ERR1+1),A
        JR      NZ,SAVE_L+2
        CALL    TRK_0
S_ERR2  LD      A,0
        INC     A
        AND     3
        LD      (S_ERR2+1),A
        JR      NZ,SAVE_L+2
        LD      A,5
        LD      (#5D0F),A
        JP TRDOS9
;
S_OK    LD      (S_ERR1+1),A
        LD      (S_ERR2+1),A
        POP     DE
        POP BC
        CALL    N_SEC
        DJNZ    SAVE_L
        LD (#5CF4),DE
        RET 
;
TRK_0
        LD      A,#08
        CALL    OUT_1F
        LD      IX,#3EF5
        CALL    EIDOS
        DI 
        RET 
;
N_SEC   LD      (#5D0F),A
        INC     H
        INC     E
        LD      A,E
        SUB     #10
        RET     NZ
        LD      E,A
        INC     D
        RET 
;
;EIPAGE   PUSH    BC
 ;      LD      BC,#7FFD
  ;     OUT     (C),A
   ;    POP     BC
    ;   RET
;
POS     LD      A,D
        LD      (LASTTRK),A
        SRL     A
        CALL    OUT_7F
        LD      A,#3C
        BIT     0,D
        JR      Z,$+4
        LD      A,#2C
drive   OR      0
        CALL    OUT_FF
        LD      A,#18
        CALL    OUT_1F
        LD      IX,#3EF5
        CALL    EIDOS
        DI 
        LD      A,D
        SRL     A
        CALL    OUT_3F
        RET 
;
LASTTRK DEFB    0
;тюярнбши нярюмнб дпюибю !
STOPD   XOR     A
        CALL    OUT_FF
        LD      A,#3C
        CALL    OUT_FF
        LD      A,#D0
        CALL    OUT_1F
        EI 
        HALT 
        HALT 
        HALT 
        DI 
        LD      A,(LASTTRK)
        SRL     A
        CALL    OUT_3F
        RET 
;
READ_1F PUSH    DE
        PUSH HL
        XOR     A
        CALL    OUT_3F
        LD      A,#0A
        CALL    OUT_5F
        LD      D,1
        LD      IX,#3F33
        CALL    EIDOS
        POP     HL
        POP DE
        LD      A,D
        SRL     A
        CALL    OUT_3F
        LD      A,B
        OR      A
        RET 
;
OUT_FF  LD      C,#FF
        JR      OUT_C
OUT_7F  LD      C,#7F
        JR      OUT_C
OUT_5F  LD      C,#5F
        JR      OUT_C
OUT_3F  LD      C,#3F
        JR      OUT_C
OUT_1F  LD      C,#1F
OUT_C   LD      IX,#2A53
EIDOS     PUSH    IX
        JP      #3D2F
;
PAUSE   LD      B,30
        EI 
        HALT 
        DJNZ    $-2
        DI 
        RET 

