rapid1337.com

Alpha One’s Track loader

2007-06-22 · [ code ] · by staff

init:	move.w	$dff01c,oldintena

<-- Agile File Loader | [ Code ]

[ read in diskmag ]


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:
; ============================================================================

#amiga #cracking #loaders


<-- Agile File Loader | [ Code ] | File-name Loader -->