
Test:		lea	Data(pc),a0			;source
		lea	Data+8(pc),a1			;destination
		bsr.b	ATN_Decr
		rts

******************************************************************************
* Team-17 (ATN!) Decompresser				     By Stephen Boberg
* ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
* $Inputs:	a0.l	=	Source Ptr.		(packed data)
*		a1.l	=	Destination Ptr.	(depacked data buffer)
*
* $Notes:	The ATN! Compressor is based upon Stephens earlier attempt at
*		a cruncher, namely "DEFJAM PACKER"... Its a more efficient
*		fast updated version of it... (anyone still remember it?)
*		Stephan was AntiAction of Defjam and cracked lots of games
*		years ago but now he does commercial stuff. This decompressor
*		can be used to decompress all Team-17 games, eg; SuperFrog
*		Arcade pool, etc.
*
*		Decompression minimum Safe Distance is 8 bytes.
******************************************************************************

ATN_Decr:	cmp.l	#"ATN!",(a0)
		beq.s	isATN
		rts
		
isATN:		movem.l	d2-d5/a2-a4,-(sp)
		move.l	a0,a3
		move.l	a1,a4
		move.l	a1,a5
		tst.l	(a0)+			;skip atn header
		add.l	(a0)+,a4		;unpacked length
		add.l	(a0)+,a3		;packed length
		move.l	a3,a2
		move.l	(a2)+,-(a0)
		move.l	(a2)+,-(a0)
		move.l	(a2)+,-(a0)
		move.l	(a2)+,d2
		move.w	(a2)+,d3
		bmi.s	ATN_300
		subq.l	#1,a3
ATN_300		lea	-$1C(sp),sp
		move.l	sp,a1
		moveq	#6,d0
ATN_308		move.l	(a2)+,(a1)+
		dbra	d0,ATN_308
		move.l	sp,a1
		moveq	#0,d4
ATN_312		tst.l	d2
		beq.s	ATN_31C
ATN_316		move.b	-(a3),-(a4)
		subq.l	#1,d2
		bne.s	ATN_316
ATN_31C		cmp.l	a4,a5
		bcs.s	ATN_334
		lea	$1C(sp),sp
		moveq	#-1,d0
		cmp.l	a3,a0
		beq.s	ATN_32C

ATN_32A		moveq	#0,d0
ATN_32C		movem.l	(sp)+,d2-d5/a2-a4
		tst.l	d0
		rts

ATN_334		add.b	d3,d3
		bne.s	ATN_33C
		move.b	-(a3),d3
		addx.b	d3,d3
ATN_33C		bcc.s	ATN_3A2
		add.b	d3,d3
		bne.s	ATN_346
		move.b	-(a3),d3
		addx.b	d3,d3
ATN_346		bcc.s	ATN_39C
		add.b	d3,d3
		bne.s	ATN_350
		move.b	-(a3),d3
		addx.b	d3,d3
ATN_350		bcc.s	ATN_396
		add.b	d3,d3
		bne.s	ATN_35A
		move.b	-(a3),d3
		addx.b	d3,d3
ATN_35A		bcc.s	ATN_390
		add.b	d3,d3
		bne.s	ATN_364
		move.b	-(a3),d3
		addx.b	d3,d3
ATN_364		bcc.s	ATN_36C
		move.b	-(a3),d4
		moveq	#3,d0
		bra.s	ATN_3A6
ATN_36C		add.b	d3,d3
		bne.s	ATN_374
		move.b	-(a3),d3
		addx.b	d3,d3
ATN_374		addx.b	d4,d4
		add.b	d3,d3
		bne.s	ATN_37E
		move.b	-(a3),d3
		addx.b	d3,d3
ATN_37E
		addx.b	d4,d4
		add.b	d3,d3
		bne.s	ATN_388
		move.b	-(a3),d3
		addx.b	d3,d3
ATN_388
		addx.b	d4,d4
		addq.b	#6,d4
		moveq	#3,d0
		bra.s	ATN_3A6

ATN_390		moveq	#5,d4
		moveq	#3,d0
		bra.s	ATN_3A6

ATN_396		moveq	#4,d4
		moveq	#2,d0
		bra.s	ATN_3A6

ATN_39C		moveq	#3,d4
		moveq	#1,d0
		bra.s	ATN_3A6

ATN_3A2		moveq	#2,d4
		moveq	#0,d0
ATN_3A6		moveq	#0,d5
		move.w	d0,d1
		add.b	d3,d3
		bne.s	ATN_3B2
		move.b	-(a3),d3
		addx.b	d3,d3
ATN_3B2		bcc.s	ATN_3CA
		add.b	d3,d3
		bne.s	ATN_3BC
		move.b	-(a3),d3
		addx.b	d3,d3
ATN_3BC		bcc.s	ATN_3C6
		move.b	ATNB_42A(pc,d0.w),d5
		addq.b	#8,d0
		bra.s	ATN_3CA

ATN_3C6		moveq	#2,d5
		addq.b	#4,d0
ATN_3CA
		move.b	ATNB_42E(pc,d0.w),d0
ATN_3CE
		add.b	d3,d3
		bne.s	ATN_3D6
		move.b	-(a3),d3
		addx.b	d3,d3
ATN_3D6
		addx.w	d2,d2
		subq.b	#1,d0
		bne.s	ATN_3CE
		add.w	d5,d2
		moveq	#0,d5
		move.l	d5,a2
		move.w	d1,d0
		add.b	d3,d3
		bne.s	ATN_3EC
		move.b	-(a3),d3
		addx.b	d3,d3
ATN_3EC
		bcc.s	ATN_408
		add.w	d1,d1
		add.b	d3,d3
		bne.s	ATN_3F8
		move.b	-(a3),d3
		addx.b	d3,d3
ATN_3F8
		bcc.s	ATN_402
		move.w	d3,$dff180		;colours flash
		move.w	8(a1,d1.w),a2
		addq.b	#8,d0
		bra.s	ATN_408

ATN_402
		move.w	0(a1,d1.w),a2
		addq.b	#4,d0
ATN_408
		move.b	$10(a1,d0.w),d0
ATN_40C
		add.b	d3,d3
		bne.s	ATN_414
		move.b	-(a3),d3
		addx.b	d3,d3
ATN_414
		addx.l	d5,d5
		subq.b	#1,d0
		bne.s	ATN_40C
		addq.w	#1,a2
		add.l	d5,a2
		add.l	a4,a2

ATN_420		move.b	-(a2),-(a4)
		subq.b	#1,d4
		bne.s	ATN_420

		bra.w	ATN_312

ATNB_42A	dc.b	6,10,10,18
ATNB_42E	dc.b	1,1,1,1,2,3,3,4,4,5,7,14

Data		incbin	work:games/arcadepool/snd/chipsams.bin.aga
buffer		dcb.b	50000,0		;unpack buffer
