dspproc.asm
来自「linux下的任天堂模拟器代码。供大家参考。」· 汇编 代码 · 共 1,951 行 · 第 1/5 页
ASM
1,951 行
%%notfilter3 cmp edx,-32768 jnl %%notless mov edx,-32768%%notless cmp edx,32767 jng %%notgreater mov edx,32767%%notgreater mov eax,[prev0] mov [prev1],eax shl edx,1 movsx edx,dx mov [prev0],edx%endmacro%macro ProcessDynamicLowPass 0 mov ecx,[curvoice] mov edx, [Voice0Freq+ecx*4] cmp edx, dword 800000h ja %%DLPF ret%%DLPF lea ebx,[ecx*4] lea ebx,[ebx*4] lea ecx,[ecx*4] lea ebx,[ecx*2+ebx] lea ebx,[DLPFsamples+ebx*4] cmp byte[LowPassFilterType],3 je near %%DLPF_fir;dynamic mov eax,[ebx+16*4] mov [ebx],eax mov eax,[ebx+17*4] mov [ebx+1*4],eax mov eax,[ebx+18*4] mov [ebx+2*4],eax mov eax,[ebx+19*4] mov [ebx+3*4],eax sub edi,32 movsx eax,word[edi+24] mov [ebx+16*4],eax movsx eax,word[edi+26] mov [ebx+17*4],eax movsx eax,word[edi+28] mov [ebx+18*4],eax movsx eax,word[edi+30] mov [ebx+19*4],eax mov ecx,16 shr edx,24 cmp dl,2 jle %%dlpf_by_2 cmp dl,3 jle %%dlpf_by_3 cmp dl,4 jle near %%dlpf_by_4 jmp %%dlpf_by_5%%dlpf_by_2 mov eax,[ebx+4*4] jmp %%dlpf_by_2_loopALIGN16%%dlpf_by_2_loop movsx edx,word[edi] add eax,edx sar eax,1 mov [edi],ax mov eax,edx add edi,2 dec ecx jnz %%dlpf_by_2_loop ret%%dlpf_by_3 mov eax,[ebx+3*4] mov ebp,[ebx+4*4] jmp %%dlpf_by_3_loopALIGN16%%dlpf_by_3_loop movsx ebx,word[edi] add eax,ebx add eax,ebp mov edx,55555555h ; (1/3) imul edx mov [edi],dx add edi,2 mov eax,ebp mov ebp,ebx dec ecx jnz %%dlpf_by_3_loop ret%%dlpf_by_4 mov eax,[ebx+2*4] mov edx,[ebx+3*4] mov ebp,[ebx+4*4] jmp %%dlpf_by_4_loopALIGN16%%dlpf_by_4_loop movsx ebx,word[edi] add eax,ebx add eax,edx add eax,ebp sar eax,2 mov [edi],ax add edi,2 mov eax,edx mov edx,ebp mov ebp,ebx dec ecx jnz %%dlpf_by_4_loop ret%%dlpf_by_5 push ecx mov eax,[ebx+1*4] mov esi,[ebx+2*4] mov ebp,[ebx+3*4] mov ecx,[ebx+4*4] jmp %%dlpf_by_5_loopALIGN16%%dlpf_by_5_loop movsx ebx,word[edi] add eax,ebx add eax,esi add eax,ebp add eax,ecx mov edx,33333333h ; 1/5 imul edx mov [edi],dx add edi,2 mov eax,esi mov esi,ebp mov ebp,ecx mov ecx,ebx dec dword[esp] jnz %%dlpf_by_5_loop pop ecx ret%%DLPF_fir sub edi,byte 32 sub edx,0780000h ;ac - address calculation (see below) mov eax,[ebx+16*4] mov ecx,[ebx+17*4] mov [ebx],eax mov [ebx+1*4],ecx shr edx,18 ;ac mov eax,[ebx+18*4] and edx,3FF0h ;ac mov ecx,[ebx+19*4] mov [ebx+2*4],eax mov [ebx+3*4],ecx movq mm1,[edi] ;u1 (U-pipe marker) movq mm3,[edi+8] ;u2 punpcklwd mm0,mm1 movq mm5,[edi+16] ;u3 psrad mm0, 16 movq mm7,[edi+24] ;u4 punpckhwd mm1,mm1 movq [ebx+4*4],mm0 ;u5 psrad mm1, 16 movq mm4,[BRRreadahead] ;u6 punpcklwd mm0,mm3 movq [ebx+6*4],mm1 ;u7 psrad mm0, 16 punpckhwd mm3,mm3 ;u8 movq [ebx+8*4],mm0 ;u9 psrad mm3, 16 punpcklwd mm0,mm5 ;u10 movq [ebx+10*4],mm3 ;u11 psrad mm0, 16 punpckhwd mm5,mm5 ;u12 movq [ebx+12*4],mm0 ;u13 psrad mm5, 16 punpcklwd mm0,mm7 ;u14 movq [ebx+14*4],mm5 ;u15 psrad mm0, 16 punpckhwd mm7,mm7 ;u16 movq mm2,[fir_lut_co+edx] ;u17 psrad mm7, 16 punpcklwd mm6,mm4 ;u18 movq [ebx+16*4],mm0 ;u19 psrad mm6, 16 movq [ebx+18*4],mm7 ;u20 punpckhwd mm4,mm4 movq mm3,[fir_lut_co+edx+8] ;u21 psrad mm4, 16 movq [ebx+20*4],mm6 ;u22 movq [ebx+22*4],mm4 ;u23 mov ecx,16 jmp %%DLPF_fir_loop ALIGN16; output 2 samples per iteration%%DLPF_fir_loop movq mm0,[ebx] packssdw mm0,[ebx+8] movq mm4,[ebx+4] pmaddwd mm0,mm2 packssdw mm4,[ebx+12] movq mm1,[ebx+16] pmaddwd mm4,mm2 packssdw mm1,[ebx+24] movq mm5,[ebx+20] pmaddwd mm1,mm3 packssdw mm5,[ebx+28] pmaddwd mm5,mm3 paddd mm0,mm1 add ebx,byte 8 paddd mm4,mm5 movq mm1,mm0 movq mm5,mm4 psrlq mm0,32 psrlq mm4,32 paddd mm0,mm1 paddd mm4,mm5 punpckldq mm0,mm4 psrad mm0,14 packssdw mm0,mm0 sub ecx,byte 2 movd [edi],mm0 lea edi,[edi+4] jnz %%DLPF_fir_loop emms ret%endmacrosection .bssNEWSYM curvoice, resd 1section .textBRRDecode: mov [curvoice],ecx mov byte[lastbl],0 mov byte[loopbl],0 push ecx movzx eax,byte[esi] test al,01h jz .nolast mov byte[lastbl],1 test al,02h jz .nolast mov byte[loopbl],1.nolast mov cl,al and al,0Ch inc esi mov ebx,[Filter+eax*2] shr cl,4 mov [filter0],ebx mov ebx,[Filter+eax*2+4] mov [bshift],cl mov [filter1],ebx mov byte[sampleleft],8 jmp .nextsample ALIGN16.nextsample ProcessSample ProcessA mov [edi],dx ProcessSample ProcessB mov [edi+2],dx add edi,4 inc esi dec byte[sampleleft] jnz .nextsample cmp dword[DSPInterpolate],0 jnz .BRR_decode_ahead cmp byte[LowPassFilterType],2 jle near .no_dlpf mov eax,[curvoice] mov eax,[Voice0Freq+eax*4] cmp eax,800000h jb near .no_dlpf.BRR_decode_ahead push esi cmp byte[lastbl],1 jne .dlpf_fill cmp byte[loopbl],1 jne near .dlpf_clear mov eax,[curvoice] mov esi,[Voice0LoopPtr+eax*4] add esi,SPCRAM.dlpf_fill push dword[prev0] push dword[prev1] movzx eax,byte[esi] mov cl,al and al,0Ch inc esi mov ebx,[Filter+eax*2] shr cl,4 mov [filter0],ebx mov ebx,[Filter+eax*2+4] mov [bshift],cl mov [filter1],ebx ProcessSample ProcessA mov [BRRreadahead],dx ProcessSample ProcessB mov [BRRreadahead+2],dx inc esi ProcessSample ProcessA mov [BRRreadahead+4],dx ProcessSample ProcessB mov [BRRreadahead+6],dx pop dword[prev1] pop dword[prev0] pop esi jmp .no_dlpf.dlpf_clear xor eax,eax mov [BRRreadahead],eax mov [BRRreadahead+4],eax pop esi.no_dlpf pop ecx cmp byte[LowPassFilterType],1 ja .dlpf ret.dlpf ProcessDynamicLowPasssection .dataALIGN32; Original ValuesNEWSYM EchoRateO dd 2,172,344,517,689,861,1033,1205,1378,1550,1722,1895,2067,2239,2412,2584NEWSYM AttackRateO dd 45202,28665,16537,11025,7056,4189,2866,1764,1058,705,441,264,176,110,66,4NEWSYM DecayRateO dd 13230,8158,4851,2697,2284,1212,815,407NEWSYM SustainRateO dd 0FFFFFFFFh,418950,308700,265600,209475,154350,132300,103635,78277,65047 dd 51817,38587,31972,26460,19845,16537,13230,9702,8158,6504,4851,3879,2697 dd 2050,1572,1212,1014,815,606,407,202,125NEWSYM SustainValueO db 15,31,47,63,79,95,111,127NEWSYM IncreaseO dd 0FFFFFFFFh,45202,34177,28665,22050,16537,14332,11025,8489,7056,5622,4189 dd 3528,2866,2094,1764,1433,1058,882,705,529,441,352,264,220,176,132,110,88 dd 66,44,22NEWSYM IncreaseBentO dd 0FFFFFFFFh,79100,59535,50160,38580,28665,25000,19250,14332,12127,9800,7320 dd 6160,4961,3650,3060,2425,1845,1540,1212,920,770,614,460,383,306,229,190,152 dd 113,75,36NEWSYM DecreaseO dd 0FFFFFFFFh,45202,34177,28665,22050,16537,14332,11025,8489,7056,5622,4189 dd 3528,2866,2094,1764,1433,1058,882,705,529,441,352,264,220,176,132,110,88,66 dd 44,22NEWSYM DecreaseRateExpO dd 0FFFFFFFFh,418950,308700,264600,209470,154350,132300,103635,78277,65047 dd 51817,38587,31972,26460,19845,16537,13230,9702,8158,6504,4851,4079,3197 dd 2425,1984,1653,1212,1014,815,606,407,198SECTION .bssNoisePtr resd 1; used only in dspp
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?