📄 dspproc.asm
字号:
%ifdef __MSDOS__NEWSYM SBToSPCSpeeds, dd 8000,10989,22222,43478,15874,32258,48000NEWSYM SBToSPCSpeeds2, dd 8192,11289,22579,45158,16384,32768,48000%elseNEWSYM SBToSPCSpeeds, dd 8000,11025,22050,44100,16000,32000,48000%endifNEWSYM NumofSPCBlock, dd 626,456,228,114,314,156,104NEWSYM SPCBlockNum, dd 0NEWSYM NoiseSpeeds, dd 1,16,21,25,31,42,50,63,83,100,125,167,200,250,333,400,500 dd 667,800,1000,1333,1600,2000,2667,3200,4000,5333,6400,8000,10667,16000,32000SECTION .textNEWSYM conv2speed.next mov eax,[edi] mov ebx,[SBToSPC] mul ebx mov ebx,11025 div ebx mov [esi],eax add esi,4 add edi,4 dec ecx jnz .next retNEWSYM AdjustFrequency xor ebx,ebx mov ah,[MMXSupport] mov al,[SoundInterpType] or ah,ah jnz .mmx cmp byte[LowPassFilterType],3 jb .nothq mov byte[LowPassFilterType],0.nothq cmp al,3 jb .mmx mov al,1 mov [SoundInterpType],al.mmx or al,al jz near .notgaussian cmp al,2 je near .cubicspline ja near .fir_mmx ; Copy from Gaussian to DSPInterP%ifndef __MSDOS__ ; this ifndef is needed the workaround the "snow" in the DOS port ; used only for Gaussian though test ah,ah jne .gaussian_mmx%endif mov ebx,DSPInterP+1024 mov edx,DSPInterP+1022 mov esi,Gaussian mov ecx,512.intrploop movzx eax,word[esi] mov [edx],ax mov [ebx],ax add ebx,2 sub edx,2 add esi,2 dec ecx jnz .intrploop mov ebx, DSPInterpolate_4 jmp .notgaussian.gaussian_mmx mov ebx,Gaussian mov edx,Gaussian+510 mov esi,DSPInterP mov ecx,256.intrploopm mov ax,[ebx+512] mov [esi],ax mov ax,[ebx] mov [esi+2],ax mov ax,[edx] mov [esi+4],ax mov ax,[edx+512] mov [esi+6],ax add ebx,2 sub edx,2 add esi,8 dec ecx jnz .intrploopm mov ebx, DSPInterpolate_4_mmx jmp .notgaussian.cubicspline ; Copy from CubicSpline to DSPInterP test ah,ah jne .cubic_mmx mov ebx,CubicSpline mov edx,DSPInterP mov ecx,1024.intrploopb movzx eax,word[ebx] push ebx mov bx,ax sar bx,3 sub ax,bx pop ebx mov [edx],ax add ebx,2 add edx,2 dec ecx jnz .intrploopb mov ebx, DSPInterpolate_4 jmp .notgaussian.cubic_mmx mov ebx,CubicSpline mov esi,DSPInterP mov ecx,256.intrploopmb mov ax,[ebx+256*6] mov dx,ax sar dx,3 sub ax,dx mov [esi],ax mov ax,[ebx+256*4] mov dx,ax sar dx,3 sub ax,dx mov [esi+2],ax mov ax,[ebx+256*2] mov dx,ax sar dx,3 sub ax,dx mov [esi+4],ax mov ax,[ebx] mov dx,ax sar dx,3 sub ax,dx mov [esi+6],ax add ebx,2 add esi,8 dec ecx jnz .intrploopmb mov ebx, DSPInterpolate_4_mmx jmp .notgaussian.fir_mmx mov ebx, DSPInterpolate_8.notgaussian mov [DSPInterpolate],ebx%ifdef __MSDOS__ call SB_quality_limiter%endif mov eax,[SoundQuality] mov ebx,[NumofSPCBlock+eax*4] cmp byte[StereoSound],1 jne .nostereo shr ebx,1.nostereo mov [SPCBlockNum],ebx.next mov ecx,[SoundQuality] mov eax,[SBToSPCSpeeds+ecx*4]%ifdef __MSDOS__ ; code for supporting vibra cards (coded by Peter Santing) cmp byte[vibracard],1 je .vibrafix cmp byte[SBHDMA],0 je .not16bit.vibrafix mov eax,[SBToSPCSpeeds2+ecx*4].not16bit%endif mov [SBToSPC],eax mov [SBRateb],eax xor edx,edx mov ebx,eax mov eax,32000 shld edx,eax,20 shl eax,20 div ebx mov [dspPAdj],eax ; Init all rates mov esi,EchoRate mov edi,EchoRateO mov ecx,16 call conv2speed mov esi,AttackRate mov edi,AttackRateO mov ecx,16 call conv2speed mov esi,DecayRate mov edi,DecayRateO mov ecx,8 call conv2speed mov esi,SustainRate+4 mov edi,SustainRateO+4 mov ecx,31 call conv2speed mov esi,Increase+4 mov edi,IncreaseO+4 mov ecx,31 call conv2speed mov esi,IncreaseBent+4 mov edi,IncreaseBentO+4 mov ecx,31 call conv2speed mov esi,Decrease+4 mov edi,DecreaseO+4 mov ecx,31 call conv2speed mov esi,DecreaseRateExp+4 mov edi,DecreaseRateExpO+4 mov ecx,31 call conv2speed mov dword[Voice0Pitch],0xFFFEFFFE mov dword[Voice0Pitch+4],0xFFFEFFFE mov dword[Voice0Pitch+8],0xFFFEFFFE mov dword[Voice0Pitch+12],0xFFFEFFFE retNEWSYM InitSPC push eax push ebx push ecx push edx call AdjustFrequency mov ecx,32768 mov edx,32767.nextvol mov al,dh imul dl shr ax,7 movsx bx,al mov [VolumeConvTable+edx*2],bx dec edx dec ecx jnz .nextvol mov eax,SPCRAM mov ebx,0EFh.loop2 mov byte[eax],0 inc eax dec ebx jnz .loop2 mov byte[spcX],0 xor eax,eax xor ebx,ebx mov ebp,SPCRAM mov ax,0FFC0h add ebp,eax mov [spcPCRam],ebp mov dword[spcS],1EFh mov dword[spcRamDP],SPCRAM ; initialize all the SPC write registers mov dword[spcWptr+0],SPCRegF0 mov dword[spcWptr+4],SPCRegF1 mov dword[spcWptr+8],SPCRegF2 mov dword[spcWptr+12],SPCRegF3 mov dword[spcWptr+16],SPCRegF4 mov dword[spcWptr+20],SPCRegF5 mov dword[spcWptr+24],SPCRegF6 mov dword[spcWptr+28],SPCRegF7 mov dword[spcWptr+32],SPCRegF8 mov dword[spcWptr+36],SPCRegF9 mov dword[spcWptr+40],SPCRegFA mov dword[spcWptr+44],SPCRegFB mov dword[spcWptr+48],SPCRegFC mov dword[spcWptr+52],SPCRegFD mov dword[spcWptr+56],SPCRegFE mov dword[spcWptr+60],SPCRegFF mov dword[spcRptr+0],RSPCRegF0 mov dword[spcRptr+4],RSPCRegF1 mov dword[spcRptr+8],RSPCRegF2 mov dword[spcRptr+12],RSPCRegF3 mov dword[spcRptr+16],RSPCRegF4 mov dword[spcRptr+20],RSPCRegF5 mov dword[spcRptr+24],RSPCRegF6 mov dword[spcRptr+28],RSPCRegF7 mov dword[spcRptr+32],RSPCRegF8 mov dword[spcRptr+36],RSPCRegF9 mov dword[spcRptr+40],RSPCRegFA mov dword[spcRptr+44],RSPCRegFB mov dword[spcRptr+48],RSPCRegFC mov dword[spcRptr+52],RSPCRegFD mov dword[spcRptr+56],RSPCRegFE mov dword[spcRptr+60],RSPCRegFF mov dword[dspRptr+00h],RDSPReg00 mov dword[dspRptr+04h],RDSPReg01 mov dword[dspRptr+08h],RDSPReg02 mov dword[dspRptr+0Ch],RDSPReg03 mov dword[dspRptr+010h],RDSPReg04 mov dword[dspRptr+014h],RDSPReg05 mov dword[dspRptr+018h],RDSPReg06 mov dword[dspRptr+01Ch],RDSPReg07 mov dword[dspRptr+020h],RDSPReg08 mov dword[dspRptr+024h],RDSPReg09 mov dword[dspRptr+028h],RDSPReg0A mov dword[dspRptr+02Ch],RDSPReg0B mov dword[dspRptr+030h],RDSPReg0C mov dword[dspRptr+034h],RDSPReg0D mov dword[dspRptr+038h],RDSPReg0E mov dword[dspRptr+03Ch],RDSPReg0F mov dword[dspRptr+040h],RDSPReg10 mov dword[dspRptr+044h],RDSPReg11 mov dword[dspRptr+048h],RDSPReg12 mov dword[dspRptr+04Ch],RDSPReg13 mov dword[dspRptr+050h],RDSPReg14 mov dword[dspRptr+054h],RDSPReg15 mov dword[dspRptr+058h],RDSPReg16 mov dword[dspRptr+05Ch],RDSPReg17 mov dword[dspRptr+060h],RDSPReg18 mov dword[dspRptr+064h],RDSPReg19 mov dword[dspRptr+068h],RDSPReg1A mov dword[dspRptr+06Ch],RDSPReg1B mov dword[dspRptr+070h],RDSPReg1C mov dword[dspRptr+074h],RDSPReg1D mov dword[dspRptr+078h],RDSPReg1E mov dword[dspRptr+07Ch],RDSPReg1F mov dword[dspRptr+080h],RDSPReg20 mov dword[dspRptr+084h],RDSPReg21 mov dword[dspRptr+088h],RDSPReg22 mov dword[dspRptr+08Ch],RDSPReg23 mov dword[dspRptr+090h],RDSPReg24 mov dword[dspRptr+094h],RDSPReg25 mov dword[dspRptr+098h],RDSPReg26 mov dword[dspRptr+09Ch],RDSPReg27 mov dword[dspRptr+0A0h],RDSPReg28 mov dword[dspRptr+0A4h],RDSPReg29 mov dword[dspRptr+0A8h],RDSPReg2A mov dword[dspRptr+0ACh],RDSPReg2B mov dword[dspRptr+0B0h],RDSPReg2C mov dword[dspRptr+0B4h],RDSPReg2D mov dword[dspRptr+0B8h],RDSPReg2E mov dword[dspRptr+0BCh],RDSPReg2F mov dword[dspRptr+0C0h],RDSPReg30 mov dword[dspRptr+0C4h],RDSPReg31 mov dword[dspRptr+0C8h],RDSPReg32 mov dword[dspRptr+0CCh],RDSPReg33 mov dword[dspRptr+0D0h],RDSPReg34 mov dword[dspRptr+0D4h],RDSPReg35 mov dword[dspRptr+0D8h],RDSPReg36 mov dword[dspRptr+0DCh],RDSPReg37 mov dword[dspRptr+0E0h],RDSPReg38 mov dword[dspRptr+0E4h],RDSPReg39 mov dword[dspRptr+0E8h],RDSPReg3A mov dword[dspRptr+0ECh],RDSPReg3B mov dword[dspRptr+0F0h],RDSPReg3C mov dword[dspRptr+0F4h],RDSPReg3D mov dword[dspRptr+0F8h],RDSPReg3E mov dword[dspRptr+0FCh],RDSPReg3F mov dword[dspRptr+0100h],RDSPReg40 mov dword[dspRptr+0104h],RDSPReg41 mov dword[dspRptr+0108h],RDSPReg42 mov dword[dspRptr+010Ch],RDSPReg43 mov dword[dspRptr+0110h],RDSPReg44 mov dword[dspRptr+0114h],RDSPReg45 mov dword[dspRptr+0118h],RDSPReg46 mov dword[dspRptr+011Ch],RDSPReg47 mov dword[dspRptr+0120h],RDSPReg48 mov dword[dspRptr+0124h],RDSPReg49 mov dword[dspRptr+0128h],RDSPReg4A mov dword[dspRptr+012Ch],RDSPReg4B mov dword[dspRptr+0130h],RDSPReg4C mov dword[dspRptr+0134h],RDSPReg4D mov dword[dspRptr+0138h],RDSPReg4E mov dword[dspRptr+013Ch],RDSPReg4F mov dword[dspRptr+0140h],RDSPReg50 mov dword[dspRptr+0144h],RDSPReg51 mov dword[dspRptr+0148h],RDSPReg52 mov dword[dspRptr+014Ch],RDSPReg53 mov dword[dspRptr+0150h],RDSPReg54 mov dword[dspRptr+0154h],RDSPReg55 mov dword[dspRptr+0158h],RDSPReg56 mov dword[dspRptr+015Ch],RDSPReg57 mov dword[dspRptr+0160h],RDSPReg58 mov dword[dspRptr+0164h],RDSPReg59 mov dword[dspRptr+0168h],RDSPReg5A mov dword[dspRptr+016Ch],RDSPReg5B mov dword[dspRptr+0170h],RDSPReg5C mov dword[dspRptr+0174h],RDSPReg5D mov dword[dspRptr+0178h],RDSPReg5E mov dword[dspRptr+017Ch],RDSPReg5F mov dword[dspRptr+0180h],RDSPReg60
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -