;------------------------------

org &8000:limit &8250     ;Can be anywhere
nolist

;------------------------------

;Direct sector read routine (no ROMS anywhere mate !)
;Stolen from Rainbow Islands (sshhhh!)

;Use like normal RST3 readsect
;HL=buffer,C=sector,D=track

;Call "motors_on" before attempting to read a sector, and turn them off after
;all reading is finished

;------------------------------

.readsect:

        DI    
        LD    A,D
        LD    (L7125),A
        LD    (L712E),A
        ld a,c
        LD    (L7130),A
        LD    (L7132),A
        LD    (L70A2+1),HL
        LD    B,&00

L7078:  PUSH  BC
        LD    DE,L7128
        CALL  L70B3
        POP   BC
        AND   A
        DEC   B
        RET   Z
        LD    A,(L7119)
        OR    A
        JR    NZ,L7078

        LD    DE,L7122
        CALL  L70AA

L708F:  LD    DE,L7126
        CALL  L70B3
        LD    HL,L7119
        BIT   5,(HL)
        JR    Z,L708F

        LD    DE,L7128
        CALL  L70B3
L70A2:  ld hl,0           ;Start address (self-modified)
        LD    DE,L712B
        JR    L70B8

L70AA:  CALL  L70EC

L70AD:  IN    A,(C)
        JP    P,L70AD
        RET   

L70B3:  CALL  L70EC
        JR    L70CB

L70B8:  CALL  L70EC
        JR    L70C3

L70BD:  INC   C
        IN    A,(C)
        LD    (HL),A
        DEC   C
        INC   HL
L70C3:  IN    A,(C)
        JP    P,L70C3
        AND   D
        JR    NZ,L70BD

L70CB:  LD    HL,L7119
L70CE:  IN    A,(C)
        CP    &C0
        JR    C,L70CE
        INC   C
        IN    A,(C)
        LD    (HL),A
        DEC   C
        INC   HL
        LD    A,&05
L70DC:  DEC   A
        JR    NZ,L70DC
        IN    A,(C)
        AND   E
        JR    NZ,L70CE
        LD    A,(L711A)
        AND   &04
        RET   NZ
        SCF   
        RET   

L70EC:  LD    A,(DE)
        LD    B,A
        INC   DE
L70EF:  PUSH  BC
        LD    A,(DE)
        INC   DE
        CALL  L70FF
        POP   BC
        DJNZ  L70EF
        LD    BC,&FB7E
        LD    DE,&2010
        RET   

L70FF:  LD    BC,&FB7E
        PUSH  AF
L7103:  IN    A,(C)
        ADD   A,A
        JR    NC,L7103
        ADD   A,A
        JR    NC,L710D
        POP   AF
        RET   

L710D:  POP   AF
        INC   C
        OUT   (C),A
        DEC   C
        LD    A,&05
L7114:  DEC   A
        NOP   
        JR    NZ,L7114
        RET   

;------------------------------

.motors_on
ld bc,&fa7e
ld a,1
out (c),a
.mon_loop
dec bc
ld a,b
or c
jr nz,mon_loop
ret

.motors_off
ld bc,&fa7e
xor a
out (c),a
ret

;------------------------------

L7119:  defb &40
L711A:  defb &80

        defb 0,&1B,0,&47,2,0,0

L7122:  defb 3,&F,0
L7125:  defb &1B
L7126:  defb 1

        defb 8
L7128:  defb 2
        defb &4A,0

L712B:  defb 9
        defb &46,0

L712E:  defb &1B

        defb 0

L7130:  defb &47
        defb 2
L7132:  defb &47

        defb &2A,&FF,&21,0,&98,&11,0,&73,&D9,1,0,&25,&D9

;------------------------------
