;----Object/Load File Loader-------------
;----(C) By A.C.G Enterprises 1987-------
;----N E V E R   S P R E A D !!!!!-------
;
;----EXEC.Library Offsets----------------
OldOpenLibrary:		equ	-408
CLoseLibrary:		equ	-414
Permit:			equ	-138
Forbid:			equ	-132
AllocMem:		equ	-198
FreeMem:		equ	-210
ExecBase:		equ	$0004
;----DOS.Library Offsets-----------------
Open:			equ	-30
Close:			equ	-36
Read:			equ	-42
Write:			equ	-48
OutPut:			equ	-60
;----Start it Up !!!---------------------
Start:	move.l	ExecBase,a6
	jsr	Forbid(a6)
	lea	DosName(pc),a1
	jsr	OldOpenLibrary(a6)
	tst.l	d0
	beq.L	Error
	lea	Table(pc),a0
	lea	Errtxt1(pc),a1
	move.l	a1,(a0)
	lea	ErrTxt2(pc),a1
	move.l	a1,$0004(a0)
	lea	ErrTxt3(pc),a1
	move.l	a1,$0008(a0)
	lea	DosBase(pc),a0
	move.l	d0,(a0)
	move.l	d0,a6
	lea	FileName(pc),a0
	move.l	a0,d1
	move.l	#$03ed,d2
	jsr	Open(a6)
	tst.l	d0
	beq.L	Error
	lea	File(pc),a0
	move.l	d0,(a0)
	move.l	d0,d1
	lea	Ram(pc),a0
	move.l	a0,d2
	move.l	#$0008,d3
	jsr	Read(a6)
	lea	Ram(pc),a0
	cmp.l	#$03f3,(a0)
	beq.s	Ok1
	lea	ErrorNr(pc),a0
	move.l	#$0001,(a0)
	bra.L	Error
Ok1:	tst.l	$0004(a0)
	beq.s	Ok2
	lea	ErrorNr(pc),a0
	move.l	#$0001,(a0)
	bra.L	Error
Ok2:	move.l	File(pc),d1
	lea	Ram(pc),a0
	move.l	a0,d2
	move.l	#$000c,d3
	jsr	Read(a6)
	lea	Ram(pc),a0
	lea	HunkNr(pc),a1
	move.l	(a0),(a1)
	move.l	$0008(a0),d7
	sub.l	$0004(a0),d7
	addq.l	#$0001,d7
	move.l	d7,d0
	lea	TableSize(pc),a0
	and.l	#$0ffffffff,d0
	move.l	d0,(a0)
	addq.l	#$0001,d0
	asl.l	#$0002,d0
	move.l	#$10000,d1
	move.l	ExecBase,a6
	jsr	AllocMem(a6)
	tst.l	d0
	bne.s	Ok6
	lea	ErrorNr(pc),a0
	move.l	#$0002,(a0)
	bra.L	Error
Ok6:	lea	AllocPos(pc),a0
	move.l	d0,(a0)
	move.l	TableSize(pc),d0
	addq.l	#$0001,d0
	asl.l	#$0002,d0
	move.l	#$10000,d1
	move.l	ExecBase,a6
	jsr	AllocMem(a6)
	tst.l	d0
	bne.s	Ok3
	lea	ErrorNr(pc),a0
	move.l	#$0002,(a0)
	bra.L	Error
Ok3:	lea	TablePos(pc),a0
	move.l	d0,(a0)
	move.l	DosBase(pc),a6
	move.l	File(pc),d1
	move.l	d0,d2
	move.l	TableSize(pc),d3
	asl.l	#$0002,d3
	jsr	Read(a6)
	move.l	TablePos(pc),a0
	move.l	(a0),d0
	asl.l	#2,d0
	sub.l	d0,zeiger
	lea	CurrentNum(pc),a0
	clr.l	(a0)
AllocL1:bsr.L	Alloc
	lea	CurrentNum(pc),a0
	addq.l	#$0001,(a0)
	move.l	TableSize(pc),d0
	cmp.l	(a0),d0
	bhi.s	AllocL1
	clr.l	(a0)
MainL:	bsr.L	Read4By
	lea	Ram(pc),a0
	cmp.l	#$03e9,(a0)	; Hunk_Code
	beq.s	LoadIt1
	cmp.l	#$03ea,(a0)	; Hunk_Data
	beq.s	LoadIt1
	cmp.l	#$03eb,(a0)	; Hunk_Bss
	beq.s	InitBss		
	cmp.l	#$03ec,(a0)	; Hunk_Reloc32
	beq.s	DoReloc
	cmp.l	#$03f2,(a0)	; Hunk_End
	beq.L	Loaded
	lea	ErrorNr(pc),a0
	move.l	#$0001,(a0)	
	bra.L	Error
InitBss:bsr.L	Read4By
	bra.L	Continu	
LoadIt1:bsr.L	Read4By
	lea	Ram(pc),a0
	move.l	(a0),d3
	asl.l	#$0002,d3
	move.l	CurrentNum(pc),d2
	asl.l	#$0002,d2
	move.l	AllocPos(pc),a0
	move.l	(a0,d2.L),d2
	move.l	File(pc),d1
	jsr	Read(a6)
	bra.L	Continu
DoReloc:bsr.L	Read4By
	lea	Ram(pc),a0
	tst.l	(a0)
	beq.s	EndRel
	lea	Anzahl(pc),a1
	move.l	(a0),(a1)
	bsr.L	Read4By
	lea	Ram(pc),a0
	move.l	(a0),d0
	asl.l	#$0002,d0
	move.l	AllocPos(pc),a0
	move.l	(a0,d0.L),d0
	lea	SpecifiedHunk(pc),a1
	move.l	d0,(a1)
	move.l	CurrentNum(pc),d1
	subq.l	#$0001,d1
	asl.l	#$0002,d1
	move.l	(a0,d1.L),a0
	lea	Address(pc),a1
	move.l	a0,(a1)
SubLoop:bsr.L	Read4By
	lea	Ram(pc),a0
	move.l	(a0),d0
	add.l	Address(pc),d0
	move.l	d0,a1
	move.l	(a1),a0
	add.l	SpecifiedHunk(pc),a0
	move.l	a0,(a1)
	lea	Anzahl(pc),a0
	subq.l	#$0001,(a0)
	bne.s	SubLoop
	bra.s	DoReloc
EndRel:	bra.L	MainL
Continu:lea	CurrentNum(pc),a0
	addq.l	#$0001,(a0)
	bra.L	MainL
Read4By:move.l	File(pc),d1
	lea	Ram(pc),a0
	move.l	a0,d2
	moveq	#$0004,d3
	move.l	DosBase(pc),a6
	jsr	Read(a6)
	rts
Alloc:	lea	CurrentNum(pc),a0
	move.l	(a0),d0
	asl.l	#$0002,d0
	move.l	TablePos(pc),a0
	move.l	(a0,d0.L),d0
	and.l	#$0fffffff,d0
	asl.l	#$0002,d0
	tst.l	d0
	bne.s	DoAlloc
	move.l	#4000,d0

DoAlloc:move.l	zeiger,a0
	add.l	d0,a0
	move.l	a0,zeiger
	move.l	a0,d0
	move.l	CurrentNum(pc),d1
	asl.l	#$0002,d1
	move.l	AllocPos(pc),a0
	move.l	d0,(a0,d1.L)
	rts
Loaded:	move.l	CurrentNum(pc),d0
	move.l	TableSize(pc),d1
	cmp.l	d0,d1
	bne.L	MainL
	move.l	ExecBase,a6
	jsr	Permit(a6)
	move.l	AllocPos(pc),a0
	move.l	(a0),a0
	rts
	jsr	(a0)
Error:	lea	ErrorNr(pc),a0
	tst.l	(a0)
	beq.s	Exita
	move.l	(a0),d0
	subq.l	#$0001,d0
	asl.l	#$0002,d0
	lea	Table(pc),a0
	move.l	(a0,d0.L),a0
	bsr.L	PrtErr
Exita:	lea	File(pc),a0
	tst.l	(a0)
	bne.s	Exit0
	lea	ErrTxt0(pc),a0
	bsr.L	PrtErr
	bra.s	Exit1
Exit0:	lea	File(pc),a0
	move.l	(a0),d1
	move.l	DosBase(pc),a6
	jsr	Close(a6)
Exit1:	lea	DosBase(pc),a0
	tst.l	(a0)
	beq.s	Exit
	move.l	(a0),a1
	move.l	ExecBase,a6
	jsr	CloseLibrary(a6)
Exit:	lea	AllocPos(pc),a0
	tst.l	(a0)
	beq.L	ExitD
	clr.l	d7
	move.l	(a0),a1
	move.l	TablePos(pc),a0
ExitDL1:movem.l	a0/a1/d7,-(SP)
	move.l	d7,d6
	asl.l	#$0002,d6
	tst.l	(a1,d6.L)
	beq.s	NoMore
	move.l	(a1,d6.L),a1
	move.l	(a0,d6.L),d0
	asl.l	#$0002,d0
	move.l	ExecBase,a6
	jsr	FreeMem(a6)
	movem.l	(SP)+,a0/a1/d7
	addq.l	#$0001,d7
	lea	TableSize(pc),a0
	move.l	(a0),d0
	subq.l	#$0001,d0
	cmp.l	d0,d7
	bne.s	ExitDL1
	bra.s	ExitD
NoMore:	movem.l	(SP)+,a0/a1/d7
ExitD:	lea	AllocPos(pc),a0
	tst.l	(a0)
	beq.s	ExitC
	move.l	(a0),a1
	move.l	TableSize(pc),d0
	addq.l	#$0001,d0
	asl.l	#$0002,d0
	move.l	ExecBase,a6
	jsr	FreeMem(a6)
ExitC:	lea	TablePos(pc),a0
	tst.l	(a0)
	beq.s	Exitb
	move.l	(a0),a1
	move.l	TableSize(pc),d0
	addq.l	#$0001,d0
	asl.l	#$0002,d0
	move.l	ExecBase,a6
	jsr	FreeMem(a6)
ExitB:	move.l	ExecBase,a6
	jsr	Permit(a6)
	clr.l	d0
	rts
;----Subroutine: Print Error-------------
PrtErr:	move.l	a0,-(SP)
	move.l	DosBase(pc),a6
	jsr	Output(a6)
	move.l	d0,d1
	move.l	(SP)+,d2
	move.l	d2,a0
	clr.l	d3
Seek:	tst.b	(a0)+
	beq.s	Seek1
	addq.l	#$0001,d3
	bra.s	Seek
Seek1:	jsr	Write(a6)
	rts
;----Some Labels-------------------------
DosName:	dc.b "dos.library",0
FileName:	dc.b "df0:c/seka",0
ErrTxt0:	dc.b "File not Found.",10,10,0
ErrTxt1:	dc.b "Hunktype not supported.",10,10,0
Errtxt2:	dc.b "No Memory fo Hunk Table.",10,10,0
ErrTxt3:	dc.b "Running out of Memory.",10,10,0
		EVEN
Ram:		blk.b $0100,0
		EVEN
Table:		dc.l 0,0,0
DosBase:	dc.l 0
File:		dc.l 0
HunkNr:		dc.l 0
ErrorNr:	dc.l 0
TablePos:	dc.l 0
TableSize:	dc.l 0
CurrentNum:	dc.l 0
AllocPos:	dc.l 0
Anzahl:		dc.l 0
Address:	dc.l 0
SpecifiedHunk:	dc.l 0
zeiger:
dc.l	$60000
