
**************************
*
* JM2 MDV-ROUTINES EXCEPT THAT D0=28 INSTEAD OF 14
*
***************************

* TRAP 2, D0=3        
L05000 TST.B   $EE(A6)  * Format mdv-Routine: is mdv actif ?
       BEQ.S   L0500A   * yes
       MOVEQ   #-9,D0   * "in use"
       RTS

* OPEN CHANNEL FOR FORMATTING       
L0500A MOVE.L  D1,D7    * SAVE VALUE OF D1 UND A1
       MOVEA.L A1,A4
       MOVE.L  #1152,D1 * reserved space
       JSR     L02FAE   * MM.ALCHP
       BEQ.S   L0501E   * sucess
       RTS              * error out of mem
        
L0501E LEA     $0010(A0),A0   * A0 / A5: BASISADR. FOR FORMATTING
       MOVEA.L A0,A5
       MOVEQ   #-$01,D0
       MOVE.W  D0,(A0)+       
       MOVEQ   #$09,D1
L0502A MOVE.B  #$20,(A0)+     * RESERVE 10*SPACE FOR NAME
       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
* NOW TRANSFER NAME AND SHORTEN TO MAXIMUM LENGHT 
       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)+  * FORMAT PARAM.
       ADDQ.W  #6,A0
       MOVE.W  D0,(A0)+
       MOVE.W  #$012A,D1         * LOOP-COUNTER
L05060 MOVE.W  #$AA55,(A0)+      * FORMAT VALUE
       DBF     D1,L05060
       MOVE.W  #$0F0E,$021A(A5)  * END SECTOR VALUE
       MOVE.W  D7,D1
       LEA     $00018020,A3   * A3 status of 8049
       MOVEQ   #$10,D0        * LOOP-COUNTER FOR TRANSMISSION
       JSR     L00420
       ORI.W   #$0700,SR      * interrupts
       JSR     L02C56         * motor on
       MOVE.L  #$0001E848,D0  * COUNTER:  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)     * WRITE SECTOR-HEAD
       SUBQ.B  #1,-$026F(A1)  * ONE SECTOR LESS
       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) * IS SECTOR CORRECT FORMATTED?
       BGT.S   L05108    * YES BUT NOT SUCCESSFUL
       BEQ.S   L05100    * NO
       ADDQ.W  #1,(A7)   * ADD 1 TO SECTOR-COUNTER
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    * CONTINUE TILL CARRY = 255 SECTORS
       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  * ADRESSE OF SECTOR-LIST
       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
       LEA     -$0010(A5),A0
       JSR     L0305E
       JSR     L00452
       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  * ADDR OF WRITING TO SECTOR
       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       * A0= ADRESSE OF BUFFER
       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)   * A3 = 8049
       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 mdvsector header - d5 counts sectors
L05224 MOVEA.L A5,A1
       BSR.S   L0523A    * do it
       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     A2,A4
       MOVE.B  (A2),D4
       MOVE.B  D4,(A1)+
       ADD.W   D4,D3
       TST.W   D0
       BLT     L05446
       MOVEQ   #$28,D0  * !!! VALUE CHANGED
       SUBQ.W  #1,D1
       BGE.S   L052D0   * try evtl second track
       BRA     L05376

L05354 BSR     L052B8   * verify reading - initialise
L05358 BTST    D6,(A3)
       DBNE    D0,L05358
       EXG     A2,A4
       MOVE.B  (A2),D4
       CMP.B   (A1)+,D4
       BNE     L05446
       ADD.W   D4,D3
       TST.W   D0
       BLT     L05446
       MOVEQ   #$28,D0   * !!! VALUE CHANGED
       SUBQ.W  #1,D1
       BGE     L05358
L05376 BTST    D6,(A3)
       DBNE    L05376 
       EXG     A4,A2
       MOVE.B  (A2),D4 
       ROR.W   #8,D4
       TST.W   D0       * if too long waited
       BLT.S   L05446   * back
       MOVEQ   #$28,D0  * !!! VALUE CHANGED
       ADDQ.W  #1,D1
       BEQ.S   L05376
       CMP.W   D4,D3    * compare checksum
       BNE.S   L05446   * not equal - BACK
       ADDQ.L  #2,(A7)
L05446 RTS

*  adapted from AA94 ff in  JM
*  with one differnce: IN JM is AAB6 : send two times 
*  D1 to (A3)=8049 In JS this is done 1 + 9 times
*  here you have the shortened form of JS

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   #$14,D0
L0545C BTST    #$03,(A3)
       BNE.S   L05456
       DBF     D0,L0545C
       MOVE.B  #$02,D1
       MOVEQ   #$09,D0
L0546E DBF     D0,L0546E
       MOVE.B  D1,(A3)
       ADDQ.L  #2,(A7)
L05476 RTS

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