home *** CD-ROM | disk | FTP | other *** search
-
- *** ADPCM3 sample compression routines ****
- *** Copyright (C) 1993 by Christian Buchner ****
-
-
- SECTION Code
-
-
- *** CompressADPCM3 ***
-
- ; JoinCode = CompressADPCM3(Source, Length, Destination, JoinCode)
- ; d0 a0 d0 a1 d1
- ;
- ; This function compresses a RAW sample to a given memory. The
- ; result is a 3bit ADPCM code. The destination buffer must be
- ; at least (Length+7)/8*3 bytes in size.
- ;
- ; Function of the JoinCode: See above.
-
- XDEF _CompressADPCM3
- _CompressADPCM3
- movem.l d2-d4,-(sp)
-
- move.w d1,d3 ; d3=EstMax
- swap d1
- move.w d1,d2 ; d2=Delta
- bne.s c3_loop
- moveq #5,d2
-
- c3_loop moveq #0,d1 ; d1=Shifter
- bsr.s c3_byte
- lsl.b #3,d1
- bsr.s c3_byte
- lsl.w #3,d1
- bsr.s c3_byte
- lsl.w #3,d1
- bsr.s c3_byte
- lsl.w #3,d1
- bsr.s c3_byte
- lsl.l #3,d1
- bsr.s c3_byte
- lsl.l #3,d1
- bsr.s c3_byte
- lsl.l #3,d1
- bsr.s c3_byte
- swap d1
- move.b d1,(a1)+
- rol.l #8,d1
- move.b d1,(a1)+
- rol.l #8,d1
- move.b d1,(a1)+
-
- subq.l #8,d0 ; d0=Counter
- bhi.s c3_loop
-
- move.w d2,d0 ; -> d0=JoinCode
- swap d0
- move.w d3,d0
-
- movem.l (sp)+,d2-d4
- rts
-
- c3_byte move.b (a0)+,d4
- ext.w d4
- asl.w #6,d4
- sub.w d3,d4
- bpl.s c3_positive
- or.b #%100,d1
- neg.w d4
- c3_positive sub.w d2,d4
- bls.s c3_00
- sub.w d2,d4
- bls.s c3_01
- sub.w d2,d4
- bls.s c3_10
- c3_11 or.b #%11,d1
- bra.s c3_00
- c3_10 or.b #%10,d1
- bra.s c3_00
- c3_01 or.b #%01,d1
- c3_00 bsr.s adaptive
- rts
-
-
-
- *** Adaptions-Routine ***
-
- adaptive ; d1 = SignBit + DataBit
-
- move.w d2,d4
- lsr.w #1,d4
- btst #1,d1
- beq.s d3_0
- d3_1 btst #0,d1
- beq.s d3_10
- d3_11 add.w d2,d4
- add.w d2,d4
- add.w d2,d4
- mulu #$6607,d2
- bra.s d3_sign
- d3_10 add.w d2,d4
- add.w d2,d4
- mulu #$4D14,d2
- bra.s d3_sign
- d3_0 btst #0,d1
- beq.s d3_00
- d3_01 add.w d2,d4
- mulu #$3A9F,d2
- bra.s d3_sign
- d3_00 mulu #$399A,d2
- d3_sign btst #2,d1
- beq.s d3_add
- neg.w d4
- d3_add add.w d4,d3
- add.l #8192,d2
- moveq #14,d4
- asr.l d4,d2
- rts
-
-
- END
-