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 + -
显示快捷键?