; FreeMemory v1.0 - © 1993 F.Delacroix
; Usage: FreeMemory

	incdir	Include:
	include	exec/exec.i
	include	exec/exec_lib.i
	include	libraries/dos_lib.i

DosBase=0
OutHandle=4
MemPort=8
DisplayArray=12
VARSIZE=20

	sub.l	#VARSIZE,sp
	move.l	sp,a4

	lea	DosName(pc),a1
	moveq.l	#0,d0
	move.l	4.w,a6
	jsr	_LVOOpenLibrary(a6)
	move.l	d0,DosBase(a4)
	beq	FreeVars

	move.l	d0,a6
	jsr	_LVOOutput(a6)
	move.l	d0,OutHandle(a4)

	move.l	d0,d1
	lea	Welcome.MSG(pc),a2
	move.l	a2,d2
	move.l	#Welcome.LGT,d3
	jsr	_LVOWrite(a6)

	lea	PortName(pc),a1
	move.l	4.w,a6
	jsr	_LVOFindPort(a6)
	move.l	d0,MemPort(a4)
	bne.s	MemPortFound

	move.l	OutHandle(a4),d1
	lea	CantFindPort.MSG(pc),a2
	move.l	a2,d2
	move.l	#CantFindPort.LGT,d3
	move.l	DosBase(a4),a6
	jsr	_LVOWrite(a6)
	bra.s	CloseDos

MemPortFound
	move.l	d0,a1
	jsr	_LVORemPort(a6)
	move.l	MemPort(a4),a3
NextEntry
	lea	MP_MSGLIST(a3),a0
	move.l	LH_HEAD(a0),a2
	tst.l	(a2)
	beq.s	NoMoreEntries
	move.l	a2,a1
	jsr	_LVORemove(a6)
	move.l	OutHandle(a4),d0
	move.l	DosBase(a4),a6
	lea	FreeString(pc),a0
	lea	DisplayArray(a4),a1
	move.l	ML_ME+ME_LENGTH(a2),(a1)
	move.l	ML_ME+ME_ADDR(a2),4(a1)
	bsr.s	fprintf
	move.l	a2,a0
	move.b	#NT_MEMORY,ML+LN_TYPE(a0)
	move.l	4.w,a6
	jsr	_LVOFreeEntry(a6)
	bra.s	NextEntry
NoMoreEntries
	move.l	a3,a1
	move.l	#MP_SIZE+PortName.LGT,d0
	move.l	4.w,a6
	jsr	_LVOFreeMem(a6)
	move.l	OutHandle(a4),d1
	lea	PortFreed.MSG(pc),a2
	move.l	a2,d2
	move.l	#PortFreed.LGT,d3
	move.l	DosBase(a4),a6
	jsr	_LVOWrite(a6)
CloseDos
	move.l	DosBase(a4),a1
	move.l	4.w,a6
	jsr	_LVOCloseLibrary(a6)
FreeVars
	add.l	#VARSIZE,sp
	rts

fprintf:
	movem.l	d2-d3/a2-a5,-(sp)
	move.l	d0,d2			; d2 = FileHandle
	move.l	a0,a3			; a3 = String
	move.l	a1,a4			; a4 = Array
	move.l	a6,a5			; a5 = DOSBase
	move.l	#200,d0
	move.l	#MEMF_CLEAR,d1
	move.l	4.w,a6
	jsr	_LVOAllocMem(a6)
	move.l	d0,d3
	beq.s	.NoMemForBuffer
	move.l	d3,a2
	move.l	a3,a0
	move.l	a4,a1
	bsr.s	sprintf
	move.l	a5,a6
	move.l	d2,d1
	move.l	d3,a0
	bsr.s	fputs
	move.l	d3,a1
	move.l	#140,d0
	move.l	4.w,a6
	jsr	_LVOFreeMem(a6)
.NoMemForBuffer
	move.l	a5,a6
	movem.l	(sp)+,d2-d3/a2-a5
	rts

sprintf:
	movem.l	a0-a3/a6,-(sp)
	lea	.StoreChar(pc),a3
	exg.l	a2,a3
	move.l	4.w,a6
	jsr	_LVORawDoFmt(a6)
	movem.l	(sp)+,a0-a3/a6
	rts
.StoreChar
	move.b	 d0,(a3)+
	rts

fputs:	movem.l	d2-d3,-(sp)
	bsr	strlen
	move.l	d0,d3
	move.l	a0,d2
	jsr	_LVOWrite(a6)
	movem.l	(sp)+,d2-d3
	rts

strlen:	moveq	#-1,d0
.Loop	tst.b	(a0)+
	dbeq	d0,.Loop
	adda.l	d0,a0
	not.l	d0
	rts

DosName	dc.b	'dos.library',0
PortName
	dc.b	'AllocMemory Port',0
PortName.LGT=*-PortName

Welcome.MSG
	dc.b	'FreeMemory 1.0 by F.Delacroix',10,10
Welcome.LGT=*-Welcome.MSG

CantFindPort.MSG
	dc.b	'Can''t find AllocMemory Port !',10
CantFindPort.LGT=*-CantFindPort.MSG

FreeString
	dc.b	'Freeing %ld bytes of memory at location $%6lx.',10,0

PortFreed.MSG
	dc.b	'AllocMemory port deleted.',10
PortFreed.LGT=*-PortFreed.MSG

