; Fast.Exe: This creates a Ram Buffer version of Aladdin.
;   BSS_F contains a Hunk 901120*NumDisks in length (holds disk images)
;
;                                  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

	Lea	FileNames,A4
	Bsr	LoadWholeFiles

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

	Move.L	#DiskData+$CE400,A0		; Places the trainer menu
	Move.L	#DiskData+$CE400+$B000,A1	; in memory & runs it.
	Lea	$4C000,A2
.Loop:	Move.L	(A0)+,(A2)+
	Cmp.L	A0,A1
	Bne.S	.Loop
	Jsr	$4c020

	Move.L	#DiskData+$400,A0
	Move.L	#DiskData+$400+$1200,A1
	Move.L	#$C0000,A2
.Loop2:	Move.L	(A0)+,(A2)+
	Cmp.L	A0,A1
	Bne.S	.Loop2
	
	Lea	$C0000,A0
	Move.L	#$100000,-4(A0)		; Forces program to think No Fast Ram is available
	Move.W	#$4EF9,$C01C0		; 'JMP' command
	Move.L	#Loader,$C01C2		; Write loader address after JMP command.
	Jmp	$C0000			; Our loader will be JMP'd to every time
					; the game loader is called
					
Loader:	Movem.L	D0-D7/A0-A6,-(Sp)	; When 'Loader' is called the registers
					; are set up as follows:
	Lea	DiskData,A1		;    D1=Start Block
	Cmp.W	#1,D4			;    D2=Length To Read
	Beq.S	.Disk2		     	;    D4=Disk Number
	Cmp.W	#2,D4			;    A0=Address To Load To
	Beq.S	.Disk3
.Continue:
	Mulu	#$200,D1
	Mulu	#$200,d2
	Adda.L	D1,A1
.Loop:	Move.B	(A1)+,(A0)+
	Subq.L	#1,D2
	Bne.S	.Loop

	Movem.L	(Sp)+,D0-D7/A0-A6
	Movem.L	(Sp)+,D2-D7/A0-A6
	Clr.L	d0
	Tst.L	d0
	Rts

.Disk3:	Adda.L	#901120,a1
.Disk2:	Adda.L	#901120,a1
	Bra.S	.continue

; -------------------------------- Main Routines ------------------------

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

LoadWholeFiles:
	Move.L	FILEBUFFER,A2
.AnotherFile:
	Move.L	(A4)+,FileNamePointer
	Tst.L	FileNamePointer
	Beq.S	.NoMoreFiles
	Move.L	A2,LoadDataTo
	Bsr	LoadInFile
	Add.L	#901120,A2
	Bra.S	.AnotherFile
.NoMoreFiles:
	Rts

LoadInFile:
	Move.L	DosBase,A6
	Move.L	FileNamePointer,D1
	Move.L	#1005,D2
	Jsr	Open(A6)
	Move.L	D0,FileBCPL
	Move.L	D0,D1
	Move.L	LoadDataTo,D2
	Move.L	#901120,D3
	Jsr	Read(A6)
	Move.L	FileBCPL,D1
	Jsr	Close(A6)
	Rts

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

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

FilePointers:
Disk1BCPL:Dc.L	0
Disk2BCPL:Dc.L	0
Disk3BCPL:Dc.L	0
Disk4BCPL:Dc.L	0
Disk5BCPL:Dc.L	0
Disk6BCPL:Dc.L	0
Disk7BCPL:Dc.L	0
Disk8BCPL:Dc.L	0
Disk9BCPL:Dc.L	0
Disk10BCPL:Dc.L	0

OldInts:Dc.W	0
OldIntr:Dc.W	0
OldDsk:Dc.W	0
LoadDataTo:Dc.L	0
FILEBUFFER:Dc.L	DiskData

FileNames:
	Dc.L	Disk1Name,Disk2Name,Disk3Name
	Dc.L	0
Disk1Name:Dc.b	'Disk1',0
	Even
Disk2Name:Dc.b	'Disk2',0
	Even
Disk3Name:Dc.b	'Disk3',0
	Even

	Section	"BssData",BSS_F
DiskData:Ds.B	901120*3
