; The FileLoader Segment,  a0=Pointer to FileName, a1=Memory to Load to
; a2 = MFM Buffer Space ($3400 Bytes please) and d0 = Drive number

; Cannot handle directories or FFS disks!!  Be Done Soon m8s, reshuffled
; by Mr. Spillage

; Code taken out that german-book.

	Opt	c-
	Section	"File Loader",Code_c
	
	IncDir	Df1:

Start	Movem.l	d0-d7/a0-a6,-(sp) 
	Bsr	ResetAll

	Moveq	#0,d7
	Lea	CommPnt(pc),a6
	Move.l	a0,0(a6)
NameLen	Add.b	#1,d7
	Cmpi.b	#0,(a0)+
	Bne	NameLen
	Move.l	d7,4(a6)

	Lea	MFMPoint(pc),a6
	Lea	FileAdd(pc),a5
	Move.l	a1,0(a5)	
	Move.l	a2,0(a6)
	Move.w	d0,4(a6)	

	Add.w	d0,d0
	Lea	Set0Track0(pc),a6
	Tst.w	(a6,d0.w)
	Bne	ZeroSet

SetTrack0	Moveq	#0,d0
	Lea	DriveNumber(pc),a6
	Move.w	(a6),d1
	Bsr	DTrack+$20
	Lea	DriveNumber(pc),a6
	Move.w	(a6),d0
	Add.w	d0,d0	
	Lea	Set0Track0(pc),a6
	St	(a6,d0.w)

ZeroSet	Lea	CommPnt(pc),a6
	Sub.l	#1,4(a6)
	Move.l	0(a6),a0
	Move.l	4(a6),d0
	Moveq	#0,d2
	Move.l	d0,d1
	Subq	#1,d1
	
HashLoop	Mulu	#13,d0
	Move.b	(a0)+,d2
	Bsr	Upper
	Add.w	d2,d0
	And.w	#$7ff,d0
	Dbf	d1,HashLoop
	
	Divu	#72,d0
	Swap	d0
	Addq	#6,d0
	Lea	Hash(pc),a6
	Move.w	d0,(a6)
	
	Move.l	#880,d0
	Bsr	LoadSec
	
	Move.l	MFMPoint(pc),a0
	Moveq	#0,d0
	Move.w	Hash(pc),d0
	Lsl.w	#2,d0
	Move.l	0(a0,d0),d0
	Tst.l	d0
	Beq	None
	
LoadLoop	Lea	Sector(pc),a6
	Move.l	d0,(a6)
	Bsr	LoadSec
	
	Move.l	CommPnt(pc),a0
	Move.l	MFMPoint(pc),a1
	Add.l	#432,a1
	Move.l	CommLen(pc),d0
	Cmp.b	(a1)+,d0
	Bne	NextSec
	Subq	#1,d0
	
NameLoop	Move.b	(a1)+,d2
	Bsr	Upper
	Move.w	d2,d1
	Move.b	(a0)+,d2
	Bsr	Upper
	Cmp.b	d1,d2
	Bne	NextSec
	Dbf	d0,NameLoop
	Bra	SectorOK
	
NextSec	Move.l	MFMPoint(pc),a6
	Move.l	496(a6),d0
	Tst.l	d0
	Bne	LoadLoop

	Moveq	#3,d0
	Lea	DriveNumber(pc),a6
	Move.w	(a6),d1
	Bsr	DTrack+$20
	
None	Bra	Quit
	
SectorOK	Move.l	MFMPoint(pc),a6
	Cmp.l	#2,508(a6)
	Bne	NoDir
	Bra	Quit
	
NoDir	Bra	SecLoop1
	
SecLoop	
SecLoop1	Lea	SectorHead(pc),a6
	Tst	(a6)
	Bne	CopySect
	St	(a6)
	Bra	GetHeader
CopySect	Move.l	MFMPoint(pc),a6
	Move.l	12(a6),d7
	Lea	FileAdd(pc),a6
	Move.l	(a6),a4
	Add.l	d7,(a6)
	Subq	#1,d7
	Move.l	MFMPoint(pc),a5
	Add.l	#$18,a5
CopSec	Move.b	(a5)+,(a4)+
	Dbf	d7,CopSec
JustLoad	Move.l	MFMPoint(pc),a6
	Move.l	16(a6),d0
	Tst.l	d0
	Beq	Quit
	Lea	Sector(pc),a6
	Move.l	d0,(a6)
	Bsr	LoadSec
	Bra	SecLoop
	
GetHeader	Move.l	MFMPoint(pc),a6
	Move.l	81*4(a6),d0
	Lea	FileLength(pc),a6
	Move.l	d0,(a6)
	Bra	JustLoad
	
Quit	Movem.l	(sp)+,d0-d7/a0-a6 
	Moveq	#0,d0	  
	Rts
			
LoadSec	Movem.l	d0-d7/a0-a6,-(sp)
	Lea	SectorLoad(pc),a6
	Move.w	d0,(a6)
	Moveq	#1,d0
	Lea	DriveNumber(pc),a6
	Move.w	(a6),d1
	Bsr	DTrack+$20
	Moveq	#2,d0
	Move.w	SectorLoad(pc),d1
	Move.l	MFMPoint(pc),a0
	Move.l	a0,a1
	Add.l	#$200,a1
	Bsr	DTrack+$20
	Movem.l	(sp)+,d0-d7/a0-a6
	Rts	
	
Upper	Cmp.b	#"a",d2
	Blo	UpperX
	Cmp.b	#"z",d2
	Bhi	UpperX
	Sub.w	#$20,d2
	
UpperX	Rts

ResetAll	Lea	Sector(pc),a6
	Move.l	#0,(a6)+
	Move.w	#0,(a6)+
	Move.l	#0,(a6)+
	Move.l	#0,(a6)+
	Lea	SectorLoad(pc),a6
	Move.w	#0,0(a6)
	Move.w	#0,6(a6)
	Move.l	#0,8(a6)
	Rts
	

MFMPoint	Dc.l	0
DriveNumber	Dc.w	0
Set0Track0	Dc.w	0
Set0Track1	Dc.w	0
Set0Track2	Dc.w	0
Set0Track3	Dc.w	0
SectorLoad	Dc.w	0
FileAdd	Dc.l	$d0000
SectorHead	Dc.w	0
FileLength	Dc.l	0

Sector	Dc.l	0
Hash	Dc.w	0
CommPnt	Dc.l	0
CommLen	Dc.l	0

DTrack	Incbin	MyMateMarmite/DTrakkerFINAL-Seg









