; File.Exe.S: Source for loading files.
;
;                                   Mars Bar

	Section	"LoaderCode",Code_F
	Opt	C-

Execbase	=	4
OpenLibrary	=	-408
CloseLibrary	=	-414

Open		=	-30
Close		=	-36
Seek		=	-66
Read		=	-42

Start:	Bsr	OpenDos
	Bsr	SaveProperVbase

; ----------------------------------------- Start Of Patching -----------

; Before calling 'LoadFile', D4=Address Of FileName
;			     D3=Address To Load To
; Length of loaded file will be returned in LengthRead.

; ----- End Of Patching -------------------------------------------------

OpenDos:Move.L	ExecBase,A6
	Lea	Dosname,A1
	Moveq.L	#0,D0
	Jsr	OpenLibrary(A6)
	Move.L	D0,DosBase
	Rts

OpenFile:Move.L	DosBase,A6
	Move.L	FileNamePointer,D1
	Move.L	#1005,D2
	Jsr	Open(A6)
	Move.L	D0,FileBcpl
	Rts

SaveProperVbase:
	Movem.L	D0/A0-A1,-(Sp)
	Lea	$0.L,A0
	Lea	VBasePropDat,A1
	Move.L	#$BF,D0
.Loop:	Move.B	(A0)+,(A1)+
	Dbra.W	D0,.Loop
	Movem.L	(Sp)+,D0/A0-A1
	Rts

RestoreProperVBase:
	Movem.L	D0/A0-A1,-(Sp)
	Lea	$0.L,A0
	Lea	VbasePropDat,A1
	Move.L	#$BF,D0
.Loop:	Move.B	(A1)+,(A0)+
	Dbra.W	D0,.Loop
	Movem.L	(Sp)+,D0/A0-A1
	Rts

SaveCurrentVbase:
	Movem.L	D0/A0-A1,-(Sp)
	Lea	$0.L,A0
	Lea	VbasePresDat,A1
	Move.L	#$BF,D0
.Loop:	Move.B	(A0)+,(A1)+
	Dbra.W	D0,.Loop
	Movem.L	(Sp)+,D0/A0-A1
	Rts

RestoreCurrentVbase:
	Movem.L	D0/A0-A1,-(Sp)
	Lea	$0.L,A0
	Lea	VbasePresDat,A1
	Move.L	#$BF,D0
.Loop:	Move.B	(A1)+,(A0)+
	Dbra.W	D0,.Loop
	Movem.L	(Sp)+,D0/A0-A1
	Rts

LoadFile:
					; A3 = Address to load to
					; D4 = Address of filename
	Movem.L	D0-D7/A0-A6,-(Sp)
	Move.L	D4,FileNamePointer
	Move.L	A3,FileAddy

	Move.W	$Dff01C,OldInts
	Move.W	$Dff01E,OldIntr
	Or.W	#$8000,OldInts
	Or.W	#$8000,OldIntr
	Move.W	#$7FFF,$Dff09A
	Move.W	#$7FFF,$DFF09C

	Bsr	SaveCurrentVbase
	Bsr	RestoreProperVBase
	Move.W	#$C008,$Dff09A

	Bsr	OpenFile

	Move.L	FileBCPL,D1
	Move.L	FileAddy,D2
	move.L	#1000000,D3
	Jsr	Read(A6)
	Move.L	D0,LengthRead		; Save length of file read
	Bsr	CloseFile

	Move.W	#$7FFF,$Dff09a
	Move.W	#$7FFF,$Dff09c
	Bsr	RestoreCurrentVbase
	Move.W	OldInts,$Dff09A
	Move.W	OldIntr,$Dff09C

	Movem.L	(Sp)+,D0-D7/A0-A6
	Rts

CloseFile:
	Move.L	DosBase,A6
	Move.L	FileBCPL,D1
	Jsr	Close(A6)
	Rts

FileAddy:Dc.L	0
DosName:Dc.B	'dos.library',0
	Even
DosBase:Dc.L	0

FileNamePointer:Dc.L	0
FileBCPL:	Dc.L	0

FilePointers:
Disk1BCPL:Dc.L	0

OldInts:Dc.W	0
OldIntr:Dc.W	0
OldDsk:Dc.W	0
LengthRead:Dc.L	0

FileNames:
	Dc.L	Disk1Name
	Dc.L	0
Disk1Name:Dc.b	'AFileName',0
	Even

	Section	"BssData",BSS_F
VBasePropDat:Ds.b	$C0
VBasePresDat:Ds.b	$C0
