|
; INT2MU.ASM ; ; Integer originally loaded into A Accumulator ; (Q13 number is assumed to be sign-extended to 16 bits) ; ; mucode = musign + muchord + mustep ; ; muchord = (19h - T|EXP)<<4 ; = 190h - (T|EXP)*16 ; = 180h - (T|EXP)*16 + 10h ; ; musign = (AH * (-1)) <<7 ; = (AH * FFFFh) * 128 = AH * (FFFFh * 128) ; = AH * (FFFFh << 7) = AH * FF80h ; ; mustep = (((|int| + 33) << (T|EXP)) << -26) - 10h ; ; Inversion of 8-bit mu code is equivalent to: ; ; mucode' = FF - mucode = FF - musign - muchord - mustep ; ; mucode' = FF-180h-AH*FF80h+(T|EXP)*16-((|int|+33)<<(T|EXP))>>26 ; ; Final output is stored in Low accumulator B(7:0) ********************************************************************** *************this is ulaw compressing********************************* ********************************************************************** .mmregs .global _main .data bias1 .word 0FFh-180h bias2 .word 0FF80h bias3 .word 21h bias4 .word 16 table .word 0,13,25,36,44,48,49,47,40,31,19,6 .word -6,-19,-31,-40,-47,-49,-48,-44,-36,-25,-13,0 ;test values is sine wave lengh=24 start address=0x0a04h at data address .text _main: STM 3000h,AR3 STM 17h,AR4 STM #table, AR0 LD #bias1, DP cbeg LD *AR0+, A ;LOAD INTEGER FOR CONVERSION LD bias1, B ;LOAD (FFh-180h) MASA bias2, B ;Acc B = (FFh-180h-AH*FF80h) ABS A ;A = |int| ADD bias3, A ;A = |int| + 33 (33 = 21H) EXP A ;# OF LEADING ZEROS -> (T|EXP) MAC bias4, B ;ACCB += (T|EXP)*16 NORM A ;A<<(T|EXP) SFTA A,-16 ;(A<<(T|EXP))>>16 SUB A,-10, B ;mucode' = B - (A<<(T|EXP))>>26 STL B, *AR3 ANDM 0X00FF,*AR3+ BANZ cbeg ,*AR4- ;DO IT AGAIN!! ****************************************************************** *********this is ulaw companding********************************** ****************************************************************** ; MU2INT.ASM ; ;IMPLEMENT EQUATION ; ; mucode = musign : muchord : mustep ; X XXX XXXX ; ; INTNUM = [ ((2 * mustep + 33) << muchord) - 33 ] * SGN(musign) ; ; NOTE: since mucode is inverted for xmission, received is ; mucode' = musign' : muchord' : mustep' ; ; Inversion of 8-bit mucode, extended to 15 bits is equivalent to ; ; mucode = 7FFFh - mucode' ; ; The 15 bit extension is used for easy musign removal ; ;The final output is stored in high accumulator B(31:16)
.data BIAS .word 21h MASK .word 7FFFh,1Fh TREG .set 14 .text STM 2000h,AR5 STM 17h,AR6 STM #3000h, AR4 STM #MASK, AR2 STM #TREG, AR3 LD #-12, ASM LD #BIAS, DP loop:
SUB *AR2+,*AR4, A ;7FFFh - mucode' -> AH AND A,8 ;REMOVE POLARITY BIT ;(A<<8 AND A)=(7F AND A(16-23))<<24 ST A,*AR3 ;STORE CHORD TO T: (A<<ASM-16)-> T and || LD *AR2-,B ;LOAD MASK FOR STEP ISOLATION B=1F<<16 AND A,-7,B ;ISOLATE STEP BITS (17-20): BH = 2*mustep ADD BIAS,16,B ;BH = 2*mustep + 33 BIT *AR4+,8 ;COPY SIGN OF mcode'->TC of ST0 NORM B ;BH = (2*mustep+33)<<(muchord) SUB BIAS,16,B ;BH = (2*mustep+33)<< muchord) - 33 XC 1,NTC ;mucode NEGATIVE? (BIT8 == 0; TC ==0) NEG B ;IF SO NEGATE INTEGER: BH *= -1 STH B,*AR5+ ;DO IT AGAIN! BANZ loop, *AR6- here: B here .end ************************************************************************** *****input data at address 0a04h (data space)***************************** *****encoder result at address 3000h(ar3 data space)********************** *****decoder result at address 2000h(ar5 data space)********************** *****data length 24******************************************************* **************************************************************************
|