
**************************
*
*  JS MDV_ROUTINES  mdv_routines
*
***************************
        
L05000 TST.B   $EE(A6)  * Format mdv-Routine: is mdv actif ?
       BEQ.S   L0500A   * yes
       MOVEQ   #-9,D0   * "in use"
       RTS
       
L0500A MOVE.L  D1,D7
       MOVEA.L A1,A4
       MOVE.L  #1152,D1   * reserved space
       JSR     L02FAE   * MM.ALCHP
       NOP              * !!! to overvome asm - remove it !!!
       BEQ.S   L0501E   * sucess
       RTS              * error out of mem
        
L0501E LEA     $0010(A0),A0 
       MOVEA.L A0,A5
       MOVEQ   #-$01,D0
       MOVE.W  D0,(A0)+
       MOVEQ   #$09,D1
L0502A MOVE.B  #$20,(A0)+
       DBF     D1,L0502A
       MOVE.W  $002E(A6),(A0)   * SV.RND
       SUBA.W  #$000A,A0
       MOVE.W  (A4)+,D1
       ADDQ.W  #5,A4
       SUBQ.W  #5,D1
       CMPI.W  #$000A,D1
       BLS.S   L05048
       MOVEQ   #$0A,D1
L05048 MOVE.B  (A4)+,(A0)+
       SUBQ.W  #1,D1
       BGT.S   L05048
       LEA     $000E(A5),A0
       MOVE.L  #$FD000C10,(A0)+
       ADDQ.W  #6,A0
       MOVE.W  D0,(A0)+
       MOVE.W  #$012A,D1
L05060 MOVE.W  #$AA55,(A0)+
       DBF     D1,L05060
       MOVE.W  #$0F0E,$021A(A5)
       MOVE.W  D7,D1
       LEA     $00018020,A3   * A3 status of 8049
       MOVEQ   #$10,D0
       JSR     L00420
       NOP                    * !!! to conform asm leave it !!!
       ORI.W   #$0700,SR      * interrupts
       JSR     L02C56         * motor on
       NOP                    * !!! to conform asm leave it !!!
       MOVE.L  #$0001E848,D0  * time 3750600 about 0.5 secs
L0508E SUBQ.L  #1,D0
       BNE.S   L0508E
       MOVE.B  #$0A,(A3)
L05096 MOVEA.L A5,A1
       MOVEQ   #$0D,D1
       MOVE.W  #$0479,D0
L0509E DBF     D0,L0509E
       JSR     L051A6(PC)
       MOVE.W  #$0261,D1
       MOVE.W  #$047B,D0
L050AE DBF     D0,L050AE
       JSR     L051A6(PC)
       SUBQ.B  #1,-$026F(A1)
       BCC.S   L05096
       MOVE.B  #$02,(A3)
       CLR.L   -(A7)
       MOVEQ   #$00,D5
L050C4 MOVE.W  #$00FF,D5
L050C8 MOVEA.L A5,A1
       JSR     L0523A(PC)   * read sector header
       BRA.S   L050E6   * error - no synchronisation
       BRA.S   L050E2   * read - error
       JSR     L052A4(PC)  * correct - read more
       BRA.S   L050E2   * error
       ADD.W   D7,D7    * next sector
       SUBQ.B  #1,$00(A1,D7.W)   * adapt sector nr.
       TST.W   D7       * sector 0
       BEQ.S   L050EA   * end verifying
L050E2 DBF     D5,L050C8
L050E6 BRA     L05180   * format failed

L050EA TST.L   D5       * 1. verify
       BLT.S   L050F2   * no
       MOVEQ   #-$01,D5
       BRA.S   L050C4

L050F2 MOVEQ   #$00,D5  * list formatted sectors
L050F4 SUBQ.B  #1,(A1)
       CMPI.B  #$FE,(A1)
       BGT.S   L05108
       BEQ.S   L05100
       ADDQ.W  #1,(A7)
L05100 MOVE.B  D5,$0003(A7)
       MOVE.B  (A1),D4
       MOVEA.L A1,A4
L05108 ADDQ.W  #2,A1
       ADDQ.B  #1,D5
       BCC.S   L050F4
       ST      (A4)
       ADDQ.B  #2,D4
       BEQ.S   L05116
       SUBQ.W  #1,(A7)
L05116 CMPI.W  #$00C8,(A7) * less than 200 sectors?
       BLT.S   L05180      * error 
       LEA     $000E(A5),A1
       MOVEQ   #$00,D0
L05122 CLR.L   (A1)+
       ADDQ.B  #1,D0
       BPL.S   L05122
       LEA     $0270(A5),A1
       MOVE.B  #$F8,(A1)
       MOVE.L  (A7),D1
       ADD.W   D1,D1
       SUBI.W  #$0010,D1
L05138 SUBQ.W  #2,D1
       CMPI.B  #$FD,$00(A1,D1.W)
       BNE.S   L05138
       CLR.B   $00(A1,D1.W)
       MOVE.W  D1,$01FE(A1)
       LSR.W   #1,D1
       MOVE.B  D1,(A7)
       MOVEQ   #$00,D2
       JSR     L05222(PC)   * search sector 0
       BRA.S   L05180       * not found - error
       LEA     $0270(A5),A1
       MOVE.W  (A1),-(A7)
       JSR     L051B0(PC)   * write sector catalogue
       ADDQ.W  #2,A7
       MOVE.B  (A7),D2      * last sector in d2
       JSR     L05222(PC)   * read header
       BRA.S   L05180       * failed
       LEA     $000E(A5),A1 * 
       MOVE.L  #$0040,(A1)
       CLR.W   -(A7)
       JSR     L051B0(PC)   * write errors
       ADDQ.W  #2,A7
       MOVEQ   #$00,D7
       BRA.S   L05182       * no errors o.k

L05180 MOVEQ   #-$0E,D7     * format failed
L05182 JSR     L02C50       * stop motor
       NOP                  * !!! to conform asm - leave it out !!!
       LEA     -$0010(A5),A0
       JSR     L0305E
       NOP                  * !!! to conform asm - leave it out !!!
       JSR     L00452
       NOP                  * !!! to conform asm - leave it out !!
       ANDI.W  #$F0FF,SR
       CLR.B   (A7)
       MOVE.W  (A7)+,D1
       MOVE.W  (A7)+,D2
       MOVE.L  D7,D0
       RTS

L051A6 LEA     L051AC(PC),A4
       BRA.S   L051E4

L051AC MOVEQ   #$0A,D4
       BRA.S   L051DA

L051B0
XL011B0 EQU L051B0-$4000 
       MOVE.B  #$0A,(A3)   * write a sector
       MOVE.W  #$05C9,D0
L051B8 DBF     D0,L051B8
       MOVEA.L A1,A0
       LEA     $0004(A7),A1
       MOVEQ   #$01,D1
       LEA     L051CA(PC),A4
       BRA.S   L051E4

L051CA MOVEA.L A0,A1
       MOVE.W  #$01FF,D1
       MOVEQ   #$05,D5
       LEA     L051D8(PC),A4
       BRA.S   L051F2

L051D8 MOVEQ   #$02,D4
L051DA MOVEQ   #$30,D0
L051DC DBF     D0,L051DC
       MOVE.B  D4,(A3)
       RTS

L051E4 MOVEQ   #$0E,D0   * common mdv write routine
       MOVE.B  D0,(A3)
       MOVE.B  D0,(A3)
       MOVEQ   #$01,D6
       LEA     $0002(A3),A2
       MOVEQ   #$09,D5
L051F2 MOVEQ   #$00,D4
L051F4 BSR.S   L0521A
       SUBQ.B  #1,D5
       BGE.S   L051F4
       MOVEQ   #-$01,D4
       BSR.S   L0521A
       BSR.S   L0521A
       MOVE.W  #$0F0F,D3
       MOVEQ   #$00,D4
L05206 MOVE.B  (A1)+,D4
       ADD.W   D4,D3
       BSR.S   L0521A
       DBF     D1,L05206
       MOVE.W  D3,D4
       BSR.S   L0521A
       LSR.W   #8,D4
       BSR.S   L0521A
       JMP     (A4)

L0521A BTST    D6,(A3)   * test if 8049 busy
       BNE.S   L0521A
       MOVE.B  D4,(A2)
       RTS

L05222 MOVEQ   #$00,D5   * search sector header mdv
L05224 MOVEA.L A5,A1
       BSR.S   L0523A
       RTS              * failed
       BRA.S   L05224   * read-error
       CMP.B   D7,D2    * was selected sector?
       BEQ.S   L05236
       ADDQ.B  #1,D5
       BCC.S   L05224   * til 255 sectors read
       RTS              * normal return adress

L05236 ADDQ.L  #2,(A7)  * return addr. + 2
       RTS

L0523A 
XL0123A EQU L0523A-$4000
       JSR     L05448(PC) * read sector header
       RTS                * failed
       ADDQ.L  #2,(A7)    * correct
       MOVEQ   #$0D,D1
       BSR     L052CE     * read 
       BRA.S   L0525A     * failed
       CMPI.B  #$FF,-$000E(A1) * sector nr. ok
       BNE.S   L0525A
       MOVEQ   #$00,D7
       MOVE.B  -$000D(A1),D7   * return sector nr.
       ADDQ.L  #2,(A7)
L0525A RTS

L0525C 
XL0125C EQU L0525C-$4000
       LEA     L052CE(PC),A0   * read sector (addr. in a0)
       BRA.S   L05266

L05262 
XL01262 EQU L05262-$4000
       LEA     L05354(PC),A0   * verify sector addr. in a0
L05266 JSR     L05448(PC)      * do it
       RTS                     * failed
       MOVE.L  A1,-(A7)
       CLR.W   -(A7)
       MOVEA.L A7,A1
       MOVEQ   #$01,D1
       BSR.S   L052CE   * read header
       BRA.S   L05296   * failed
       MOVE.B  #$02,D1  * ok
       MOVE.B  D1,(A3)  * set timing (8049)
       MOVEQ   #$08,D0  * wait a little
L05280 DBF     D0,L05280
       MOVE.B  D1,(A3)  * again timing
       MOVE.W  #$01FF,D1
       MOVEA.L $0002(A7),A1 * a1= buffer address
       JSR     (A0)   * do it
       BRA.S   L05296   * error
       ADDQ.L  #2,$0006(A7)
L05296 MOVEQ   #$00,D1
       MOVEQ   #$00,D2
       MOVE.B  $0001(A7),D2
       MOVE.B  (A7)+,D1
       ADDQ.W  #4,A7
       RTS

L052A4 JSR     L05448(PC)   * verify formatted sector / read header
       RTS                  * failed
       MOVE.W  #$0261,D1
       BSR     L05354       * read sector
       RTS                  * failed
       ADDQ.L  #2,(A7)
       RTS

L052B8 MOVE.W  #$0100,D0   * initialise parameters
       MOVE.W  #$0F0F,D3   * d0=counter, d3=checksum
       MOVEQ   #$00,D4
       MOVEQ   #$02,D6
       LEA     $0002(A3),A2   * to read track 1
       LEA     $0003(A3),A4   * to read track 2
       RTS

L052CE BSR     L052B8   * read number of bits - initialise
L052D0 BTST    D6,(A3)
       DBNE    D0,L052D0  * till buffer is empty
       EXG      A4,A4     * !!! WHAT'S THAT ??? !!!
       MOVE.B   (A2),D4
       EXG      A4,A2     * !!! REALLY NECESSARY ?? !!!
       MOVE.B   D4,(A1)+
       ADD.W    D4,D3
       TST.W    D0
       BLT      L05446
       MOVEQ    #$14,D0
       SUBQ.W   #1,D1
L052EA BTST     D6,(A3)   * !!! better: DBNE D0,L052EA (as in JM ROM
       BNE.S      L05338  * but set D0 for better reliability to 28)
L052EE BTST     D6,(A3)   * then omit the following code)!!!
       BNE.S      L05338
       BTST     D6,(A3)
       BNE.S      L05338
       BTST     D6,(A3)
       BNE.S      L05338
       BTST     D6,(A3)
       BNE.S      L05338
       BTST     D6,(A3)
       BNE.S      L05338
       BTST     D6,(A3)
       BNE.S      L05338
       BTST     D6,(A3)
       BNE.S      L05338
       BTST     D6,(A3)
       BNE.S      L05338
       BTST     D6,(A3)
       BNE.S      L05338
       BTST     D6,(A3)
       BNE.S      L05338
       BTST     D6,(A3)
       BNE.S      L05338
       BTST     D6,(A3)
       BNE.S      L05338
       BTST     D6,(A3)
       BNE.S      L05338
       BTST     D6,(A3)
       BNE.S      L05338
       BTST     D6,(A3)
       BNE.S      L05338
       BTST     D6,(A3)
       BNE.S      L05338
       BTST     D6,(A3)
       BNE.S      L05338
       BTST     D6,(A3)
       BNE.S      L05338
o05336 MOVEQ   #-1,D0
L05338 NOP
       NOP              * including this line but: - reset label!
       MOVE.B  (A2),D4
       EXG     A4,A2
       MOVE.B  D4,(A1)+
       ADD.W   D4,D3
       TST.W   D0
       BLT     L05446
       MOVEQ   #$14,D0
       SUBQ.W  #1,D1
       BGE.S   L052EA   * try evtl second track
       BRA     L053DE

L05354 BSR     L052B8   * verify reading - initialise
L05358 BTST    D6,(A3)
       DBNE    D0,L05358
       EXG     A4,A4
       MOVE.B  (A2),D4
       EXG     A4,A2
       CMP.B   (A1)+,D4
       BNE     L05446
       ADD.W   D4,D3
       TST.W   D0
       BLT     L05446
       MOVEQ   #$14,D0
       SUBQ.W  #1,D1
L05376 BTST    D6,(A3)   * again wasting ROM space
       BNE.S   L053C4    * !!! replace with dbne d0,L05376 !!!
       BTST    D6,(A3)   * again d0 set to 28
       BNE.S   L053C4
       BTST    D6,(A3)
       BNE.S   L053C4
       BTST    D6,(A3)
       BNE.S   L053C4
       BTST    D6,(A3)
       BNE.S   L053C4
       BTST    D6,(A3)
       BNE.S   L053C4
       BTST    D6,(A3)
       BNE.S   L053C4
       BTST    D6,(A3)
       BNE.S   L053C4
       BTST    D6,(A3)
       BNE.S   L053C4
       BTST    D6,(A3)
       BNE.S   L053C4
       BTST    D6,(A3)
       BNE.S   L053C4
       BTST    D6,(A3)
       BNE.S   L053C4
       BTST    D6,(A3)
       BNE.S   L053C4
       BTST    D6,(A3)
       BNE.S   L053C4
       BTST    D6,(A3)
       BNE.S   L053C4
       BTST    D6,(A3)
       BNE.S   L053C4
       BTST    D6,(A3)
       BNE.S   L053C4
       BTST    D6,(A3)
       BNE.S   L053C4
       BTST    D6,(A3)
       BNE.S   L053C4
       MOVEQ   #-$01,D0
L053C4 NOP
       NOP              * wasting ends here
       MOVE.B  (A2),D4
       EXG     A4,A2
       CMP.B   (A1)+,D4
       BNE.S   L05446
       ADD.W   D4,D3
       TST.W   D0
       BLT     L05446
       MOVEQ   #$14,D0
       SUBQ.W  #1,D1
       BGE.S   L05376
       
L053DE BTST    D6,(A3)  * !!! again as above: dbne d0,L053DE
       BNE.S   L0542C
       BTST    D6,(A3)
       BNE.S   L0542C
       BTST    D6,(A3)
       BNE.S   L0542C
       BTST    D6,(A3)
       BNE.S   L0542C
       BTST    D6,(A3)
       BNE.S   L0542C
       BTST    D6,(A3)
       BNE.S   L0542C
       BTST    D6,(A3)
       BNE.S   L0542C
       BTST    D6,(A3)
       BNE.S   L0542C
       BTST    D6,(A3)
       BNE.S   L0542C
       BTST    D6,(A3)
       BNE.S   L0542C
       BTST    D6,(A3)
       BNE.S   L0542C
       BTST    D6,(A3)
       BNE.S   L0542C
       BTST    D6,(A3)
       BNE.S   L0542C
       BTST    D6,(A3)
       BNE.S   L0542C
       BTST    D6,(A3)
       BNE.S   L0542C
       BTST    D6,(A3)
       BNE.S   L0542C
       BTST    D6,(A3)
       BNE.S   L0542C
       BTST    D6,(A3)
       BNE.S   L0542C
       BTST    D6,(A3)
       BNE.S   L0542C
       MOVEQ   #-$01,D0
L0542C NOP
       NOP

L05430 MOVE.B  (A2),D4
       EXG     A4,A2
       ROR.W   #8,D4
       TST.W   D0       * if too long waited
       BLT.S   L05446   * back
       MOVEQ   #$14,D0  * timer
       ADDQ.W  #1,D1
       BEQ.S   L053DE
       CMP.W   D4,D3    * compare checksum
       BNE.S   L05446   * not equal
       ADDQ.L  #2,(A7)
L05446 RTS

L05448 MOVEQ   #$00,D1   * wait for pulsing interrupts
L0544A SUBQ.W  #1,D1     * 0.38 seconds
       BEQ.S   L05476
       BTST    #$03,(A3) * from 8049
       BEQ.S   L0544A
       MOVEQ   #$00,D1
L05456 SUBQ.W  #1,D1     * wait again 0.38 sec
       BEQ.S   L05476
       MOVEQ   #$17,D0
L0545C BTST    #$03,(A3)
       BNE.S   L05456
       DBF     D0,L0545C
       MOVE.B  #$02,D1
       MOVE.B  D1,(A3)
       MOVEQ   #$08,D0
L0546E DBF     D0,L0546E
       MOVE.B  D1,(A3)
       ADDQ.L  #2,(A7)
L05476 RTS

**************************************************
*                                                *
* End MDV_ROUTINES mdv_routines                  *
*                                                *
**************************************************
