;********************************************* unpacking routine of PACK-ICE
; a0 = Pointer to packed data
; a1 = Address to which the data is unpacked
; "bsr" of "jsr" to ice_decrunch with registers a0 and a1 prepared.
ice_decrunch	movem.l	d0-a6,-(sp)
	bsr.s	getinfo
	cmpi.l	#'ICE!',d0
	bne	not_packed
	bsr.s	getinfo	
	lea.l	-8(a0,d0.l),a5
	bsr.s	getinfo
	move.l	d0,(sp)
	move.l	a1,a4
	move.l	a1,a6
	adda.l	d0,a6
	move.l	a6,a3
	move.b	-(a5),d7
	bsr	normal_bytes
	move.l	a3,a6
	bsr	get_1_bit
	bcc.s	not_packed
	move.w	#$0f9f,d7
	bsr	get_1_bit
	bcc.s	ice_00
	moveq	#15,d0	
	bsr	get_d0_bits
	move.w	d1,d7
ice_00:	moveq	#3,d6
ice_01:	move.w	-(a3),d4
	moveq	#3,d5
ice_02:	add.w	d4,d4
	addx.w	d0,d0
	add.w	d4,d4
	addx.w	d1,d1
	add.w	d4,d4
	addx.w	d2,d2
	add.w	d4,d4
	addx.w	d3,d3
	dbra	d5,ice_02
	dbra	d6,ice_01
	movem.w	d0-d3,(a3)
	dbra	d7,ice_00
not_packed:	movem.l	(sp)+,d0-a6
	rts
getinfo	moveq	#3,d1
getbytes	lsl.l	#8,d0
	move.b	(a0)+,d0
	dbf	d1,getbytes
	rts
normal_bytes	bsr.s	get_1_bit
	bcc.s	test_if_end
	moveq.l	#0,d1
	bsr.s	get_1_bit
	bcc.s	copy_direkt
	lea.l	direkt_tab+20(pc),a1
	moveq.l	#4,d3
nextgb	move.l	-(a1),d0
	bsr.s	get_d0_bits
	swap.w	d0
	cmp.w	d0,d1
	dbne	d3,nextgb
no_more	add.l	20(a1),d1
copy_direkt	move.b	-(a5),-(a6)
	dbf	d1,copy_direkt
test_if_end	cmpa.l	a4,a6
	bgt.s	strings
	rts	
get_1_bit	add.b	d7,d7
	bne.s	bitfound
	move.b	-(a5),d7
	addx.b	d7,d7
bitfound:	rts	
get_d0_bits	moveq.l	#0,d1
hole_bit_loop	add.b	d7,d7
	bne.s	on_d0
	move.b	-(a5),d7
	addx.b	d7,d7
on_d0:	addx.w	d1,d1
	dbf	d0,hole_bit_loop
	rts	
strings	lea.l	length_tab(pc),a1
	moveq.l	#3,d2
get_length_bit	bsr.s	get_1_bit
	dbcc	d2,get_length_bit
no_length_bit	moveq.l	#0,d4
	moveq.l	#0,d1
	move.b	1(a1,d2.w),d0
	ext.w	d0
	bmi.s	no_ber
get_ber	bsr.s	get_d0_bits
no_ber	move.b	6(a1,d2.w),d4
	add.w	d1,d4
	beq.s	get_offset_2
	lea.l	more_offset(pc),a1
	moveq.l	#1,d2
getoffs:	bsr.s	get_1_bit
	dbcc	d2,getoffs
	moveq.l	#0,d1
	move.b	1(a1,d2.w),d0
	ext.w	d0
	bsr.s	get_d0_bits
	add.w	d2,d2
	add.w	6(a1,d2.w),d1
	bpl.s	depack_bytes
	sub.w	d4,d1
	bra.s	depack_bytes
get_offset_2	moveq.l	#0,d1
	moveq.l	#5,d0
	moveq.l	#-1,d2
	bsr.s	get_1_bit
	bcc.s	less_40
	moveq.l	#8,d0
	moveq.l	#$3f,d2
less_40:	bsr.s	get_d0_bits
	add.w	d2,d1
depack_bytes:	lea.l	2(a6,d4.w),a1
	adda.w	d1,a1
	move.b	-(a1),-(a6)
dep_b:	move.b	-(a1),-(a6)
	dbf	d4,dep_b
	bra	normal_bytes
direkt_tab	dc.l	$7fff000e,$00ff0007,$00070002,$00030001,$00030001
	dc.l	270-1,	15-1,	 8-1,	 5-1,	 2-1
length_tab	dc.b	9,1,0,-1,-1
	dc.b	8,4,2,1,0
more_offset	dc.b	11,   4,   7,  0
	dc.w	$11f,  -1, $1f
;************************************************* end of unpacking routine
