▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ░▒▓█ rapid1337.com █▓▒░ ╓──────────────────────────────────────────╖ ║ Alpha One’s Track loader ║ ╟──────────────────────────────────────────╢ ║ init: move.w $dff01c,oldintena ║ ╟──────────────────────────────────────────╢ ║ ·· code/alpha-ones-track-loader.html ·· ║ ╙──────────────────────────────────────────╜ ============================================================================ Title ..: Alpha One’s Track loader Author .: staff Date ...: 2007-06-22 Section : Code ============================================================================ ``` init: move.w $dff01c,oldintena move.w $dff01e,oldintreq bset #7,oldintena bset #7,oldintreq move.w #$7fff,$dff09a ; interrupts aus. move.w #$7fff,$dff09c ; ;**************************************************************** lea $dff000,a6 lea buffer(pc),a0 lea mfmbuffer,a2 move.l #5*$1600,d0 move.l #0,d1 move.l #$0,d2 jsr trackloader ;**************************************************************** move.w oldintena(pc),$dff09a move.w oldintreq(pc),$dff09c moveq #0,d0 rts oldintena: dc.w 0 oldintreq: dc.w 0 buffer: blk.b 130000,0 mfmbuffer: blk.w 6400,0 ; ============================================================================ ; HARDWARE-DISKLOADER (c) ALPHA ONE 2005. ; *************************************** ; IMPROVED TO READ FROM ODD BYTEPOSITIONS. ; PRO VERSION -> WITH TRACKCOUNTER. ; IN: A6=$DFF000 ; A2=MFMBUFFER.L ; A0=BUFFER.L ; D0=LENGTH.L ; D1=TRACKNR.L ; D2=BYTEOFFSET.L TRACKLOADER: LEA $BFD100,A4 ; DRIVESELECT REGISTER LEA $BFE001,A5 ; DRIVESTATUS REGISTER LEA CURRENTTRACK(PC),A3 ; HOLDS THE ACTUAL TRACKPOS MOVEQ #0,D7 ; D7 = BYTECOUNTER ADD.L D2,D0 ; BYTES TO READ + BYTEOFFSET MOVE.L D0,D3 DIVS.W #$1600,D3 MOVE.B D3,1(A3) MOVE.B #$7D,(A4) ; SWITCH MOTOR DRIVE 0 ON NOP ; ======================= NOP MOVE.B #$75,(A4) BSR.W DELAY BSR.W DISKREADY CMP.B #$FF,(A3) BNE.B MOVETOCYLINDER MOVE.B #0,(A3) BSET #1,(A4) ; CHOSE DIRECTION TOWARDS 0 MOVETOZERO: BTST #4,(A5) ; HEAD ON CYLINDER 0? BEQ.B MOVETOCYLINDER BSR.W MOVEHEAD ; MOVE HEAD + DELAY BRA.B MOVETOZERO MOVETOCYLINDER: BSET #2,(A4) ; CHOOSE HEAD HIGH BTST #0,D1 ; EVEN OR ODD TRACK? BEQ.B HEADOK ; TRACK IS EVEN – ALRIGHT! BCLR #2,(A4) ; CHOOSE HEAD LOW HEADOK: MOVEQ #0,D3 MOVEQ #0,D5 MOVE.B D1,D3 ; NEW TRACKNUM -> D3 MOVE.B (A3),D5 ; CURRENT TRACK -> D5 MOVE.B D1,(A3) ; REPLACE CURRENT TRACK LSR.W #1,D3 ; GET CYLINDER NUM NEW TRACK LSR.W #1,D5 ; GET CYLINDER NUM CUR TRACK SUB.W D3,D5 BEQ.B READTRACK BMI.B OTHERDIRECTION BSET #1,(A4) ; CHOOSE DIRECTION TOWARDS 0 BRA.B CHOSEN OTHERDIRECTION: BCLR #1,(A4) ; CHOOSE DIRECTION OUTWARDS 0 NEG.W D5 CHOSEN: BSR.W MOVEHEAD SUBQ.B #1,D5 BNE.B CHOSEN READTRACK: BSR.W DISKREADY ; EINEN TRACK LESEN MOVE.W #$8210,$96(A6) ; ================= MOVE.W #$7F00,$9E(A6) MOVE.W #$8500,$9E(A6) MOVE.W #$4489,$7E(A6) MOVE.W #$4000,$24(A6) MOVE.L A2,$20(A6) MOVE.W #$9900,$24(A6) MOVE.W #$9900,$24(A6) MOVE.W #$2,$9C(A6) TRACKREADY: BTST #1,$DFF01F BEQ.B TRACKREADY MOVE.W #$4000,$24(A6) MOVEQ #0,D5 ; DECODE TRACK DECODE: MOVE.L A2,A1 ; ============ MOVE.L #$55555555,D4 FINDSYNC: CMP.W #$4489,(A1)+ BNE.B FINDSYNC CMP.W #$4489,(A1) BEQ.B FINDSYNC MOVE.L (A1),D3 MOVE.L 4(A1),D1 AND.L D4,D3 AND.L D4,D1 ASL.L #1,D3 OR.L D1,D3 ROR.L #8,D3 CMP.B D5,D3 BEQ.B SECTORFOUND ADD.L #1086,A1 BRA.B FINDSYNC SECTORFOUND: ADD.L #56,A1 MOVE.L #(512/4)-1,D6 DECODESECTOR: MOVE.L 512(A1),D1 MOVE.L (A1)+,D3 AND.L D4,D3 AND.L D4,D1 ASL.L #1,D3 OR.L D1,D3 LEA STORE(PC),A3 MOVE.L D3,(A3) MOVEQ #4-1,D3 LOOP: CMP.L D7,D0 BEQ.B READREADY CMP.L D7,D2 BGT.B BELOW MOVE.B (A3),(A0)+ BELOW: ADDQ.L #1,A3 ADDQ.L #1,D7 DBF D3,LOOP DBF D6,DECODESECTOR ADDQ.B #1,D5 CMP.B #11,D5 BNE.B DECODE TRACKDONE: CMP.L D7,D0 ; TRACK DONE, GET ONTO NEXT. BEQ.B READREADY ; ========================== BTST #2,(A4) BEQ.B ONTONEXT BCLR #2,(A4) BSR.W DELAY BRA.W READTRACK ONTONEXT: BSET #2,(A4) BSR.W DELAY BCLR #1,(A4) BSR.W MOVEHEAD BRA.W READTRACK READREADY: MOVE.B #$FD,(A4) ; SWITCH MOTOR DRIVE 0 OFF NOP ; ======================== NOP MOVE.B #$E7,(A4) LEA CURRENTTRACK(PC),A3 MOVE.B 1(A3),D0 ADD.B D0,(A3) RTS DELAY: CLR.B $300(A4) ; DELAY ROUTINE MOVE.B #$19,$400(A4) ; ============= MOVE.B #$1,$D00(A4) WAIT: BTST #0,$C00(A4) BEQ.B WAIT BCLR #0,$D00(A4) RTS DISKREADY: BTST #5,(A5) ; WAIT FOR DISK-READY BNE.B DISKREADY ; =================== RTS MOVEHEAD: BCLR #0,(A4) BSR.W DELAY BSET #0,(A4) BSR.W DELAY RTS CURRENTTRACK: DC.B $FF,0 STORE: DC.L 0 TRACKLOADERENDE: ; ============================================================================ ``` ---------------------------------------------------------------------------- -- rapid1337.com -- The dumping ground for all things tech // knowledge is the weapon --