summaryrefslogtreecommitdiff
path: root/tutorials/sndkit/sblive/emu10k.dsp
diff options
context:
space:
mode:
Diffstat (limited to 'tutorials/sndkit/sblive/emu10k.dsp')
-rw-r--r--tutorials/sndkit/sblive/emu10k.dsp378
1 files changed, 378 insertions, 0 deletions
diff --git a/tutorials/sndkit/sblive/emu10k.dsp b/tutorials/sndkit/sblive/emu10k.dsp
new file mode 100644
index 0000000..5bb6022
--- /dev/null
+++ b/tutorials/sndkit/sblive/emu10k.dsp
@@ -0,0 +1,378 @@
+//
+
+// DSP code for SB Live (C) 4Front Technologies 2001. All rights reserved.
+
+#define HAVE_EQ
+#define HAVE_SURR_EQ
+
+#define COPY(a,b) ACC3(a, b, 0, 0)
+
+// Temporary variables
+
+.gpr TMP_L
+.gpr TMP_R
+.gpr PCMTMP_L
+.gpr PCMTMP_R
+.gpr S_SUM_L
+.gpr S_SUM_R
+.gpr AUX_L
+.gpr AUX_R
+.gpr MIC_L
+.gpr MIC_R
+.gpr VUTMP
+.gpr VUTMP2
+.gpr CENTER_TMP
+.gpr LFE_TMP
+.gpr SURR_TMP_R
+.gpr SURR_TMP_L
+#ifdef AUDIGY
+.gpr SPDIF_TMP_L
+.gpr SPDIF_TMP_R
+#endif
+
+// Some parameters that are currently predefined by the assembler
+//.parm PCM 100 stereo
+//.parm MAIN 100 stereo VOL
+
+#ifdef HAVE_EQ
+#include "equalizer.mac"
+#endif
+
+// Monitor volumes and peak meters
+
+#ifdef HAVE_EQ
+.parm EQUALIZER 0 group
+ INCLUDE_EQPARMS
+#endif
+
+.parm FRONT 0 group
+.parm SPDINVOL 100 mono SPDIF
+.parm SPDINMONVU 0 stereopeak -
+.parm CDSPDINVOL 100 mono DIGCD
+.parm CDSPDINMONVU 0 stereopeak -
+.parm AC97VOL 0 mono AC97
+.parm AC97MONVU 0 stereopeak -
+.parm FRONTPCM 100 mono PCM
+.parm FRONTPCMVU 0 stereopeak -
+.parm FRONTAUX 100 mono AUX
+.parm FRONTAUXVU 0 stereopeak -
+#ifdef AUDIGY
+.parm FRONTMIC 100 mono MIC
+.parm FRONTMICVU 0 stereopeak -
+#endif
+.parm FRONTVOL 100 stereo VOL
+.parm FRONTVU 0 stereopeak -
+
+.parm SURR 0 group
+.parm R_SPDINVOL 0 mono SPDIF
+.parm R_SPDINMONVU 0 stereopeak -
+.parm R_CDSPDINVOL 0 mono DIGCD
+.parm R_CDSPDINMONVU 0 stereopeak -
+.parm R_AC97VOL 0 mono AC97
+.parm R_AC97MONVU 0 stereopeak -
+.parm SURRPCM 100 mono PCM
+.parm SURRPCMVU 0 stereopeak -
+.parm SURRAUX 0 mono AUX
+.parm SURRAUXVU 0 stereopeak -
+#ifdef AUDIGY
+.parm SURRMIC 100 mono MIC
+.parm SURRMICVU 0 stereopeak -
+#endif
+.parm SURRVOL 100 stereo VOL
+.parm SURRVU 0 stereopeak -
+
+// Recording volumes and VU meters
+.parm RECORD 0 group
+.parm SPDIFREC 100 mono SPDIF
+.parm SPDIFVU 0 stereopeak -
+.parm CDSPDIFREC 100 mono DIGCD
+.parm CDVU 0 stereopeak -
+.parm AC97REC 100 mono AC97
+.parm AC97VU 0 stereopeak -
+.parm LOOP 0 mono PCM
+.parm LOOPVU 0 stereopeak -
+.parm RECAUX 100 mono AUX
+.parm RECAUXVU 0 stereopeak -
+#ifdef AUDIGY
+.parm RECMIC 0 mono MIC
+.parm RECMICVU 0 stereopeak -
+#endif
+.parm RECVOL 100 stereo VOL
+.parm RECVU 0 stereopeak -
+
+// Dummy placeholders for the main VU meter.
+.gpr VU_L
+.gpr VU_R
+
+#ifdef AUDIGY
+#include "emu10k2.mac"
+#else
+#include "emu10k1.mac"
+#endif
+
+#ifdef AUDIGY
+.parm _PASSTHROUGH 0 onoff;
+#endif
+
+#ifdef HAVE_EQ
+ INCLUDE_EQVARS
+ INCLUDE_DELAYS(L)
+ INCLUDE_DELAYS(R)
+# ifdef HAVE_SURR_EQ
+ INCLUDE_DELAYS(SL)
+ INCLUDE_DELAYS(SR)
+# endif
+#endif
+
+#include "vu.mac"
+
+#ifdef AUDIGY
+// Take wavetable engine front sends (0,1)
+ MACINTS(TMP_L, 0, SEND_L, 1)
+ MACINTS(TMP_R, 0, SEND_R, 1)
+ MACS(PCMTMP_L, 0, TMP_L, PCM_L)
+ MACS(PCMTMP_R, 0, TMP_R, PCM_R)
+
+// Take raw S/PDIF from the dedicated sends
+ COPY(SPDIF_TMP_L, SPDIF_L)
+ COPY(SPDIF_TMP_R, SPDIF_R)
+
+// Do the same for surround and rear speaker outputs (sum them together)
+ SUM(S_SUM_L, SEND_SL, SEND_RL, 0)
+ SUM(S_SUM_R, SEND_SR, SEND_RR, 0)
+ MACINTS(CENTER_TMP, 0, SEND_C, 1)
+ MACINTS(LFE_TMP, 0, SEND_W, 1)
+ MACS(S_SUM_L, 0, S_SUM_L, PCM_L)
+ MACS(S_SUM_R, 0, S_SUM_R, PCM_R)
+#else
+// Take wavetable engine front sends (0,1) and multiply them by 4 to boost volume
+ MACINTS(TMP_L, 0, SEND_L, 4)
+ MACINTS(TMP_R, 0, SEND_R, 4)
+ MACS(PCMTMP_L, 0, TMP_L, PCM_L)
+ MACS(PCMTMP_R, 0, TMP_R, PCM_R)
+
+// Do the same for rear outputs (2,3)
+ MACINTS(S_SUM_L, 0, SEND_SL, 4)
+ MACINTS(S_SUM_R, 0, SEND_SR, 4)
+ MACS(S_SUM_L, 0, S_SUM_L, PCM_L)
+ MACS(S_SUM_R, 0, S_SUM_R, PCM_R)
+#endif
+
+//
+// Auxiliary input monitors (front channel)
+//
+
+ MACS(AUX_L, 0, PCMTMP_L, FRONTPCM)
+ MACS(AUX_R, 0, PCMTMP_R, FRONTPCM)
+ VU(FRONTPCMVU_L, AUX_L)
+ VU(FRONTPCMVU_R, AUX_R)
+ MACS(AUX_L, AUX_L, CDSPDIFIN_L, CDSPDINVOL)
+ MACS(AUX_R, AUX_R, CDSPDIFIN_R, CDSPDINVOL)
+ // CD S/PDIF input monitor VU
+ VUSCALE(CDSPDINMONVU_L, CDSPDIFIN_L, CDSPDINVOL)
+ VUSCALE(CDSPDINMONVU_R, CDSPDIFIN_R, CDSPDINVOL)
+
+ MACS(AUX_L, AUX_L, AC97IN_L, AC97VOL)
+ MACS(AUX_R, AUX_R, AC97IN_R, AC97VOL)
+ // AC97 monitor VU
+ VUSCALE(AC97MONVU_L, AC97IN_L, AC97VOL)
+ VUSCALE(AC97MONVU_R, AC97IN_R, AC97VOL)
+
+ MACS(AUX_L, AUX_L, GPSPDIFIN_L, SPDINVOL)
+ MACS(AUX_R, AUX_R, GPSPDIFIN_R, SPDINVOL)
+ // S/PDIF input monitor VU
+ VUSCALE(SPDINMONVU_L, GPSPDIFIN_L, SPDINVOL)
+ VUSCALE(SPDINMONVU_R, GPSPDIFIN_R, SPDINVOL)
+ // Boost S/PDIF input level by summing it twice
+ MACS(AUX_L, AUX_L, GPSPDIFIN_L, SPDINVOL)
+ MACS(AUX_R, AUX_R, GPSPDIFIN_R, SPDINVOL)
+
+ // Auxiliary inputs (Live Drive)
+ MACS(AUX_L, AUX_L, AUXIN_L, FRONTAUX)
+ MACS(AUX_R, AUX_R, AUXIN_R, FRONTAUX)
+ VUSCALE(FRONTAUXVU_L, AUXIN_L, FRONTAUX)
+ VUSCALE(FRONTAUXVU_R, AUXIN_R, FRONTAUX)
+
+// Apply main volume to the aux input front volume
+ MACS(AUX_L, 0, AUX_L, MAIN_L)
+ MACS(AUX_R, 0, AUX_R, MAIN_R)
+
+#ifdef AUDIGY
+ // Livedrive mic inputs
+ MACS(MIC_L, MIC_L, MICIN_L, FRONTMIC)
+ MACS(MIC_R, MIC_R, MICIN_R, FRONTMIC)
+ VUSCALE(FRONTMICVU_L, MICIN_L, FRONTMIC)
+ VUSCALE(FRONTMICVU_R, MICIN_R, FRONTMIC)
+
+// Apply main volume to the aux input front volume
+ MACS(MIC_L, 0, AUX_L, MAIN_L)
+ MACS(MIC_R, 0, AUX_R, MAIN_R)
+#endif
+
+#ifdef HAVE_EQ
+ EQUALIZER(L, L, AUX_L)
+ EQUALIZER(R, R, AUX_R)
+#endif
+
+// Secondary sends before applying front volume
+#ifdef AUDIGY
+ MACINTS(SPDOUT1_L, 0, AUX_L, _PASSTHROUGH_OFF)
+ MACINTS(SPDOUT1_R, 0, AUX_R, _PASSTHROUGH_OFF)
+
+// S/PDIF passthrough
+.const 0x1008 0x1008
+.const 0xffff0000 0xffff0000
+.gpr TMP0
+.gpr TMP1
+.gpr TMP2
+
+// Left channel
+ COPY(TMP2, SPDIF_TMP_L)
+ SKIP(CCR, CCR, 0x1008, 1)
+ ACC3(TMP2, 0, 65536, TMP2)
+ ANDXOR(TMP2, TMP2, 0xffff0000, 0)
+ MACINTS(TMP0, 0, TMP2, _PASSTHROUGH_ON)
+ ANDXOR(TMP1, _PASSTHROUGH_ON, 1, 1)
+ MACINTS(TMP1, 0, AUX_L, TMP1)
+ ACC3(SPDOUT1_L, TMP0, TMP1, 0)
+
+// Right channel
+ COPY(TMP2, SPDIF_TMP_R)
+ SKIP(CCR, CCR, 0x1008, 1)
+ ACC3(TMP2, 0, 65536, TMP2)
+ ANDXOR(TMP2, TMP2, 0xffff0000, 0)
+ MACINTS(TMP0, 0, TMP2, _PASSTHROUGH_ON)
+ ANDXOR(TMP1, _PASSTHROUGH_ON, 1, 1)
+ MACINTS(TMP1, 0, AUX_R, TMP1)
+ ACC3(SPDOUT1_R, TMP0, TMP1, 0)
+#else
+ COPY(SPDOUT1_L, AUX_L)
+ COPY(SPDOUT1_R, AUX_R)
+#endif
+
+// Update main peak meters
+ VU(VU_L, AUX_L)
+ VU(VU_R, AUX_R)
+
+// Mix the PCM sends with monitor inputs in and write to front output
+ MACS(FRONT_L, 0, AUX_L, FRONTVOL_L)
+ MACS(FRONT_R, 0, AUX_R, FRONTVOL_R)
+
+ MACS(HEADPH_L, 0, AUX_L, FRONTVOL_L)
+ MACS(HEADPH_R, 0, AUX_R, FRONTVOL_R)
+ VUSCALE(FRONTVU_L, AUX_L, FRONTVOL_L)
+ VUSCALE(FRONTVU_R, AUX_R, FRONTVOL_R)
+
+//
+// Auxiliary input monitors (rear channel)
+//
+
+ MACS(S_SUM_L, 0, S_SUM_L, SURRPCM)
+ MACS(S_SUM_R, 0, S_SUM_R, SURRPCM)
+ VU(SURRPCMVU_L, S_SUM_L)
+ VU(SURRPCMVU_R, S_SUM_R)
+ MACS(S_SUM_L, S_SUM_L, CDSPDIFIN_L, R_CDSPDINVOL)
+ MACS(S_SUM_R, S_SUM_R, CDSPDIFIN_R, R_CDSPDINVOL)
+ // CD S/PDIF input monitor VU
+ VUSCALE(R_CDSPDINMONVU_L, CDSPDIFIN_L, R_CDSPDINVOL)
+ VUSCALE(R_CDSPDINMONVU_R, CDSPDIFIN_R, R_CDSPDINVOL)
+
+ MACS(S_SUM_L, S_SUM_L, AC97IN_L, R_AC97VOL)
+ MACS(S_SUM_R, S_SUM_R, AC97IN_R, R_AC97VOL)
+ // AC97 monitor VU
+ VUSCALE(R_AC97MONVU_L, AC97IN_L, R_AC97VOL)
+ VUSCALE(R_AC97MONVU_R, AC97IN_R, R_AC97VOL)
+
+ MACS(S_SUM_L, S_SUM_L, GPSPDIFIN_L, R_SPDINVOL)
+ MACS(S_SUM_R, S_SUM_R, GPSPDIFIN_R, R_SPDINVOL)
+ // S/PDIF input monitor VU
+ VUSCALE(R_SPDINMONVU_L, GPSPDIFIN_L, R_SPDINVOL)
+ VUSCALE(R_SPDINMONVU_R, GPSPDIFIN_R, R_SPDINVOL)
+
+ MACS(S_SUM_L, S_SUM_L, AUXIN_L, SURRAUX)
+ MACS(S_SUM_R, S_SUM_R, AUXIN_R, SURRAUX)
+ VUSCALE(SURRAUXVU_L, AUXIN_L, SURRAUX)
+ VUSCALE(SURRAUXVU_R, AUXIN_R, SURRAUX)
+#ifdef AUDIGY
+ MACS(S_SUM_L, S_SUM_L, MICIN_L, SURRMIC)
+ MACS(S_SUM_R, S_SUM_R, MICIN_R, SURRMIC)
+ VUSCALE(SURRMICVU_L, MICIN_L, SURRMIC)
+ VUSCALE(SURRMICVU_R, MICIN_R, SURRMIC)
+#endif
+#if 0
+ // Boost S/PDIF input level by summing it twice
+ MACS(S_SUM_L, S_SUM_L, GPSPDIFIN_L, R_SPDINVOL)
+ MACS(S_SUM_R, S_SUM_R, GPSPDIFIN_R, R_SPDINVOL)
+#endif
+
+ MACS(TMP_L, 0, S_SUM_L, MAIN_L)
+ MACS(TMP_R, 0, S_SUM_R, MAIN_R)
+#if defined(HAVE_EQ) && defined(HAVE_SURR_EQ)
+ EQUALIZER(L, SL, TMP_L)
+ EQUALIZER(R, SR, TMP_R)
+#endif
+ MACS(SURR_L, 0, TMP_L, SURRVOL_L)
+ MACS(SURR_R, 0, TMP_R, SURRVOL_R)
+
+#ifdef AUDIGY
+ MACS(DSURR_L, 0, TMP_L, SURRVOL_L)
+ MACS(DSURR_R, 0, TMP_R, SURRVOL_R)
+#else
+ MACS(AC97SURR_L, 0, TMP_L, SURRVOL_L)
+ MACS(AC97SURR_R, 0, TMP_R, SURRVOL_R)
+ MACINTS(CENTER_TMP, 0, SEND_C, 1)
+ MACINTS(LFE_TMP, 0, SEND_W, 1)
+
+#endif
+ VUSCALE(SURRVU_L, TMP_L, SURRVOL_L)
+ VUSCALE(SURRVU_R, TMP_R, SURRVOL_R)
+
+//
+// Misc outputs
+//
+
+ SUM(DCENTER, CENTER_TMP, 0, 0)
+ SUM(DLFE, LFE_TMP, 0, 0)
+ SUM(ACENTER, CENTER_TMP, 0, 0)
+ SUM(ALFE, LFE_TMP, 0, 0)
+
+//
+// Recording sources and VU meters
+//
+
+ MACS(TMP_L, 0, AC97IN_L, AC97REC)
+ MACS(TMP_R, 0, AC97IN_R, AC97REC)
+ VUSCALE(AC97VU_L, AC97IN_L, AC97REC)
+ VUSCALE(AC97VU_R, AC97IN_R, AC97REC)
+
+ MACS(TMP_L, TMP_L, GPSPDIFIN_L, SPDIFREC)
+ MACS(TMP_R, TMP_R, GPSPDIFIN_R, SPDIFREC)
+ VUSCALE(SPDIFVU_L, GPSPDIFIN_L, SPDIFREC)
+ VUSCALE(SPDIFVU_R, GPSPDIFIN_R, SPDIFREC)
+
+ MACS(TMP_L, TMP_L, CDSPDIFIN_L, CDSPDIFREC)
+ MACS(TMP_R, TMP_R, CDSPDIFIN_R, CDSPDIFREC)
+ VUSCALE(CDVU_L, CDSPDIFIN_L, CDSPDIFREC)
+ VUSCALE(CDVU_R, CDSPDIFIN_R, CDSPDIFREC)
+
+ MACS(TMP_L, TMP_L, PCMTMP_L, LOOP)
+ MACS(TMP_R, TMP_R, PCMTMP_R, LOOP)
+ VUSCALE(LOOPVU_L, PCMTMP_L, LOOP)
+ VUSCALE(LOOPVU_R, PCMTMP_R, LOOP)
+
+ MACS(TMP_L, TMP_L, AUXIN_L, RECAUX)
+ MACS(TMP_R, TMP_R, AUXIN_R, RECAUX)
+ VUSCALE(RECAUXVU_L, AUXIN_L, RECAUX)
+ VUSCALE(RECAUXVU_R, AUXIN_R, RECAUX)
+
+#ifdef AUDIGY
+ MACS(TMP_L, TMP_L, MICIN_L, RECMIC)
+ MACS(TMP_R, TMP_R, MICIN_R, RECMIC)
+ VUSCALE(RECMICVU_L, MICIN_L, RECMIC)
+ VUSCALE(RECMICVU_R, MICIN_R, RECMIC)
+#endif
+
+ MACS(ADC_L, 0, TMP_L, RECVOL_L)
+ MACS(ADC_R, 0, TMP_R, RECVOL_R)
+ VUSCALE(RECVU_L, TMP_L, RECVOL_L)
+ VUSCALE(RECVU_R, TMP_R, RECVOL_R)