
	***   ADPCM2 sample compression routines    ****
	*** Copyright (C) 1993 by Christian Buchner ****


		SECTION Code


	*** CompressADPCM2 ***

	; JoinCode = CompressADPCM2(Source, Length, Destination, JoinCode)
	; d0                          a0      d0      a1           d1
	;
	; This function compresses a RAW sample to a given memory. The
	; result is a 2bit ADPCM code. The destination buffer must be
	; at least (Length+3)/4 bytes in size.
	;
	; Function of the JoinCode: See above.


		XDEF _CompressADPCM2
_CompressADPCM2
		movem.l	d2-d4,-(sp)

		addq.l	#3,d0
		lsr.l	#2,d0

		move.w	d1,d3			; d3=EstMax
		swap	d1
		move.w	d1,d2			; d2=Delta
		bne.s	c2_entry
		moveq	#5,d2
		bra.s	c2_entry

c2_loop		lsl.b	#2,d1			; d1=Shifter
		bsr.s	c2_byte
		lsl.b	#2,d1
		bsr.s	c2_byte
		lsl.b	#2,d1
		bsr.s	c2_byte
		lsl.b	#2,d1
		bsr.s	c2_byte
		move.b	d1,(a1)+

c2_entry	dbra	d0,c2_loop		; d0=Counter
		swap	d0
		subq.w	#1,d0
		bcs.s	c2_finished
		swap	d0
		bra.s	c2_loop

c2_finished	move.w	d2,d0			; -> d0=JoinCode
		swap	d0
		move.w	d3,d0

		movem.l	(sp)+,d2-d4
		rts

c2_byte		move.b	(a0)+,d4
		ext.w	d4
		asl.w	#6,d4
		sub.w	d3,d4
		bpl.s	c2_skip1
		bset	#1,d1
		neg.w	d4
c2_skip1	cmp.w	d2,d4
		bls.s	c2_skip2
		bset	#0,d1
c2_skip2	bsr.s	adaptive
		rts



		*** Adaptions-Routine ***

adaptive	; d1 = SignBit + DataBit

		move.w	d2,d4
		lsr.w	#1,d4
		btst	#0,d1
		beq.s	d2_skip1
		add.w	d2,d4
		mulu	#$5600,d2
		bra.s	d2_sign
d2_skip1	mulu	#$3800,d2
d2_sign		btst	#1,d1
		beq.s	d2_skip2
		neg.w	d4
d2_skip2	add.w	d4,d3
		add.l	#8192,d2
		moveq	#14,d4
		asr.l	d4,d2
		rts


		END
