From 5a61b0af86934869ec2a52c643b9e1c62d3fb39f Mon Sep 17 00:00:00 2001 From: pagefault <> Date: Thu, 6 Sep 2001 15:35:26 +0000 Subject: [PATCH] Code updates --- zsnes/src/cpu/dspproc.asm | 40 +++++++++++++++++++++++++++++++++++++- zsnes/src/zip/fir_proc.cpp | 19 +++++++++++------- 2 files changed, 51 insertions(+), 8 deletions(-) diff --git a/zsnes/src/cpu/dspproc.asm b/zsnes/src/cpu/dspproc.asm index 8c8a3ec3..937fd7fb 100644 --- a/zsnes/src/cpu/dspproc.asm +++ b/zsnes/src/cpu/dspproc.asm @@ -1764,7 +1764,8 @@ section .text mov [prev0],edx %endmacro -EXTSYM fir_downsample +;EXTSYM fir_downsample +EXTSYM fir_lut_co %macro ProcessDynamicLowPass 0 mov ecx,[curvoice] @@ -1948,6 +1949,42 @@ ALIGN16 mov [ebx+20*4],eax mov [ebx+25*4],eax +%if 1 + mov ecx,16 + sub edx,0F80000h + shr edx,15 + and edx,7FFF0h + add edx,[fir_lut_co] + movq mm2,[edx] + movq mm3,[edx+8] +%%DLPF_fir_loop + movq mm0,[ebx] + packssdw mm0,[ebx+8] + movq mm1,[ebx+16] + packssdw mm1,[ebx+24] + pmaddwd mm0,mm2 + pmaddwd mm1,mm3 + paddd mm0,mm1 + movq [fir_tmp],mm0 + mov edx,[fir_tmp] + add edx,[fir_tmp+4] + sar edx,14 + cmp edx,32767 + jle %%DLPF_fir_clip + mov edx,32767 +%%DLPF_fir_clip + cmp edx,-32768 + jge %%DLPF_fir_clip2 + mov edx,-32768 +%%DLPF_fir_clip2 + mov [edi],dx + add edi,2 + add ebx,4 + dec ecx + jnz %%DLPF_fir_loop + emms + +%else push edi push ebx @@ -1955,6 +1992,7 @@ ALIGN16 call fir_downsample add esp,+12 add edi,32 +%endif ret %endmacro diff --git a/zsnes/src/zip/fir_proc.cpp b/zsnes/src/zip/fir_proc.cpp index d4e341f6..99f04fda 100644 --- a/zsnes/src/zip/fir_proc.cpp +++ b/zsnes/src/zip/fir_proc.cpp @@ -70,7 +70,7 @@ inline float log2(float f) { // cutoff (1.0 == pi/2) #define WFIR_CUTOFF 0.90f #define WFIR_CUTOFFBITS 12 -#define WFIR_CUTOFFLEN (1L<<(WFIR_CUTOFFBITS)) +#define WFIR_CUTOFFLEN ((1L<<(WFIR_CUTOFFBITS))+1) // wfir type #define WFIR_HANN 0 #define WFIR_HAMMING 1 @@ -139,11 +139,11 @@ class CzWINDOWEDFIR return (float)(_LWc*_LSi); } static signed short lut[WFIR_LUTLEN*WFIR_WIDTH]; - static signed int lut_co[WFIR_CUTOFFLEN*WFIR_WIDTH]; + static signed short lut_co[WFIR_CUTOFFLEN*WFIR_WIDTH]; }; signed short CzWINDOWEDFIR::lut[WFIR_LUTLEN*WFIR_WIDTH]; -signed int CzWINDOWEDFIR::lut_co[WFIR_CUTOFFLEN*WFIR_WIDTH]; +signed short CzWINDOWEDFIR::lut_co[WFIR_CUTOFFLEN*WFIR_WIDTH]; CzWINDOWEDFIR::CzWINDOWEDFIR() { int _LPcl; @@ -177,7 +177,7 @@ CzWINDOWEDFIR::CzWINDOWEDFIR() for( _LCc=0; _LCc_LScale)?_LScale:_LCoef) ); + lut_co[_LIdx+_LCc] = (signed short)( (_LCoef<-_LScale)?-_LScale:((_LCoef>_LScale)?_LScale:_LCoef) ); } } } @@ -239,6 +239,7 @@ float coef( int _PCnr, float _POfs, float _PCut, int _PWidth, int _PType ) //flo CzWINDOWEDFIR sfir; extern "C" signed short *fir_lut = &CzWINDOWEDFIR::lut[0]; +extern "C" signed short *fir_lut_co = &CzWINDOWEDFIR::lut_co[0]; #if 0 @@ -273,8 +274,10 @@ extern "C" int fir_interpolate(unsigned int nPos, int *p) #endif -#define WFIR_CUTOFFSHIFT (32-(WFIR_CUTOFFBITS+WFIR_LOG2WIDTH)) -#define WFIR_CUTOFFMASK ((((1L<<(32-WFIR_CUTOFFSHIFT))-1)&~((1L<