/* This C language subroutine computes a number of cascaded biqaud section. The Run Time Library for the C Language. Gordon A. Sterling (617) 461 - 3076 DSP Development Tools Engineering Created on 6/25/90 Updated on 5/94 by AS #include fract xbiquad(fract sample, fract coeffs[], \ fract state[], int sections); float biquad(float sample, float coeffs[], \ float state[], int sections); */ #include "lib_glob.h" #include "trn_glob.h" .SEGMENT/CODE Code_Space_Name; .FILE RTL_FILENAME; /* _xbiquad is removed for now */ .GLOBAL _biquad; /* _xbiquad: JUMP biquad_core (DB); pm_ptr=xbiquadPD; pm_lnt=0; */ _biquad: pm_ptr=biquadPD; pm_lnt=0; biquad_core: R0=R0-R0, put(R5); /* have 0 ready to ret */ put(R10); R2=PASS R4, put(R11); R12=PASS R12, put(R15); IF NE JUMP (pm_0, pm_ptr) (DB); /*Jump to correct routine*/ pm_lnt=0; readparam4(R10); /* Read 1st stk param */ FETCH_RETURN restore_state: get(R15,1); get(R11,2); get(R10,3); get(R5,4); RETURN (DB); RESTORE_STACK RESTORE_FRAME biquadPD: R1=MODE1; /*Save old mode*/ dm_mdf=-3; /* BIT CLR MODE1 65536;*/ /*Set to 40-BIT mode*/ R12=R12+1, pm_ptr=R8; /*R13+1 points to delay line*/ dm_bse=R12; /*Base of delay line is state+1*/ dm_lnt=0; /*Circular buffers not used*/ LCNTR=R10, DO sectionsPD UNTIL LCE; F0=DM(dm_ptr, dm_1), F4=PM(pm_ptr, pm_1); F12=DM(dm_ptr, dm_0), F5=PM(pm_ptr, pm_1); F15=F0*F5; F10=F12*F4, F5=PM(pm_ptr, pm_1); F10=F2*F5, F15=F10+F15, F4=PM(pm_ptr, pm_1); F11=F12*F4, F4=PM(pm_ptr, pm_1); F8=F0*F4, F15=F10+F15, DM(dm_ptr, dm_M1)=F0; F11=F11+F8; F8=F2+F11; F11=F5*F11; sectionsPD: F2=F11+F15, DM(dm_ptr,2)=F8; JUMP (PC, restore_state) (DB); F0=PASS F2, FETCH_RETURN MODE1=R1; /* xbiquadPD: R1=MODE1; dm_mdf=-3; R12=R12+1, pm_ptr=R8; dm_bse=R12; dm_lnt=0; LCNTR=R10, DO xsectionsPD UNTIL LCE; R0=DM(dm_ptr,dm_1), R4=PM(pm_ptr,pm_1); MRF=R0*R4 (SSF), R8=DM(dm_ptr,dm_1), R4=PM(pm_ptr,pm_1); MRF=MRF+R8*R4 (SSF), R4=PM(pm_ptr,pm_1); MRF=MRF+R2*R4 (SSF), R0=DM(dm_ptr,dm_1),R4=PM(pm_ptr,pm_1); MRF=MRF+R0*R4 (SSF), R0=DM(dm_ptr,dm_mdf),R4=PM(pm_ptr,pm_1); R12=MRF+R0*R4 (SSFR), DM(dm_ptr,dm_1)=R8; xsectionsPD: R2=PASS R12, DM(dm_ptr,dm_1)=R2; MODE1=R1; JUMP (PC, restore_state) (DB); DM(dm_ptr,dm_1)=R0; R0=PASS R2, DM(dm_ptr,1)=R2; */ .ENDSEG;