2837 lines
52 KiB
NASM
2837 lines
52 KiB
NASM
;Copyright (C) 1997-2007 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach )
|
|
;
|
|
;http://www.zsnes.com
|
|
;http://sourceforge.net/projects/zsnes
|
|
;https://zsnes.bountysource.com
|
|
;
|
|
;This program is free software; you can redistribute it and/or
|
|
;modify it under the terms of the GNU General Public License
|
|
;version 2 as published by the Free Software Foundation.
|
|
;
|
|
;This program is distributed in the hope that it will be useful,
|
|
;but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
;GNU General Public License for more details.
|
|
;
|
|
;You should have received a copy of the GNU General Public License
|
|
;along with this program; if not, write to the Free Software
|
|
;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
%include "macros.mac"
|
|
|
|
EXTSYM Decrease,DecreaseRateExp,EchoFB,EchoRate,EchoVL,EchoVR
|
|
EXTSYM FIRTAPVal0,FIRTAPVal1,FIRTAPVal2,FIRTAPVal3,FIRTAPVal4,FIRTAPVal5
|
|
EXTSYM FIRTAPVal6,FIRTAPVal7,GlobalVL,GlobalVR,Increase
|
|
EXTSYM MaxEcho,MusicVol,NoiseInc,NoiseSpeeds,dspPAdj,Voice0EnvInc
|
|
EXTSYM Voice0IncNumber,Voice0State,Voice0Time
|
|
EXTSYM Voice0Start,Voice1Start,Voice2Start,Voice3Start
|
|
EXTSYM Voice4Start,Voice5Start,Voice6Start,Voice7Start
|
|
EXTSYM Voice0Noise,Voice1Noise,Voice2Noise,Voice3Noise
|
|
EXTSYM Voice4Noise,Voice5Noise,Voice6Noise,Voice7Noise
|
|
EXTSYM VolumeConvTable,VolumeTableb
|
|
EXTSYM Voice0Status,Voice1Status,Voice2Status,Voice3Status
|
|
EXTSYM Voice4Status,Voice5Status,Voice6Status,Voice7Status
|
|
EXTSYM GainDecBendDataPos,GainDecBendDataTime,GainDecBendDataDat
|
|
EXTSYM AdsrSustLevLoc,AdsrBlocksLeft,AdsrNextTimeDepth
|
|
EXTSYM MuteVoiceF,VoiceStarter,DecayRate,SustainRate
|
|
EXTSYM KeyOnStA,KeyOnStB,SoundTest,keyonsn
|
|
|
|
SECTION .data
|
|
identcode db 255,1,78,78
|
|
SECTION .text
|
|
|
|
; Digital Sound Processor of the SPC700 By _Demo_
|
|
|
|
%macro initrevsthelp 1
|
|
mov al,[DSPMem+01h+%1]
|
|
mov ah,[DSPMem+00h+%1]
|
|
mov [DSPMem+01h+%1],ah
|
|
mov [DSPMem+00h+%1],al
|
|
%endmacro
|
|
|
|
SECTION .data
|
|
ALIGN32
|
|
NEWSYM DSPMem, times 256 db 0
|
|
SECTION .text
|
|
|
|
;Read DSP Registers functions
|
|
|
|
NEWSYM RDSPReg00 ; Voice 0 Volume Left
|
|
mov al,[DSPMem+00h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg01 ; Voice 0 Volume Right
|
|
mov al,[DSPMem+01h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg02 ; Voice 0 Pitch Low
|
|
mov al,[DSPMem+02h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg03 ; Voice 0 Pitch High
|
|
mov al,[DSPMem+03h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg04 ; Voice 0 SCRN
|
|
mov al,[DSPMem+04h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg05 ; Voice 0 ADSR (1)
|
|
mov al,[DSPMem+05h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg06 ; Voice 0 ADSR (2)
|
|
mov al,[DSPMem+06h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg07 ; Voice 0 GAIN
|
|
mov al,[DSPMem+07h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg08 ; Voice 0 ENVX
|
|
mov al,[DSPMem+08h]
|
|
and al,7Fh
|
|
ret
|
|
|
|
NEWSYM RDSPReg09 ; Voice 0 OUTX
|
|
mov al,[DSPMem+09h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg0A ;
|
|
mov al,[DSPMem+0Ah]
|
|
ret
|
|
|
|
NEWSYM RDSPReg0B ;
|
|
mov al,[DSPMem+0Bh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg0C ;
|
|
mov al,[DSPMem+0Ch]
|
|
ret
|
|
|
|
NEWSYM RDSPReg0D ;
|
|
mov al,[DSPMem+0Dh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg0E ;
|
|
mov al,[DSPMem+0Eh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg0F ; Voice 0 Echo coefficient
|
|
mov al,[DSPMem+0Fh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg10 ; Voice 1 Volume Left
|
|
mov al,[DSPMem+10h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg11 ; Voice 1 Volume Right
|
|
mov al,[DSPMem+11h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg12 ; Voice 1 Pitch Low
|
|
mov al,[DSPMem+012h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg13 ; Voice 1 Pitch High
|
|
mov al,[DSPMem+013h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg14 ; Voice 1 SCRN
|
|
mov al,[DSPMem+014h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg15 ; Voice 1 ADSR (1)
|
|
mov al,[DSPMem+015h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg16 ; Voice 1 ADSR (2)
|
|
mov al,[DSPMem+016h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg17 ; Voice 1 GAIN
|
|
mov al,[DSPMem+017h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg18 ; Voice 1 ENVX
|
|
mov al,[DSPMem+018h]
|
|
and al,7Fh
|
|
ret
|
|
|
|
NEWSYM RDSPReg19 ; Voice 1 OUTX
|
|
mov al,[DSPMem+019h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg1A ;
|
|
mov al,[DSPMem+01Ah]
|
|
ret
|
|
|
|
NEWSYM RDSPReg1B ;
|
|
mov al,[DSPMem+01Bh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg1C ;
|
|
mov al,[DSPMem+01Ch]
|
|
ret
|
|
|
|
NEWSYM RDSPReg1D ;
|
|
mov al,[DSPMem+01Dh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg1E ;
|
|
mov al,[DSPMem+01Eh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg1F ; Voice 1 Echo coefficient
|
|
mov al,[DSPMem+01Fh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg20 ; Voice 2 Volume Left
|
|
mov al,[DSPMem+20h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg21 ; Voice 2 Volume Right
|
|
mov al,[DSPMem+21h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg22 ; Voice 2 Pitch Low
|
|
mov al,[DSPMem+022h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg23 ; Voice 2 Pitch High
|
|
mov al,[DSPMem+023h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg24 ; Voice 2 SCRN
|
|
mov al,[DSPMem+024h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg25 ; Voice 2 ADSR (1)
|
|
mov al,[DSPMem+025h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg26 ; Voice 2 ADSR (2)
|
|
mov al,[DSPMem+026h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg27 ; Voice 2 GAIN
|
|
mov al,[DSPMem+027h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg28 ; Voice 2 ENVX
|
|
mov al,[DSPMem+028h]
|
|
and al,7Fh
|
|
ret
|
|
|
|
NEWSYM RDSPReg29 ; Voice 2 OUTX
|
|
mov al,[DSPMem+029h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg2A ;
|
|
mov al,[DSPMem+02Ah]
|
|
ret
|
|
|
|
NEWSYM RDSPReg2B ;
|
|
mov al,[DSPMem+02Bh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg2C ;
|
|
mov al,[DSPMem+02Ch]
|
|
ret
|
|
|
|
NEWSYM RDSPReg2D ;
|
|
mov al,[DSPMem+02Dh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg2E ;
|
|
mov al,[DSPMem+02Eh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg2F ; Voice 2 Echo coefficient
|
|
mov al,[DSPMem+02Fh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg30 ; Voice 3 Volume Left
|
|
mov al,[DSPMem+30h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg31 ; Voice 3 Volume Right
|
|
mov al,[DSPMem+31h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg32 ; Voice 3 Pitch Low
|
|
mov al,[DSPMem+032h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg33 ; Voice 3 Pitch High
|
|
mov al,[DSPMem+033h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg34 ; Voice 3 SCRN
|
|
mov al,[DSPMem+034h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg35 ; Voice 3 ADSR (1)
|
|
mov al,[DSPMem+035h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg36 ; Voice 3 ADSR (2)
|
|
mov al,[DSPMem+036h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg37 ; Voice 3 GAIN
|
|
mov al,[DSPMem+037h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg38 ; Voice 3 ENVX
|
|
mov al,[DSPMem+038h]
|
|
and al,7Fh
|
|
ret
|
|
|
|
NEWSYM RDSPReg39 ; Voice 3 OUTX
|
|
mov al,[DSPMem+039h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg3A ;
|
|
mov al,[DSPMem+03Ah]
|
|
ret
|
|
|
|
NEWSYM RDSPReg3B ;
|
|
mov al,[DSPMem+03Bh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg3C ;
|
|
mov al,[DSPMem+03Ch]
|
|
ret
|
|
|
|
NEWSYM RDSPReg3D ;
|
|
mov al,[DSPMem+03Dh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg3E ;
|
|
mov al,[DSPMem+03Eh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg3F ; Voice 3 Echo coefficient
|
|
mov al,[DSPMem+03Fh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg40 ; Voice 4 Volume Left
|
|
mov al,[DSPMem+40h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg41 ; Voice 4 Volume Right
|
|
mov al,[DSPMem+41h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg42 ; Voice 4 Pitch Low
|
|
mov al,[DSPMem+042h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg43 ; Voice 4 Pitch High
|
|
mov al,[DSPMem+043h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg44 ; Voice 4 SCRN
|
|
mov al,[DSPMem+044h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg45 ; Voice 4 ADSR (1)
|
|
mov al,[DSPMem+045h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg46 ; Voice 4 ADSR (2)
|
|
mov al,[DSPMem+046h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg47 ; Voice 4 GAIN
|
|
mov al,[DSPMem+047h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg48 ; Voice 4 ENVX
|
|
mov al,[DSPMem+048h]
|
|
and al,7Fh
|
|
ret
|
|
|
|
NEWSYM RDSPReg49 ; Voice 4 OUTX
|
|
mov al,[DSPMem+049h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg4A ;
|
|
mov al,[DSPMem+04Ah]
|
|
ret
|
|
|
|
NEWSYM RDSPReg4B ;
|
|
mov al,[DSPMem+04Bh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg4C ;
|
|
mov al,[DSPMem+04Ch]
|
|
ret
|
|
|
|
NEWSYM RDSPReg4D ;
|
|
mov al,[DSPMem+04Dh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg4E ;
|
|
mov al,[DSPMem+04Eh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg4F ; Voice 4 Echo coefficient
|
|
mov al,[DSPMem+04Fh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg50 ; Voice 5 Volume Left
|
|
mov al,[DSPMem+50h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg51 ; Voice 5 Volume Right
|
|
mov al,[DSPMem+51h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg52 ; Voice 5 Pitch Low
|
|
mov al,[DSPMem+052h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg53 ; Voice 5 Pitch High
|
|
mov al,[DSPMem+053h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg54 ; Voice 5 SCRN
|
|
mov al,[DSPMem+054h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg55 ; Voice 5 ADSR (1)
|
|
mov al,[DSPMem+055h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg56 ; Voice 5 ADSR (2)
|
|
mov al,[DSPMem+056h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg57 ; Voice 5 GAIN
|
|
mov al,[DSPMem+057h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg58 ; Voice 5 ENVX
|
|
mov al,[DSPMem+058h]
|
|
and al,7Fh
|
|
ret
|
|
|
|
NEWSYM RDSPReg59 ; Voice 5 OUTX
|
|
mov al,[DSPMem+059h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg5A ;
|
|
mov al,[DSPMem+05Ah]
|
|
ret
|
|
|
|
NEWSYM RDSPReg5B ;
|
|
mov al,[DSPMem+05Bh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg5C ;
|
|
mov al,[DSPMem+05Ch]
|
|
ret
|
|
|
|
NEWSYM RDSPReg5D ;
|
|
mov al,[DSPMem+05Dh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg5E ;
|
|
mov al,[DSPMem+05Eh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg5F ; Voice 5 Echo coefficient
|
|
mov al,[DSPMem+05Fh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg60 ; Voice 6 Volume Left
|
|
mov al,[DSPMem+60h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg61 ; Voice 6 Volume Right
|
|
mov al,[DSPMem+61h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg62 ; Voice 6 Pitch Low
|
|
mov al,[DSPMem+062h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg63 ; Voice 6 Pitch High
|
|
mov al,[DSPMem+063h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg64 ; Voice 6 SCRN
|
|
mov al,[DSPMem+064h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg65 ; Voice 6 ADSR (1)
|
|
mov al,[DSPMem+065h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg66 ; Voice 6 ADSR (2)
|
|
mov al,[DSPMem+066h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg67 ; Voice 6 GAIN
|
|
mov al,[DSPMem+067h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg68 ; Voice 6 ENVX
|
|
mov al,[DSPMem+068h]
|
|
and al,7Fh
|
|
ret
|
|
|
|
NEWSYM RDSPReg69 ; Voice 6 OUTX
|
|
mov al,[DSPMem+069h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg6A ;
|
|
mov al,[DSPMem+06Ah]
|
|
ret
|
|
|
|
NEWSYM RDSPReg6B ;
|
|
mov al,[DSPMem+06Bh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg6C ;
|
|
mov al,[DSPMem+06Ch]
|
|
ret
|
|
|
|
NEWSYM RDSPReg6D ;
|
|
mov al,[DSPMem+06Dh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg6E ;
|
|
mov al,[DSPMem+06Eh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg6F ; Voice 6 Echo coefficient
|
|
mov al,[DSPMem+06Fh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg70 ; Voice 7 Volume Left
|
|
mov al,[DSPMem+70h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg71 ; Voice 7 Volume Right
|
|
mov al,[DSPMem+71h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg72 ; Voice 7 Pitch Low
|
|
mov al,[DSPMem+072h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg73 ; Voice 7 Pitch High
|
|
mov al,[DSPMem+073h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg74 ; Voice 7 SCRN
|
|
mov al,[DSPMem+074h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg75 ; Voice 7 ADSR (1)
|
|
mov al,[DSPMem+075h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg76 ; Voice 7 ADSR (2)
|
|
mov al,[DSPMem+076h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg77 ; Voice 7 GAIN
|
|
mov al,[DSPMem+077h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg78 ; Voice 7 ENVX
|
|
mov al,[DSPMem+078h]
|
|
and al,7Fh
|
|
ret
|
|
|
|
NEWSYM RDSPReg79 ; Voice 7 OUTX
|
|
mov al,[DSPMem+079h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg7A ;
|
|
mov al,[DSPMem+07Ah]
|
|
ret
|
|
|
|
NEWSYM RDSPReg7B ;
|
|
mov al,[DSPMem+07Bh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg7C ;
|
|
mov al,[DSPMem+07Ch]
|
|
ret
|
|
|
|
NEWSYM RDSPReg7D ;
|
|
mov al,[DSPMem+07Dh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg7E ;
|
|
mov al,[DSPMem+07Eh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg7F ; Voice 7 Echo coefficient
|
|
mov al,[DSPMem+07Fh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg80 ;
|
|
mov al,[DSPMem+080h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg81 ;
|
|
mov al,[DSPMem+081h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg82 ;
|
|
mov al,[DSPMem+082h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg83 ;
|
|
mov al,[DSPMem+083h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg84 ;
|
|
mov al,[DSPMem+084h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg85 ;
|
|
mov al,[DSPMem+085h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg86 ;
|
|
mov al,[DSPMem+086h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg87 ;
|
|
mov al,[DSPMem+087h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg88 ;
|
|
mov al,[DSPMem+088h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg89 ;
|
|
mov al,[DSPMem+089h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg8A ;
|
|
mov al,[DSPMem+08Ah]
|
|
ret
|
|
|
|
NEWSYM RDSPReg8B ;
|
|
mov al,[DSPMem+08Bh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg8C ;
|
|
mov al,[DSPMem+08Ch]
|
|
ret
|
|
|
|
NEWSYM RDSPReg8D ;
|
|
mov al,[DSPMem+08Dh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg8E ;
|
|
mov al,[DSPMem+08Eh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg8F ;
|
|
mov al,[DSPMem+08Fh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg90 ;
|
|
mov al,[DSPMem+090h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg91 ;
|
|
mov al,[DSPMem+091h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg92 ;
|
|
mov al,[DSPMem+092h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg93 ;
|
|
mov al,[DSPMem+093h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg94 ;
|
|
mov al,[DSPMem+094h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg95 ;
|
|
mov al,[DSPMem+095h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg96 ;
|
|
mov al,[DSPMem+096h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg97 ;
|
|
mov al,[DSPMem+097h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg98 ;
|
|
mov al,[DSPMem+098h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg99 ;
|
|
mov al,[DSPMem+099h]
|
|
ret
|
|
|
|
NEWSYM RDSPReg9A ;
|
|
mov al,[DSPMem+09Ah]
|
|
ret
|
|
|
|
NEWSYM RDSPReg9B ;
|
|
mov al,[DSPMem+09Bh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg9C ;
|
|
mov al,[DSPMem+09Ch]
|
|
ret
|
|
|
|
NEWSYM RDSPReg9D ;
|
|
mov al,[DSPMem+09Dh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg9E ;
|
|
mov al,[DSPMem+09Eh]
|
|
ret
|
|
|
|
NEWSYM RDSPReg9F ;
|
|
mov al,[DSPMem+09Fh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegA0 ;
|
|
mov al,[DSPMem+0A0h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegA1 ;
|
|
mov al,[DSPMem+0A1h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegA2 ;
|
|
mov al,[DSPMem+0A2h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegA3 ;
|
|
mov al,[DSPMem+0A3h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegA4 ;
|
|
mov al,[DSPMem+0A4h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegA5 ;
|
|
mov al,[DSPMem+0A5h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegA6 ;
|
|
mov al,[DSPMem+0A6h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegA7 ;
|
|
mov al,[DSPMem+0A7h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegA8 ;
|
|
mov al,[DSPMem+0A8h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegA9 ;
|
|
mov al,[DSPMem+0A9h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegAA ;
|
|
mov al,[DSPMem+0AAh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegAB ;
|
|
mov al,[DSPMem+0ABh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegAC ;
|
|
mov al,[DSPMem+0ACh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegAD ;
|
|
mov al,[DSPMem+0ADh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegAE ;
|
|
mov al,[DSPMem+0AEh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegAF ;
|
|
mov al,[DSPMem+0AFh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegB0 ;
|
|
mov al,[DSPMem+0B0h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegB1 ;
|
|
mov al,[DSPMem+0B1h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegB2 ;
|
|
mov al,[DSPMem+0B2h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegB3 ;
|
|
mov al,[DSPMem+0B3h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegB4 ;
|
|
mov al,[DSPMem+0B4h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegB5 ;
|
|
mov al,[DSPMem+0B5h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegB6 ;
|
|
mov al,[DSPMem+0B6h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegB7 ;
|
|
mov al,[DSPMem+0B7h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegB8 ;
|
|
mov al,[DSPMem+0B8h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegB9 ;
|
|
mov al,[DSPMem+0B9h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegBA ;
|
|
mov al,[DSPMem+0BAh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegBB ;
|
|
mov al,[DSPMem+0BBh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegBC ;
|
|
mov al,[DSPMem+0BCh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegBD ;
|
|
mov al,[DSPMem+0BDh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegBE ;
|
|
mov al,[DSPMem+0BEh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegBF ;
|
|
mov al,[DSPMem+0BFh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegC0 ;
|
|
mov al,[DSPMem+0C0h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegC1 ;
|
|
mov al,[DSPMem+0C1h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegC2 ;
|
|
mov al,[DSPMem+0C2h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegC3 ;
|
|
mov al,[DSPMem+0C3h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegC4 ;
|
|
mov al,[DSPMem+0C4h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegC5 ;
|
|
mov al,[DSPMem+0C5h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegC6 ;
|
|
mov al,[DSPMem+0C6h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegC7 ;
|
|
mov al,[DSPMem+0C7h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegC8 ;
|
|
mov al,[DSPMem+0C8h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegC9 ;
|
|
mov al,[DSPMem+0C9h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegCA ;
|
|
mov al,[DSPMem+0CAh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegCB ;
|
|
mov al,[DSPMem+0CBh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegCC ;
|
|
mov al,[DSPMem+0CCh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegCD ;
|
|
mov al,[DSPMem+0CDh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegCE ;
|
|
mov al,[DSPMem+0CEh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegCF ;
|
|
mov al,[DSPMem+0CFh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegD0 ;
|
|
mov al,[DSPMem+0D0h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegD1 ;
|
|
mov al,[DSPMem+0D1h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegD2 ;
|
|
mov al,[DSPMem+0D2h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegD3 ;
|
|
mov al,[DSPMem+0D3h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegD4 ;
|
|
mov al,[DSPMem+0D4h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegD5 ;
|
|
mov al,[DSPMem+0D5h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegD6 ;
|
|
mov al,[DSPMem+0D6h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegD7 ;
|
|
mov al,[DSPMem+0D7h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegD8 ;
|
|
mov al,[DSPMem+0D8h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegD9 ;
|
|
mov al,[DSPMem+0D9h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegDA ;
|
|
mov al,[DSPMem+0DAh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegDB ;
|
|
mov al,[DSPMem+0DBh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegDC ;
|
|
mov al,[DSPMem+0DCh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegDD ;
|
|
mov al,[DSPMem+0DDh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegDE ;
|
|
mov al,[DSPMem+0DEh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegDF ;
|
|
mov al,[DSPMem+0DFh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegE0 ;
|
|
mov al,[DSPMem+0E0h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegE1 ;
|
|
mov al,[DSPMem+0E1h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegE2 ;
|
|
mov al,[DSPMem+0E2h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegE3 ;
|
|
mov al,[DSPMem+0E3h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegE4 ;
|
|
mov al,[DSPMem+0E4h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegE5 ;
|
|
mov al,[DSPMem+0E5h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegE6 ;
|
|
mov al,[DSPMem+0E6h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegE7 ;
|
|
mov al,[DSPMem+0E7h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegE8 ;
|
|
mov al,[DSPMem+0E8h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegE9 ;
|
|
mov al,[DSPMem+0E9h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegEA ;
|
|
mov al,[DSPMem+0EAh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegEB ;
|
|
mov al,[DSPMem+0EBh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegEC ;
|
|
mov al,[DSPMem+0ECh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegED ;
|
|
mov al,[DSPMem+0EDh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegEE ;
|
|
mov al,[DSPMem+0EEh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegEF ;
|
|
mov al,[DSPMem+0EFh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegF0 ;
|
|
mov al,[DSPMem+0F0h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegF1 ;
|
|
mov al,[DSPMem+0F1h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegF2 ;
|
|
mov al,[DSPMem+0F2h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegF3 ;
|
|
mov al,[DSPMem+0F3h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegF4 ;
|
|
mov al,[DSPMem+0F4h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegF5 ;
|
|
mov al,[DSPMem+0F5h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegF6 ;
|
|
mov al,[DSPMem+0F6h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegF7 ;
|
|
mov al,[DSPMem+0F7h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegF8 ;
|
|
mov al,[DSPMem+0F8h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegF9 ;
|
|
mov al,[DSPMem+0F9h]
|
|
ret
|
|
|
|
NEWSYM RDSPRegFA ;
|
|
mov al,[DSPMem+0FAh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegFB ;
|
|
mov al,[DSPMem+0FBh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegFC ;
|
|
mov al,[DSPMem+0FCh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegFD ;
|
|
mov al,[DSPMem+0FDh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegFE ;
|
|
mov al,[DSPMem+0FEh]
|
|
ret
|
|
|
|
NEWSYM RDSPRegFF ;
|
|
mov al,[DSPMem+0FFh]
|
|
ret
|
|
|
|
%macro ProcessGain 1
|
|
push eax
|
|
push ebx
|
|
push edx
|
|
test byte[DSPMem+07h+%1*10h],80h
|
|
jz near %%Direct
|
|
test byte[DSPMem+07h+%1*10h],40h
|
|
jnz near %%Increase
|
|
test byte[DSPMem+07h+%1*10h],20h
|
|
jz %%LinearDec
|
|
xor eax,eax
|
|
mov al,[DSPMem+07h+%1*10h]
|
|
and al,1Fh
|
|
mov ebx,[DecreaseRateExp+eax*4]
|
|
mov dword[Voice0EnvInc+%1*4],007FFFFFh
|
|
shr ebx,5
|
|
mov [Voice0Time+%1*4],ebx
|
|
mov [GainDecBendDataTime+%1*4],ebx
|
|
xor edx,edx
|
|
mov eax,127*65536
|
|
sub eax,118*65536
|
|
mov byte[GainDecBendDataPos+%1],0
|
|
mov byte[GainDecBendDataDat+%1],127
|
|
div ebx
|
|
neg eax
|
|
mov [Voice0IncNumber+%1*4],eax
|
|
pop edx
|
|
pop ebx
|
|
pop eax
|
|
mov byte[Voice0State+%1],7
|
|
ret
|
|
%%LinearDec
|
|
xor eax,eax
|
|
mov al,[DSPMem+07h+%1*10h]
|
|
and al,1Fh
|
|
mov ebx,[Decrease+eax*4]
|
|
mov dword[Voice0EnvInc+%1*4],007FFFFFh
|
|
mov [Voice0Time+%1*4],ebx
|
|
xor edx,edx
|
|
mov eax,127*65536
|
|
div ebx
|
|
neg eax
|
|
mov [Voice0IncNumber+%1*4],eax
|
|
pop edx
|
|
pop ebx
|
|
pop eax
|
|
mov byte[Voice0State+%1],5
|
|
ret
|
|
%%Increase
|
|
test byte[DSPMem+07h+%1*10h],20h
|
|
jz %%LinearInc
|
|
xor eax,eax
|
|
mov al,[DSPMem+07h+%1*10h]
|
|
and al,1Fh
|
|
mov ebx,[Increase+eax*4]
|
|
mov dword[Voice0EnvInc+%1*4],0
|
|
mov [Voice0Time+%1*4],ebx
|
|
xor edx,edx
|
|
mov eax,127*65536
|
|
div ebx
|
|
mov [Voice0IncNumber+%1*4],eax
|
|
mov ebx,[Voice0Time+%1*4]
|
|
mov eax,ebx
|
|
shr eax,2
|
|
sub ebx,eax
|
|
dec ebx
|
|
mov [Voice0Time+%1*4],ebx
|
|
pop edx
|
|
pop ebx
|
|
pop eax
|
|
mov byte[Voice0State+%1],6
|
|
ret
|
|
%%LinearInc
|
|
xor eax,eax
|
|
mov al,[DSPMem+07h+%1*10h]
|
|
and al,1Fh
|
|
mov ebx,[Increase+eax*4]
|
|
mov dword[Voice0EnvInc+%1*4],0
|
|
mov [Voice0Time+%1*4],ebx
|
|
xor edx,edx
|
|
mov eax,127*65536
|
|
div ebx
|
|
mov [Voice0IncNumber+%1*4],eax
|
|
pop edx
|
|
pop ebx
|
|
pop eax
|
|
mov byte[Voice0State+%1],3
|
|
ret
|
|
%%Direct
|
|
mov al,[DSPMem+07h+%1*10h]
|
|
and al,7Fh
|
|
mov dword[Voice0EnvInc+%1*4],0
|
|
mov [Voice0EnvInc+%1*4+2],al
|
|
mov dword[Voice0Time+%1*4],0FFFFFFFFh
|
|
mov dword[Voice0IncNumber+%1*4],0
|
|
pop edx
|
|
pop ebx
|
|
pop eax
|
|
mov byte[Voice0State+%1],4
|
|
ret
|
|
%endmacro
|
|
|
|
%macro ProcessGain2 1
|
|
push eax
|
|
push ebx
|
|
push edx
|
|
test byte[DSPMem+07h+%1*10h],80h
|
|
jz near %%Direct
|
|
test byte[DSPMem+07h+%1*10h],40h
|
|
jnz near %%Increase
|
|
test byte[DSPMem+07h+%1*10h],20h
|
|
jz %%LinearDec
|
|
xor eax,eax
|
|
mov al,[DSPMem+07h+%1*10h]
|
|
and al,1Fh
|
|
mov ebx,[DecreaseRateExp+eax*4]
|
|
shr ebx,5
|
|
mov [Voice0Time+%1*4],ebx
|
|
mov [GainDecBendDataTime+%1*4],ebx
|
|
xor edx,edx
|
|
mov dh,118
|
|
mov dl,[Voice0EnvInc+%1*4+2]
|
|
xor eax,eax
|
|
mov al,[VolumeConvTable+edx*2]
|
|
xor edx,edx
|
|
shl eax,16
|
|
mov dl,[Voice0EnvInc+%1*4+2]
|
|
neg eax
|
|
shl edx,16
|
|
add eax,edx
|
|
xor edx,edx
|
|
mov byte[GainDecBendDataPos+%1],0
|
|
div ebx
|
|
neg eax
|
|
mov [Voice0IncNumber+%1*4],eax
|
|
mov al,[Voice0EnvInc+%1*4+2]
|
|
mov [GainDecBendDataDat+%1],al
|
|
pop edx
|
|
pop ebx
|
|
pop eax
|
|
mov byte[Voice0State+%1],7
|
|
ret
|
|
%%LinearDec
|
|
xor eax,eax
|
|
mov al,[DSPMem+07h+%1*10h]
|
|
and al,1Fh
|
|
mov ebx,[Decrease+eax*4]
|
|
mov [Voice0Time+%1*4],ebx
|
|
xor edx,edx
|
|
xor eax,eax
|
|
mov al,[Voice0EnvInc+%1*4+2]
|
|
shl eax,16
|
|
div ebx
|
|
neg eax
|
|
mov [Voice0IncNumber+%1*4],eax
|
|
pop edx
|
|
pop ebx
|
|
pop eax
|
|
mov byte[Voice0State+%1],5
|
|
ret
|
|
%%Increase
|
|
test byte[DSPMem+07h+%1*10h],20h
|
|
jz %%LinearInc
|
|
xor eax,eax
|
|
mov al,[DSPMem+07h+%1*10h]
|
|
and al,1Fh
|
|
mov ebx,[Increase+eax*4]
|
|
mov [Voice0Time+%1*4],ebx
|
|
xor edx,edx
|
|
xor eax,eax
|
|
mov al,[Voice0EnvInc+%1*4+2]
|
|
inc al
|
|
test al,80h
|
|
jz %%noof
|
|
mov al,127
|
|
%%noof
|
|
xor al,127
|
|
shl eax,16
|
|
div ebx
|
|
mov [Voice0IncNumber+%1*4],eax
|
|
mov ebx,[Voice0Time+%1*4]
|
|
mov eax,ebx
|
|
shr eax,2
|
|
sub ebx,eax
|
|
dec ebx
|
|
mov [Voice0Time+%1*4],ebx
|
|
pop edx
|
|
pop ebx
|
|
pop eax
|
|
mov byte[Voice0State+%1],6
|
|
ret
|
|
%%LinearInc
|
|
xor eax,eax
|
|
mov al,[DSPMem+07h+%1*10h]
|
|
and al,1Fh
|
|
mov ebx,[Increase+eax*4]
|
|
mov [Voice0Time+%1*4],ebx
|
|
xor edx,edx
|
|
xor eax,eax
|
|
mov al,[Voice0EnvInc+%1*4+2]
|
|
inc al
|
|
test al,80h
|
|
jz %%noof2
|
|
mov al,127
|
|
%%noof2
|
|
xor al,127
|
|
shl eax,16
|
|
div ebx
|
|
mov [Voice0IncNumber+%1*4],eax
|
|
pop edx
|
|
pop ebx
|
|
pop eax
|
|
mov byte[Voice0State+%1],3
|
|
ret
|
|
%%Direct
|
|
mov al,[DSPMem+07h+%1*10h]
|
|
and al,7Fh
|
|
mov dword[Voice0EnvInc+%1*4],0
|
|
mov [Voice0EnvInc+%1*4+2],al
|
|
mov dword[Voice0Time+%1*4],0FFFFFFFFh
|
|
mov dword[Voice0IncNumber+%1*4],0
|
|
pop edx
|
|
pop ebx
|
|
pop eax
|
|
mov byte[Voice0State+%1],4
|
|
ret
|
|
%%end
|
|
pop edx
|
|
pop ebx
|
|
pop eax
|
|
ret
|
|
%endmacro
|
|
|
|
|
|
%macro SwitchSustain 1
|
|
push eax
|
|
push ebx
|
|
push edx
|
|
mov al,[Voice0EnvInc+%1*4+2]
|
|
mov [GainDecBendDataDat+%1],al
|
|
cmp byte[Voice0State+%1],8
|
|
je %%full
|
|
cmp byte[Voice0State+%1],2
|
|
jae %%nofull
|
|
%%full
|
|
mov byte[GainDecBendDataDat+%1],7Fh
|
|
%%nofull
|
|
mov al,[DSPMem+05h+%1*10h]
|
|
shr al,4
|
|
and eax,07h
|
|
mov edx,[DecayRate+eax*4]
|
|
xor eax,eax
|
|
mov al,[DSPMem+06h+%1*10h]
|
|
and al,1Fh
|
|
mov ebx,[SustainRate+eax*4]
|
|
cmp edx,ebx
|
|
jae near %%decayover
|
|
; ebx = total sustain time
|
|
xor eax,eax
|
|
mov al,[DSPMem+06h+%1*10h]
|
|
shr al,5
|
|
mov al,[AdsrSustLevLoc+eax]
|
|
; traverse through al entries in edx time
|
|
; then through 64-al entries in ebx-edx time
|
|
mov [AdsrBlocksLeft+%1],al
|
|
sub ebx,edx
|
|
push ebx
|
|
push eax
|
|
mov ebx,eax
|
|
mov eax,edx
|
|
xor edx,edx
|
|
or ebx,ebx
|
|
jz .oopszero
|
|
div ebx
|
|
.oopszero
|
|
mov [Voice0Time+%1*4],eax
|
|
mov [GainDecBendDataTime+%1*4],eax
|
|
pop eax
|
|
pop ebx
|
|
mov edx,ebx
|
|
mov ebx,64
|
|
sub bl,al
|
|
mov eax,edx
|
|
xor edx,edx
|
|
div ebx
|
|
mov [AdsrNextTimeDepth+%1*4],eax
|
|
mov dword[Voice0EnvInc+%1*4],0
|
|
mov al,[GainDecBendDataDat+%1]
|
|
mov [Voice0EnvInc+%1*4+2],al
|
|
mov ebx,[Voice0Time+%1*4]
|
|
xor edx,edx
|
|
|
|
mov dh,122
|
|
mov dl,[Voice0EnvInc+%1*4+2]
|
|
xor eax,eax
|
|
mov al,[VolumeConvTable+edx*2]
|
|
xor edx,edx
|
|
shl eax,16
|
|
mov dl,[Voice0EnvInc+%1*4+2]
|
|
neg eax
|
|
shl edx,16
|
|
add eax,edx
|
|
xor edx,edx
|
|
mov byte[GainDecBendDataPos+%1],0
|
|
div ebx
|
|
neg eax
|
|
mov [Voice0IncNumber+%1*4],eax
|
|
pop edx
|
|
pop ebx
|
|
pop eax
|
|
mov byte[Voice0State+%1],9
|
|
ret
|
|
%%decayover
|
|
sub edx,ebx
|
|
push ebx
|
|
mov eax,edx
|
|
xor ebx,ebx
|
|
mov bl,[DSPMem+06h+%1*10h]
|
|
shr bl,5
|
|
xor bl,07h
|
|
mul ebx
|
|
mov ebx,7
|
|
div ebx
|
|
pop ebx
|
|
add ebx,eax
|
|
mov dword[Voice0EnvInc+%1*4],007FFFFFh
|
|
shr ebx,5
|
|
mov [Voice0Time+%1*4],ebx
|
|
mov [GainDecBendDataTime+%1*4],ebx
|
|
xor edx,edx
|
|
|
|
mov dh,118
|
|
mov dl,[Voice0EnvInc+%1*4+2]
|
|
xor eax,eax
|
|
mov al,[VolumeConvTable+edx*2]
|
|
xor edx,edx
|
|
shl eax,16
|
|
mov dl,[Voice0EnvInc+%1*4+2]
|
|
neg eax
|
|
shl edx,16
|
|
add eax,edx
|
|
xor edx,edx
|
|
mov byte[GainDecBendDataPos+%1],0
|
|
div ebx
|
|
neg eax
|
|
mov [Voice0IncNumber+%1*4],eax
|
|
pop edx
|
|
pop ebx
|
|
pop eax
|
|
mov byte[Voice0State+%1],7
|
|
ret
|
|
%endmacro
|
|
|
|
%macro VoiceAdsr 1
|
|
test byte[MuteVoiceF],1 << %1
|
|
jnz near .nogain
|
|
cmp byte[Voice0State+%1],200
|
|
je near .nogain
|
|
cmp [DSPMem+05h+%1*10h],al
|
|
je near .nogain
|
|
test al,80h
|
|
jz near .gain
|
|
mov [DSPMem+05h+%1*10h],al
|
|
SwitchSustain %1
|
|
ret
|
|
.nogain
|
|
mov [DSPMem+05h+%1*10h],al
|
|
ret
|
|
.gain
|
|
cmp byte[Voice0Status+%1],1
|
|
jne .nogain
|
|
cmp word[DSPMem+06h+%1*10h],0A0E0h
|
|
je .nogain
|
|
test byte[DSPMem+05h+%1*10h],80h
|
|
jz near .gain2
|
|
cmp byte[Voice0State+%1],8
|
|
je .gain1
|
|
cmp byte[Voice0State+%1],2
|
|
jae near .gain2
|
|
.gain1
|
|
mov [DSPMem+05h+%1*10h],al
|
|
ProcessGain %1 ; Normal
|
|
ret
|
|
.gain2
|
|
mov [DSPMem+05h+%1*10h],al
|
|
cmp byte[Voice0State+%1],210
|
|
jne %%noendofsamp2
|
|
push eax
|
|
push ebx
|
|
mov al,%1
|
|
call VoiceStarter
|
|
mov dword[Voice0EnvInc+%1*4],007FFFFFh
|
|
pop ebx
|
|
pop eax
|
|
%%noendofsamp2
|
|
ProcessGain2 %1
|
|
ret
|
|
%endmacro
|
|
|
|
%macro VoiceAdsr2 1
|
|
test byte[MuteVoiceF],1 << %1
|
|
jnz near .noadsrswitch
|
|
cmp byte[Voice0State+%1],200
|
|
je near .noadsrswitch
|
|
cmp [DSPMem+06h+%1*10h],al
|
|
je near .noadsrswitch
|
|
mov [DSPMem+06h+%1*10h],al
|
|
test byte[DSPMem+05h+%1*10h],80h
|
|
jz near .noadsrswitch
|
|
SwitchSustain %1
|
|
ret
|
|
.noadsrswitch
|
|
mov [DSPMem+06h+%1*10h],al
|
|
ret
|
|
%endmacro
|
|
|
|
|
|
%macro VoiceGain 1
|
|
test byte[MuteVoiceF],1 << %1
|
|
jnz .nogain
|
|
cmp byte[Voice0State+%1],200
|
|
je .nogain
|
|
cmp [DSPMem+07h+%1*10h],al
|
|
je .nogain
|
|
mov [DSPMem+07h+%1*10h],al
|
|
cmp byte[Voice0Status+%1],1
|
|
jne .nogain
|
|
test byte[DSPMem+05h+%1*10h],80h
|
|
jz .gain
|
|
.nogain
|
|
mov [DSPMem+07h+%1*10h],al
|
|
ret
|
|
.gain
|
|
cmp byte[Voice0State+%1],210
|
|
jne %%noendofsamp
|
|
push eax
|
|
push ebx
|
|
mov al,%1
|
|
call VoiceStarter
|
|
pop ebx
|
|
pop eax
|
|
%%noendofsamp
|
|
ProcessGain2 %1
|
|
%endmacro
|
|
|
|
;Write DSP Registers functions
|
|
|
|
NEWSYM WDSPReg00 ; Voice 0 Volume Left
|
|
mov [DSPMem+00h],al
|
|
ret
|
|
mov [DSPMem+01h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg01 ; Voice 0 Volume Right
|
|
mov [DSPMem+01h],al
|
|
ret
|
|
mov [DSPMem+00h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg02 ; Voice 0 Pitch Low
|
|
mov [DSPMem+02h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg03 ; Voice 0 Pitch High
|
|
mov [DSPMem+03h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg04 ; Voice 0 SCRN
|
|
mov [DSPMem+04h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg05 ; Voice 0 ADSR (1)
|
|
VoiceAdsr 0
|
|
ret
|
|
|
|
NEWSYM WDSPReg06 ; Voice 0 ADSR (2)
|
|
VoiceAdsr2 0
|
|
ret
|
|
|
|
NEWSYM WDSPReg07 ; Voice 0 GAIN
|
|
VoiceGain 0
|
|
ret
|
|
|
|
NEWSYM WDSPReg08 ; Voice 0 ENVX
|
|
mov [DSPMem+08h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg09 ; Voice 0 OUTX
|
|
mov [DSPMem+09h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg0A ; Voice 0
|
|
mov [DSPMem+0Ah],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg0B ; Voice 0
|
|
mov [DSPMem+0Bh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg0C ; Voice 0
|
|
mov [DSPMem+0Ch],al
|
|
push eax
|
|
and eax,0FFh
|
|
mov al,[VolumeTableb+eax]
|
|
mov ah,[MusicVol]
|
|
mov al,[VolumeConvTable+eax*2]
|
|
mov [GlobalVL],al
|
|
pop eax
|
|
ret
|
|
|
|
NEWSYM WDSPReg0D ; Echo Feedback
|
|
mov [DSPMem+0Dh],al
|
|
push eax
|
|
and eax,0FFh
|
|
mov al,[VolumeTableb+eax]
|
|
mov [EchoFB],eax
|
|
pop eax
|
|
ret
|
|
|
|
NEWSYM WDSPReg0E ; Voice 0
|
|
mov [DSPMem+0Eh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg0F ; Voice 0 Echo coefficient
|
|
mov [DSPMem+0Fh],al
|
|
push eax
|
|
movsx eax,al
|
|
mov [FIRTAPVal0],eax
|
|
pop eax
|
|
ret
|
|
|
|
NEWSYM WDSPReg10 ; Voice 1 Volume Left
|
|
mov [DSPMem+10h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg11 ; Voice 1 Volume Right
|
|
mov [DSPMem+11h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg12 ; Voice 1 Pitch Low
|
|
mov [DSPMem+012h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg13 ; Voice 1 Pitch High
|
|
mov [DSPMem+013h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg14 ; Voice 1 SCRN
|
|
mov [DSPMem+14h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg15 ; Voice 1 ADSR (1)
|
|
VoiceAdsr 1
|
|
ret
|
|
|
|
NEWSYM WDSPReg16 ; Voice 1 ADSR (2)
|
|
VoiceAdsr2 1
|
|
ret
|
|
|
|
NEWSYM WDSPReg17 ; Voice 1 GAIN
|
|
VoiceGain 1
|
|
ret
|
|
|
|
NEWSYM WDSPReg18 ; Voice 1 ENVX
|
|
mov [DSPMem+018h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg19 ; Voice 1 OUTX
|
|
mov [DSPMem+019h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg1A ; Voice 1
|
|
mov [DSPMem+01Ah],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg1B ; Voice 1
|
|
mov [DSPMem+01Bh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg1C ; Voice 1
|
|
mov [DSPMem+01Ch],al
|
|
push eax
|
|
and eax,0FFh
|
|
mov al,[VolumeTableb+eax]
|
|
mov ah,[MusicVol]
|
|
mov al,[VolumeConvTable+eax*2]
|
|
mov [GlobalVR],al
|
|
pop eax
|
|
ret
|
|
|
|
NEWSYM WDSPReg1D ; Voice 1
|
|
mov [DSPMem+01Dh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg1E ; Voice 1
|
|
mov [DSPMem+01Eh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg1F ; Voice 1 Echo coefficient
|
|
mov [DSPMem+01Fh],al
|
|
push eax
|
|
movsx eax,al
|
|
mov [FIRTAPVal1],eax
|
|
pop eax
|
|
ret
|
|
|
|
NEWSYM WDSPReg20 ; Voice 2 Volume Left
|
|
mov [DSPMem+20h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg21 ; Voice 2 Volume Right
|
|
mov [DSPMem+21h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg22 ; Voice 2 Pitch Low
|
|
mov [DSPMem+022h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg23 ; Voice 2 Pitch High
|
|
mov [DSPMem+023h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg24 ; Voice 2 SCRN
|
|
mov [DSPMem+24h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg25 ; Voice 2 ADSR (1)
|
|
VoiceAdsr 2
|
|
ret
|
|
|
|
NEWSYM WDSPReg26 ; Voice 2 ADSR (2)
|
|
VoiceAdsr2 2
|
|
ret
|
|
|
|
NEWSYM WDSPReg27 ; Voice 2 GAIN
|
|
VoiceGain 2
|
|
ret
|
|
|
|
NEWSYM WDSPReg28 ; Voice 2 ENVX
|
|
mov [DSPMem+028h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg29 ; Voice 2 OUTX
|
|
mov [DSPMem+029h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg2A ; Voice 2
|
|
mov [DSPMem+02Ah],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg2B ; Voice 2
|
|
mov [DSPMem+02Bh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg2C ; Voice 2
|
|
mov [DSPMem+02Ch],al
|
|
push eax
|
|
and eax,0FFh
|
|
mov al,[VolumeTableb+eax]
|
|
mov ah,[MusicVol]
|
|
mov al,[VolumeConvTable+eax*2]
|
|
mov [EchoVL],al
|
|
pop eax
|
|
ret
|
|
|
|
NEWSYM WDSPReg2D ; Voice 2
|
|
mov [DSPMem+02Dh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg2E ; Voice 2
|
|
mov [DSPMem+02Eh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg2F ; Voice 2 Echo coefficient
|
|
mov [DSPMem+02Fh],al
|
|
push eax
|
|
movsx eax,al
|
|
mov [FIRTAPVal2],eax
|
|
pop eax
|
|
ret
|
|
|
|
NEWSYM WDSPReg30 ; Voice 3 Volume Left
|
|
mov [DSPMem+30h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg31 ; Voice 3 Volume Right
|
|
mov [DSPMem+31h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg32 ; Voice 3 Pitch Low
|
|
mov [DSPMem+032h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg33 ; Voice 3 Pitch High
|
|
mov [DSPMem+033h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg34 ; Voice 3 SCRN
|
|
mov [DSPMem+34h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg35 ; Voice 3 ADSR (1)
|
|
VoiceAdsr 3
|
|
ret
|
|
|
|
NEWSYM WDSPReg36 ; Voice 3 ADSR (2)
|
|
VoiceAdsr2 3
|
|
ret
|
|
|
|
NEWSYM WDSPReg37 ; Voice 3 GAIN
|
|
VoiceGain 3
|
|
ret
|
|
|
|
NEWSYM WDSPReg38 ; Voice 3 ENVX
|
|
mov [DSPMem+038h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg39 ; Voice 3 OUTX
|
|
mov [DSPMem+039h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg3A ; Voice 3
|
|
mov [DSPMem+03Ah],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg3B ; Voice 3
|
|
mov [DSPMem+03Bh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg3C ; Voice 3
|
|
mov [DSPMem+03Ch],al
|
|
push eax
|
|
and eax,0FFh
|
|
mov al,[VolumeTableb+eax]
|
|
mov ah,[MusicVol]
|
|
mov al,[VolumeConvTable+eax*2]
|
|
mov [EchoVR],al
|
|
pop eax
|
|
ret
|
|
|
|
NEWSYM WDSPReg3D ; Voice 3
|
|
mov byte[Voice0Noise],0
|
|
mov byte[Voice1Noise],0
|
|
mov byte[Voice2Noise],0
|
|
mov byte[Voice3Noise],0
|
|
mov byte[Voice4Noise],0
|
|
mov byte[Voice5Noise],0
|
|
mov byte[Voice6Noise],0
|
|
mov byte[Voice7Noise],0
|
|
test al,1
|
|
jz .TestVoice1
|
|
mov byte[Voice0Noise],1
|
|
.TestVoice1
|
|
test al,2
|
|
jz .TestVoice2
|
|
mov byte[Voice1Noise],1
|
|
.TestVoice2
|
|
test al,4
|
|
jz .TestVoice3
|
|
mov byte[Voice2Noise],1
|
|
.TestVoice3
|
|
test al,8
|
|
jz .TestVoice4
|
|
mov byte[Voice3Noise],1
|
|
.TestVoice4
|
|
test al,16
|
|
jz .TestVoice5
|
|
mov byte[Voice4Noise],1
|
|
.TestVoice5
|
|
test al,32
|
|
jz .TestVoice6
|
|
mov byte[Voice5Noise],1
|
|
.TestVoice6
|
|
test al,64
|
|
jz .TestVoice7
|
|
mov byte[Voice6Noise],1
|
|
.TestVoice7
|
|
test al,128
|
|
jz .TestVoice8
|
|
mov byte[Voice7Noise],1
|
|
.TestVoice8
|
|
mov [DSPMem+03Dh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg3E ; Voice 3
|
|
mov [DSPMem+03Eh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg3F ; Voice 3 Echo coefficient
|
|
mov [DSPMem+03Fh],al
|
|
push eax
|
|
movsx eax,al
|
|
mov [FIRTAPVal3],eax
|
|
pop eax
|
|
ret
|
|
|
|
NEWSYM WDSPReg40 ; Voice 4 Volume Left
|
|
mov [DSPMem+40h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg41 ; Voice 4 Volume Right
|
|
mov [DSPMem+41h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg42 ; Voice 4 Pitch Low
|
|
mov [DSPMem+042h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg43 ; Voice 4 Pitch High
|
|
mov [DSPMem+043h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg44 ; Voice 4 SCRN
|
|
mov [DSPMem+44h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg45 ; Voice 4 ADSR (1)
|
|
VoiceAdsr 4
|
|
ret
|
|
|
|
NEWSYM WDSPReg46 ; Voice 4 ADSR (2)
|
|
VoiceAdsr2 4
|
|
ret
|
|
|
|
NEWSYM WDSPReg47 ; Voice 4 GAIN
|
|
VoiceGain 4
|
|
ret
|
|
|
|
NEWSYM WDSPReg48 ; Voice 4 ENVX
|
|
mov [DSPMem+048h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg49 ; Voice 4 OUTX
|
|
mov [DSPMem+049h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg4A ; Voice 4
|
|
mov [DSPMem+04Ah],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg4B ; Voice 4
|
|
mov [DSPMem+04Bh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg4C ; Key On
|
|
push ebx
|
|
mov bl,[MuteVoiceF]
|
|
xor bl,0FFh
|
|
and bl,al
|
|
|
|
xor byte[DSPMem+05Ch],0FFh
|
|
jnz .notzero
|
|
and bl,[DSPMem+05Ch]
|
|
.notzero
|
|
xor byte[DSPMem+05Ch],0FFh
|
|
|
|
or byte[KeyOnStA],bl
|
|
pop ebx
|
|
test al,80h
|
|
jz .nokon
|
|
inc byte[SoundTest]
|
|
.nokon
|
|
mov [DSPMem+04Ch],al
|
|
push eax
|
|
xor al,0FFh
|
|
and byte[DSPMem+07Ch],al
|
|
pop eax
|
|
ret
|
|
|
|
NEWSYM ProcessKeyOn
|
|
test al,1
|
|
jz .TestVoice1
|
|
push edx
|
|
call Voice0Start
|
|
pop edx
|
|
.TestVoice1
|
|
test al,2
|
|
jz .TestVoice2
|
|
push edx
|
|
call Voice1Start
|
|
pop edx
|
|
.TestVoice2
|
|
test al,4
|
|
jz .TestVoice3
|
|
push edx
|
|
call Voice2Start
|
|
pop edx
|
|
.TestVoice3
|
|
test al,8
|
|
jz .TestVoice4
|
|
push edx
|
|
call Voice3Start
|
|
pop edx
|
|
.TestVoice4
|
|
test al,16
|
|
jz .TestVoice5
|
|
push edx
|
|
call Voice4Start
|
|
pop edx
|
|
.TestVoice5
|
|
test al,32
|
|
jz .TestVoice6
|
|
push edx
|
|
call Voice5Start
|
|
pop edx
|
|
.TestVoice6
|
|
test al,64
|
|
jz .TestVoice7
|
|
push edx
|
|
call Voice6Start
|
|
pop edx
|
|
.TestVoice7
|
|
test al,128
|
|
jz .TestVoice8
|
|
push edx
|
|
call Voice7Start
|
|
pop edx
|
|
.TestVoice8
|
|
test al,0FFh
|
|
jz .novoice
|
|
mov byte[keyonsn],1
|
|
.novoice
|
|
ret
|
|
|
|
NEWSYM WDSPReg4D ; Voice 4
|
|
mov [DSPMem+04Dh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg4E ; Voice 4
|
|
mov [DSPMem+04Eh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg4F ; Voice 4 Echo coefficient
|
|
mov [DSPMem+04Fh],al
|
|
push eax
|
|
movsx eax,al
|
|
mov [FIRTAPVal4],eax
|
|
pop eax
|
|
ret
|
|
|
|
NEWSYM WDSPReg50 ; Voice 5 Volume Left
|
|
mov [DSPMem+50h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg51 ; Voice 5 Volume Right
|
|
mov [DSPMem+51h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg52 ; Voice 5 Pitch Low
|
|
mov [DSPMem+052h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg53 ; Voice 5 Pitch High
|
|
mov [DSPMem+053h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg54 ; Voice 5 SCRN
|
|
mov [DSPMem+54h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg55 ; Voice 5 ADSR (1)
|
|
VoiceAdsr 5
|
|
ret
|
|
|
|
NEWSYM WDSPReg56 ; Voice 5 ADSR (2)
|
|
VoiceAdsr2 5
|
|
ret
|
|
|
|
NEWSYM WDSPReg57 ; Voice 5 GAIN
|
|
VoiceGain 5
|
|
ret
|
|
|
|
NEWSYM WDSPReg58 ; Voice 5 ENVX
|
|
mov [DSPMem+058h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg59 ; Voice 5 OUTX
|
|
mov [DSPMem+059h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg5A ; Voice 5
|
|
mov [DSPMem+05Ah],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg5B ; Voice 5
|
|
mov [DSPMem+05Bh],al
|
|
ret
|
|
|
|
%macro keyoffm 1
|
|
test byte[MuteVoiceF],1 << %1
|
|
jnz %%nokeyoff
|
|
push eax
|
|
push edx
|
|
push ebx
|
|
mov dword[Voice0Time+%1*4],255
|
|
mov eax,[Voice0EnvInc+%1*4]
|
|
shr eax,8
|
|
neg eax
|
|
mov [Voice0IncNumber+%1*4],eax
|
|
mov byte[Voice0State+%1],200
|
|
mov byte[DSPMem+08h+%1*10h],0
|
|
or byte[DSPMem+7Ch],1 << %1
|
|
pop ebx
|
|
pop edx
|
|
pop eax
|
|
%%nokeyoff
|
|
%endmacro
|
|
|
|
NEWSYM WDSPReg5C ; Key Off
|
|
push eax
|
|
xor al,0FFh
|
|
and byte[KeyOnStA],al
|
|
and byte[KeyOnStB],al
|
|
pop eax
|
|
test al,1
|
|
jz .TestVoice1
|
|
keyoffm 0
|
|
.TestVoice1
|
|
test al,2
|
|
jz .TestVoice2
|
|
keyoffm 1
|
|
.TestVoice2
|
|
test al,4
|
|
jz .TestVoice3
|
|
keyoffm 2
|
|
.TestVoice3
|
|
test al,8
|
|
jz .TestVoice4
|
|
keyoffm 3
|
|
.TestVoice4
|
|
test al,16
|
|
jz .TestVoice5
|
|
keyoffm 4
|
|
.TestVoice5
|
|
test al,32
|
|
jz .TestVoice6
|
|
keyoffm 5
|
|
.TestVoice6
|
|
test al,64
|
|
jz .TestVoice7
|
|
keyoffm 6
|
|
.TestVoice7
|
|
test al,128
|
|
jz .TestVoice8
|
|
keyoffm 7
|
|
.TestVoice8
|
|
mov [DSPMem+05Ch],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg5D ; Voice 5
|
|
mov [DSPMem+05Dh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg5E ; Voice 5
|
|
mov [DSPMem+05Eh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg5F ; Voice 5 Echo coefficient
|
|
mov [DSPMem+05Fh],al
|
|
push eax
|
|
movsx eax,al
|
|
mov [FIRTAPVal5],eax
|
|
pop eax
|
|
ret
|
|
|
|
NEWSYM WDSPReg60 ; Voice 6 Volume Left
|
|
mov [DSPMem+60h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg61 ; Voice 6 Volume Right
|
|
mov [DSPMem+61h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg62 ; Voice 6 Pitch Low
|
|
mov [DSPMem+062h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg63 ; Voice 6 Pitch High
|
|
mov [DSPMem+063h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg64 ; Voice 6 SCRN
|
|
mov [DSPMem+64h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg65 ; Voice 6 ADSR (1)
|
|
VoiceAdsr 6
|
|
ret
|
|
|
|
NEWSYM WDSPReg66 ; Voice 6 ADSR (2)
|
|
VoiceAdsr2 6
|
|
ret
|
|
|
|
NEWSYM WDSPReg67 ; Voice 6 GAIN
|
|
VoiceGain 6
|
|
ret
|
|
|
|
NEWSYM WDSPReg68 ; Voice 6 ENVX
|
|
mov [DSPMem+068h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg69 ; Voice 6 OUTX
|
|
mov [DSPMem+069h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg6A ; Voice 6
|
|
mov [DSPMem+06Ah],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg6B ; Voice 6
|
|
mov [DSPMem+06Bh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg6C ; Voice 6
|
|
mov [DSPMem+06Ch],al
|
|
and byte[DSPMem+06Ch],7Fh
|
|
test al,0C0h
|
|
jz .NoRes2
|
|
mov byte[Voice0Status],0
|
|
mov byte[Voice1Status],0
|
|
mov byte[Voice2Status],0
|
|
mov byte[Voice3Status],0
|
|
mov byte[Voice4Status],0
|
|
mov byte[Voice5Status],0
|
|
mov byte[Voice6Status],0
|
|
mov byte[Voice7Status],0
|
|
.NoRes2
|
|
push eax
|
|
push ebx
|
|
push ecx
|
|
push edx
|
|
and eax,1Fh
|
|
xor edx,edx
|
|
mov eax,[NoiseSpeeds+eax*4]
|
|
Mul dword[dspPAdj]
|
|
ShrD EAX, EDX, 17
|
|
mov [NoiseInc],eax
|
|
pop edx
|
|
pop ecx
|
|
pop ebx
|
|
pop eax
|
|
ret
|
|
|
|
NEWSYM WDSPReg6D ; Voice 6
|
|
mov [DSPMem+06Dh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg6E ; Voice 6
|
|
mov [DSPMem+06Eh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg6F ; Voice 6 Echo coefficient
|
|
mov [DSPMem+06Fh],al
|
|
push eax
|
|
movsx eax,al
|
|
mov [FIRTAPVal6],eax
|
|
pop eax
|
|
ret
|
|
|
|
NEWSYM WDSPReg70 ; Voice 7 Volume Left
|
|
mov [DSPMem+70h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg71 ; Voice 7 Volume Right
|
|
mov [DSPMem+71h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg72 ; Voice 7 Pitch Low
|
|
mov [DSPMem+072h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg73 ; Voice 7 Pitch High
|
|
mov [DSPMem+073h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg74 ; Voice 7 SCRN
|
|
mov [DSPMem+74h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg75 ; Voice 7 ADSR (1)
|
|
VoiceAdsr 7
|
|
ret
|
|
|
|
NEWSYM WDSPReg76 ; Voice 7 ADSR (2)
|
|
VoiceAdsr2 7
|
|
ret
|
|
|
|
NEWSYM WDSPReg77 ; Voice 7 GAIN
|
|
VoiceGain 7
|
|
ret
|
|
|
|
NEWSYM WDSPReg78 ; Voice 7 ENVX
|
|
mov [DSPMem+078h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg79 ; Voice 7 OUTX
|
|
mov [DSPMem+079h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg7A ; Voice 7
|
|
mov [DSPMem+07Ah],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg7B ; Voice 7
|
|
mov [DSPMem+07Bh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg7C ; ENDX
|
|
mov byte[DSPMem+07Ch],0
|
|
ret
|
|
|
|
NEWSYM WDSPReg7D ; Echo Delay
|
|
mov [DSPMem+07Dh],al
|
|
push ebx
|
|
mov ebx,eax
|
|
and ebx,0Fh
|
|
mov ebx,[EchoRate+ebx*4]
|
|
mov [MaxEcho],ebx
|
|
pop ebx
|
|
ret
|
|
|
|
NEWSYM WDSPReg7E ; Voice 7
|
|
mov [DSPMem+07Eh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg7F ; Voice 7 Echo coefficient
|
|
mov [DSPMem+07Fh],al
|
|
push eax
|
|
movsx eax,al
|
|
mov [FIRTAPVal7],eax
|
|
pop eax
|
|
ret
|
|
|
|
NEWSYM WDSPReg80 ;
|
|
mov [DSPMem+080h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg81 ;
|
|
mov [DSPMem+081h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg82 ;
|
|
mov [DSPMem+082h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg83 ;
|
|
mov [DSPMem+083h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg84 ;
|
|
mov [DSPMem+084h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg85 ;
|
|
mov [DSPMem+085h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg86 ;
|
|
mov [DSPMem+086h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg87 ;
|
|
mov [DSPMem+087h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg88 ;
|
|
mov [DSPMem+088h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg89 ;
|
|
mov [DSPMem+089h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg8A ;
|
|
mov [DSPMem+08Ah],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg8B ;
|
|
mov [DSPMem+08Bh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg8C ;
|
|
mov [DSPMem+08Ch],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg8D ;
|
|
mov [DSPMem+08Dh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg8E ;
|
|
mov [DSPMem+08Eh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg8F ;
|
|
mov [DSPMem+08Fh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg90 ;
|
|
mov [DSPMem+090h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg91 ;
|
|
mov [DSPMem+091h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg92 ;
|
|
mov [DSPMem+092h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg93 ;
|
|
mov [DSPMem+093h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg94 ;
|
|
mov [DSPMem+094h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg95 ;
|
|
mov [DSPMem+095h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg96 ;
|
|
mov [DSPMem+096h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg97 ;
|
|
mov [DSPMem+097h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg98 ;
|
|
mov [DSPMem+098h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg99 ;
|
|
mov [DSPMem+099h],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg9A ;
|
|
mov [DSPMem+09Ah],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg9B ;
|
|
mov [DSPMem+09Bh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg9C ;
|
|
mov [DSPMem+09Ch],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg9D ;
|
|
mov [DSPMem+09Dh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg9E ;
|
|
mov [DSPMem+09Eh],al
|
|
ret
|
|
|
|
NEWSYM WDSPReg9F ;
|
|
mov [DSPMem+09Fh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegA0 ;
|
|
mov [DSPMem+0A0h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegA1 ;
|
|
mov [DSPMem+0A1h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegA2 ;
|
|
mov [DSPMem+0A2h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegA3 ;
|
|
mov [DSPMem+0A3h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegA4 ;
|
|
mov [DSPMem+0A4h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegA5 ;
|
|
mov [DSPMem+0A5h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegA6 ;
|
|
mov [DSPMem+0A6h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegA7 ;
|
|
mov [DSPMem+0A7h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegA8 ;
|
|
mov [DSPMem+0A8h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegA9 ;
|
|
mov [DSPMem+0A9h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegAA ;
|
|
mov [DSPMem+0AAh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegAB ;
|
|
mov [DSPMem+0ABh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegAC ;
|
|
mov [DSPMem+0ACh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegAD ;
|
|
mov [DSPMem+0ADh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegAE ;
|
|
mov [DSPMem+0AEh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegAF ;
|
|
mov [DSPMem+0AFh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegB0 ;
|
|
mov [DSPMem+0B0h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegB1 ;
|
|
mov [DSPMem+0B1h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegB2 ;
|
|
mov [DSPMem+0B2h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegB3 ;
|
|
mov [DSPMem+0B3h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegB4 ;
|
|
mov [DSPMem+0B4h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegB5 ;
|
|
mov [DSPMem+0B5h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegB6 ;
|
|
mov [DSPMem+0B6h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegB7 ;
|
|
mov [DSPMem+0B7h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegB8 ;
|
|
mov [DSPMem+0B8h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegB9 ;
|
|
mov [DSPMem+0B9h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegBA ;
|
|
mov [DSPMem+0BAh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegBB ;
|
|
mov [DSPMem+0BBh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegBC ;
|
|
mov [DSPMem+0BCh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegBD ;
|
|
mov [DSPMem+0BDh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegBE ;
|
|
mov [DSPMem+0BEh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegBF ;
|
|
mov [DSPMem+0BFh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegC0 ;
|
|
mov [DSPMem+0C0h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegC1 ;
|
|
mov [DSPMem+0C1h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegC2 ;
|
|
mov [DSPMem+0C2h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegC3 ;
|
|
mov [DSPMem+0C3h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegC4 ;
|
|
mov [DSPMem+0C4h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegC5 ;
|
|
mov [DSPMem+0C5h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegC6 ;
|
|
mov [DSPMem+0C6h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegC7 ;
|
|
mov [DSPMem+0C7h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegC8 ;
|
|
mov [DSPMem+0C8h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegC9 ;
|
|
mov [DSPMem+0C9h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegCA ;
|
|
mov [DSPMem+0CAh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegCB ;
|
|
mov [DSPMem+0CBh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegCC ;
|
|
mov [DSPMem+0CCh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegCD ;
|
|
mov [DSPMem+0CDh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegCE ;
|
|
mov [DSPMem+0CEh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegCF ;
|
|
mov [DSPMem+0CFh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegD0 ;
|
|
mov [DSPMem+0D0h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegD1 ;
|
|
mov [DSPMem+0D1h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegD2 ;
|
|
mov [DSPMem+0D2h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegD3 ;
|
|
mov [DSPMem+0D3h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegD4 ;
|
|
mov [DSPMem+0D4h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegD5 ;
|
|
mov [DSPMem+0D5h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegD6 ;
|
|
mov [DSPMem+0D6h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegD7 ;
|
|
mov [DSPMem+0D7h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegD8 ;
|
|
mov [DSPMem+0D8h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegD9 ;
|
|
mov [DSPMem+0D9h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegDA ;
|
|
mov [DSPMem+0DAh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegDB ;
|
|
mov [DSPMem+0DBh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegDC ;
|
|
mov [DSPMem+0DCh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegDD ;
|
|
mov [DSPMem+0DDh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegDE ;
|
|
mov [DSPMem+0DEh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegDF ;
|
|
mov [DSPMem+0DFh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegE0 ;
|
|
mov [DSPMem+0E0h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegE1 ;
|
|
mov [DSPMem+0E1h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegE2 ;
|
|
mov [DSPMem+0E2h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegE3 ;
|
|
mov [DSPMem+0E3h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegE4 ;
|
|
mov [DSPMem+0E4h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegE5 ;
|
|
mov [DSPMem+0E5h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegE6 ;
|
|
mov [DSPMem+0E6h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegE7 ;
|
|
mov [DSPMem+0E7h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegE8 ;
|
|
mov [DSPMem+0E8h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegE9 ;
|
|
mov [DSPMem+0E9h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegEA ;
|
|
mov [DSPMem+0EAh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegEB ;
|
|
mov [DSPMem+0EBh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegEC ;
|
|
mov [DSPMem+0ECh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegED ;
|
|
mov [DSPMem+0EDh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegEE ;
|
|
mov [DSPMem+0EEh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegEF ;
|
|
mov [DSPMem+0EFh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegF0 ;
|
|
mov [DSPMem+0F0h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegF1 ;
|
|
mov [DSPMem+0F1h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegF2 ;
|
|
mov [DSPMem+0F2h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegF3 ;
|
|
mov [DSPMem+0F3h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegF4 ;
|
|
mov [DSPMem+0F4h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegF5 ;
|
|
mov [DSPMem+0F5h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegF6 ;
|
|
mov [DSPMem+0F6h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegF7 ;
|
|
mov [DSPMem+0F7h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegF8 ;
|
|
mov [DSPMem+0F8h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegF9 ;
|
|
mov [DSPMem+0F9h],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegFA ;
|
|
mov [DSPMem+0FAh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegFB ;
|
|
mov [DSPMem+0FBh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegFC ;
|
|
mov [DSPMem+0FCh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegFD ;
|
|
mov [DSPMem+0FDh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegFE ;
|
|
mov [DSPMem+0FEh],al
|
|
ret
|
|
|
|
NEWSYM WDSPRegFF ;
|
|
mov [DSPMem+0FFh],al
|
|
ret
|
|
|
|
|