
		incdir	_include:
		include	exec/exec.i
		include	libraries/dos_lib.i
		include	libraries/exec_lib.i
		include	libraries/dosextens.i
		include	include:libraries/xpk.i

start:		move.l	4.w,a6
		lea	xpkname(pc),a1
		jsr	_LVOOldOpenLibrary(a6)
		move.l	d0,xpkbase		; Store XPK Library base!
		beq.b	cleanup			; ERROR -> Exit

		move.l	d0,a6			; XPKBase to A6
		lea	tags(pc),a0
		jsr	_LVOXpkPack(a6)
		tst.l	d0
		beq.w	noerror

		move.w	#$ff0,$dff180
		
noerror

cleanup		move.l	xpkbase(pc),d0
		beq.b	exit			; Library not open
		move.l	d0,a1
		move.l	4.w,a6
		jsr	_LVOCloseLibrary(a6)	; Close XPK library

exit		moveq	#0,d0			; No error code!

		lea	dst,a0
		move.l	4(a0),d0		; packed size
		move.l	#srclen,d1
		move.l	d1,d2			;d1=original size..
		sub.l	d0,d2
		move.l	d1,d3
getgain1:	tst.l	d2
		bmi.s	getgain2
		tst.l	d3
		bmi.s	getgain2
		add.l	d2,d2
		add.l	d3,d3
		bra.s	getgain1

getgain2:	lsr.l	#1,d2
		lsr.l	#1,d3
		clr.w	d2
		clr.w	d3
		swap	d2
		swap	d3
		mulu	#100,d2
		divu	d3,d2
;-------------- d2.w = % gain
;		d0.l = new size
;		d1.l = old size

		lea	errbuf(pc),a0

		lea	dst+48,a1
		lea	-48(a1,d0.l),a2
		rts

xpkbase:	dc.l	1

tags:		dc.l	XPK_InBuf,src
		dc.l	XPK_InLen,srclen
		dc.l	XPK_OutBuf,dst
		dc.l	XPK_OutBufLen,(srclen)+(srclen/2)
		dc.l	XPK_FindMethod,packmode
		dc.l	XPK_PackMode,packmode
		dc.l	XPK_GetError,errbuf		; A pointer to the error message buffer
		dc.l	TAG_DONE

errbuf:		ds.b	82
		even
packmode:	dc.b	'CRM2',0
		even
xpkname:	dc.b	'xpkmaster.library',0
		even
src:		incbin	'dl:68khelper/mod.bonus'
srcend		even
srclen		=	srcend-src
dst:		ds.b	10240*2
		end
