aboutsummaryrefslogtreecommitdiff
path: root/plugins/spunull/spunull.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/spunull/spunull.c')
-rw-r--r--plugins/spunull/spunull.c538
1 files changed, 538 insertions, 0 deletions
diff --git a/plugins/spunull/spunull.c b/plugins/spunull/spunull.c
new file mode 100644
index 0000000..be798c5
--- /dev/null
+++ b/plugins/spunull/spunull.c
@@ -0,0 +1,538 @@
+/////////////////////////////////////////////////////////
+
+#define PSE_LT_SPU 4
+#define PSE_SPU_ERR_SUCCESS 0
+#define PSE_SPU_ERR -60
+#define PSE_SPU_ERR_NOTCONFIGURED PSE_SPU_ERR -1
+#define PSE_SPU_ERR_INIT PSE_SPU_ERR -2
+
+/////////////////////////////////////////////////////////
+// main emu calls:
+// 0. Get type/name/version
+// 1. Init
+// 2. SetCallbacks
+// 3. SetConfigFile
+// 4. Open
+// 5. Dma/register/xa calls...
+// 6. Close
+// 7. Shutdown
+/////////////////////////////////////////////////////////
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "xa.h"
+#include "register.h"
+// some ms windows compatibility define
+#undef CALLBACK
+#define CALLBACK
+
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+
+const unsigned char version = 1;
+const unsigned char revision = 1;
+const unsigned char build = 1;
+static char * libraryName = "Pete's Null Audio Driver";
+static char * libraryInfo = "Pete's Null Audio Driver V1.1\nCoded by Pete Bernert\n";
+
+////////////////////////////////////////////////////////////////////////
+
+unsigned short regArea[10000]; // psx buffer
+unsigned short spuMem[256*1024];
+unsigned char * spuMemC;
+unsigned char * pSpuIrq=0;
+
+unsigned short spuCtrl, spuStat, spuIrq=0; // some vars to store psx reg infos
+unsigned long spuAddr=0xffffffff; // address into spu mem
+char * pConfigFile=0;
+
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+
+void (CALLBACK *irqCallback)(void)=0; // func of main emu, called on spu irq
+void (CALLBACK *cddavCallback)(unsigned short,unsigned short)=0;
+
+////////////////////////////////////////////////////////////////////////
+// CODE AREA
+////////////////////////////////////////////////////////////////////////
+
+void CALLBACK SPUwriteRegister(unsigned long reg, unsigned short val)
+{
+ unsigned long r=reg&0xfff;
+ regArea[(r-0xc00)>>1] = val;
+
+ if(r>=0x0c00 && r<0x0d80)
+ {
+ //int ch=(r>>4)-0xc0;
+ switch(r&0x0f)
+ {
+ //------------------------------------------------// l volume
+ case 0:
+ //SetVolumeL(ch,val);
+ return;
+ //------------------------------------------------// r volume
+ case 2:
+ //SetVolumeR(ch,val);
+ return;
+ //------------------------------------------------// pitch
+ case 4:
+ //SetPitch(ch,val);
+ return;
+ //------------------------------------------------// start
+ case 6:
+ //s_chan[ch].pStart=spuMemC+((unsigned long) val<<3);
+ return;
+ //------------------------------------------------// adsr level
+ case 8:
+ return;
+ //------------------------------------------------// adsr rate
+ case 10:
+ return;
+ //------------------------------------------------// adsr volume
+ case 12:
+ return;
+ //------------------------------------------------// loop adr
+ case 14:
+ return;
+ //------------------------------------------------//
+ }
+ return;
+ }
+
+ switch(r)
+ {
+ //-------------------------------------------------//
+ case H_SPUaddr:
+ spuAddr = (unsigned long) val<<3;
+ return;
+ //-------------------------------------------------//
+ case H_SPUdata:
+ spuMem[spuAddr>>1] = val;
+ spuAddr+=2;
+ if(spuAddr>0x7ffff) spuAddr=0;
+ return;
+ //-------------------------------------------------//
+ case H_SPUctrl:
+ spuCtrl=val;
+ return;
+ //-------------------------------------------------//
+ case H_SPUstat:
+ spuStat=val & 0xf800;
+ return;
+ //-------------------------------------------------//
+ case H_SPUirqAddr:
+ spuIrq = val;
+ pSpuIrq=spuMemC+((unsigned long) val<<3);
+ return;
+ //-------------------------------------------------//
+ case H_SPUon1:
+ //SoundOn(0,16,val);
+ return;
+ //-------------------------------------------------//
+ case H_SPUon2:
+ //SoundOn(16,24,val);
+ return;
+ //-------------------------------------------------//
+ case H_SPUoff1:
+ //SoundOff(0,16,val);
+ return;
+ //-------------------------------------------------//
+ case H_SPUoff2:
+ //SoundOff(16,24,val);
+ return;
+ //-------------------------------------------------//
+ case H_CDLeft:
+ if(cddavCallback) cddavCallback(0,val);
+ return;
+ case H_CDRight:
+ if(cddavCallback) cddavCallback(1,val);
+ return;
+ //-------------------------------------------------//
+ case H_FMod1:
+ //FModOn(0,16,val);
+ return;
+ //-------------------------------------------------//
+ case H_FMod2:
+ //FModOn(16,24,val);
+ return;
+ //-------------------------------------------------//
+ case H_Noise1:
+ //NoiseOn(0,16,val);
+ return;
+ //-------------------------------------------------//
+ case H_Noise2:
+ //NoiseOn(16,24,val);
+ return;
+ //-------------------------------------------------//
+ case H_RVBon1:
+ //ReverbOn(0,16,val);
+ return;
+ //-------------------------------------------------//
+ case H_RVBon2:
+ //ReverbOn(16,24,val);
+ return;
+ //-------------------------------------------------//
+ case H_Reverb:
+ return;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+unsigned short CALLBACK SPUreadRegister(unsigned long reg)
+{
+ unsigned long r=reg&0xfff;
+
+ if(r>=0x0c00 && r<0x0d80)
+ {
+ switch(r&0x0f)
+ {
+ case 12: // adsr vol
+ {
+ //int ch=(r>>4)-0xc0;
+ static unsigned short adsr_dummy_vol=0;
+ adsr_dummy_vol=!adsr_dummy_vol;
+ return adsr_dummy_vol;
+ }
+
+ case 14: // return curr loop adr
+ {
+ //int ch=(r>>4)-0xc0;
+ return 0;
+ }
+ }
+ }
+
+ switch(r)
+ {
+ case H_SPUctrl:
+ return spuCtrl;
+
+ case H_SPUstat:
+ return spuStat;
+
+ case H_SPUaddr:
+ return (unsigned short)(spuAddr>>3);
+
+ case H_SPUdata:
+ {
+ unsigned short s=spuMem[spuAddr>>1];
+ spuAddr+=2;
+ if(spuAddr>0x7ffff) spuAddr=0;
+ return s;
+ }
+
+ case H_SPUirqAddr:
+ return spuIrq;
+ }
+ return regArea[(r-0xc00)>>1];
+}
+
+////////////////////////////////////////////////////////////////////////
+
+unsigned short CALLBACK SPUreadDMA(void)
+{
+ unsigned short s=spuMem[spuAddr>>1];
+ spuAddr+=2;
+ if(spuAddr>0x7ffff) spuAddr=0;
+ return s;
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void CALLBACK SPUwriteDMA(unsigned short val)
+{
+ spuMem[spuAddr>>1] = val; // spu addr got by writeregister
+ spuAddr+=2; // inc spu addr
+ if(spuAddr>0x7ffff) spuAddr=0; // wrap
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void CALLBACK SPUwriteDMAMem(unsigned short * pusPSXMem,int iSize)
+{
+ int i;
+ for(i=0;i<iSize;i++)
+ {
+ spuMem[spuAddr>>1] = *pusPSXMem++; // spu addr got by writeregister
+ spuAddr+=2; // inc spu addr
+ if(spuAddr>0x7ffff) spuAddr=0; // wrap
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void CALLBACK SPUreadDMAMem(unsigned short * pusPSXMem,int iSize)
+{
+ int i;
+ for(i=0;i<iSize;i++)
+ {
+ *pusPSXMem++=spuMem[spuAddr>>1]; // spu addr got by writeregister
+ spuAddr+=2; // inc spu addr
+ if(spuAddr>0x7ffff) spuAddr=0; // wrap
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+// XA AUDIO
+////////////////////////////////////////////////////////////////////////
+
+void CALLBACK SPUplayADPCMchannel(xa_decode_t *xap)
+{
+}
+
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+// INIT/EXIT STUFF
+////////////////////////////////////////////////////////////////////////
+
+long CALLBACK SPUinit(void)
+{
+ spuMemC=(unsigned char *)spuMem; // just small setup
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////
+
+int bSPUIsOpen=0;
+
+long CALLBACK SPUopen(void)
+{
+ if(bSPUIsOpen) return 0;
+
+ bSPUIsOpen=1;
+
+ //if(pConfigFile) ReadConfigFile(pConfigFile);
+
+ return PSE_SPU_ERR_SUCCESS;
+}
+
+////////////////////////////////////////////////////////////////////////
+
+void SPUsetConfigFile(char * pCfg)
+{
+ pConfigFile=pCfg;
+}
+
+////////////////////////////////////////////////////////////////////////
+
+long CALLBACK SPUclose(void)
+{
+ if(!bSPUIsOpen) return 0;
+ bSPUIsOpen=0;
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////
+
+long CALLBACK SPUshutdown(void)
+{
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////
+// MISC STUFF
+////////////////////////////////////////////////////////////////////////
+
+long CALLBACK SPUtest(void)
+{
+ return 0;
+}
+
+void SPUasync(unsigned int cycle)
+{
+}
+
+void SPUplayCDDAchannel(short *pcm, int nbytes)
+{
+}
+
+////////////////////////////////////////////////////////////////////////
+// this functions will be called once,
+// passes a callback that should be called on SPU-IRQ
+
+void CALLBACK SPUregisterCallback(void (CALLBACK *callback)(void))
+{
+ irqCallback = callback;
+}
+
+void CALLBACK SPUregisterCDDAVolume(void (CALLBACK *CDDAVcallback)(unsigned short,unsigned short))
+{
+ cddavCallback = CDDAVcallback;
+}
+
+////////////////////////////////////////////////////////////////////////
+
+char * CALLBACK PSEgetLibName(void)
+{
+ return libraryName;
+}
+
+////////////////////////////////////////////////////////////////////////
+
+unsigned long CALLBACK PSEgetLibType(void)
+{
+ return PSE_LT_SPU;
+}
+
+////////////////////////////////////////////////////////////////////////
+
+unsigned long CALLBACK PSEgetLibVersion(void)
+{
+ return version<<16|revision<<8|build;
+}
+
+
+char * SPUgetLibInfos(void)
+{
+ return libraryInfo;
+}
+
+////////////////////////////////////////////////////////////////////////
+
+typedef struct
+{
+ char szSPUName[8];
+ unsigned long ulFreezeVersion;
+ unsigned long ulFreezeSize;
+ unsigned char cSPUPort[0x200];
+ unsigned char cSPURam[0x80000];
+ xa_decode_t xaS;
+} SPUFreeze_t;
+
+typedef struct
+{
+ unsigned long Future[256];
+
+} SPUNULLFreeze_t;
+
+////////////////////////////////////////////////////////////////////////
+
+long CALLBACK SPUfreeze(unsigned long ulFreezeMode,SPUFreeze_t * pF)
+{
+ int i;
+
+ if(!pF) return 0;
+
+ if(ulFreezeMode)
+ {
+ if(ulFreezeMode==1)
+ memset(pF,0,sizeof(SPUFreeze_t)+sizeof(SPUNULLFreeze_t));
+
+ strcpy(pF->szSPUName,"PBNUL");
+ pF->ulFreezeVersion=1;
+ pF->ulFreezeSize=sizeof(SPUFreeze_t)+sizeof(SPUNULLFreeze_t);
+
+ if(ulFreezeMode==2) return 1;
+
+ memcpy(pF->cSPURam,spuMem,0x80000);
+ memcpy(pF->cSPUPort,regArea,0x200);
+ // dummy:
+ memset(&pF->xaS,0,sizeof(xa_decode_t));
+ return 1;
+ }
+
+ if(ulFreezeMode!=0) return 0;
+
+ memcpy(spuMem,pF->cSPURam,0x80000);
+ memcpy(regArea,pF->cSPUPort,0x200);
+
+ for(i=0;i<0x100;i++)
+ {
+ if(i!=H_SPUon1-0xc00 && i!=H_SPUon2-0xc00)
+ SPUwriteRegister(0x1f801c00+i*2,regArea[i]);
+ }
+ SPUwriteRegister(H_SPUon1,regArea[(H_SPUon1-0xc00)/2]);
+ SPUwriteRegister(H_SPUon2,regArea[(H_SPUon2-0xc00)/2]);
+
+ return 1;
+}
+
+
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+// UNUSED WINDOWS FUNCS... YOU SHOULDN'T USE THEM IN LINUX
+
+long CALLBACK SPUconfigure(void)
+{
+ return 0;
+}
+
+void CALLBACK SPUabout(void)
+{
+}
+
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////
+// OLD PSEMU 1 FUNCS... YOU SHOULDN'T USE THEM
+
+unsigned short CALLBACK SPUgetOne(unsigned long val)
+{
+ if(spuAddr!=0xffffffff)
+ {
+ return SPUreadDMA();
+ }
+ if(val>=512*1024) val=512*1024-1;
+ return spuMem[val>>1];
+}
+
+void CALLBACK SPUputOne(unsigned long val,unsigned short data)
+{
+ if(spuAddr!=0xffffffff)
+ {
+ SPUwriteDMA(data);
+ return;
+ }
+ if(val>=512*1024) val=512*1024-1;
+ spuMem[val>>1] = data;
+}
+
+void CALLBACK SPUplaySample(unsigned char ch)
+{
+}
+
+void CALLBACK SPUsetAddr(unsigned char ch, unsigned short waddr)
+{
+ //s_chan[ch].pStart=spuMemC+((unsigned long) waddr<<3);
+}
+
+void CALLBACK SPUsetPitch(unsigned char ch, unsigned short pitch)
+{
+ //SetPitch(ch,pitch);
+}
+
+void CALLBACK SPUsetVolumeL(unsigned char ch, short vol)
+{
+ //SetVolumeL(ch,vol);
+}
+
+void CALLBACK SPUsetVolumeR(unsigned char ch, short vol)
+{
+ //SetVolumeR(ch,vol);
+}
+
+void CALLBACK SPUstartChannels1(unsigned short channels)
+{
+ //SoundOn(0,16,channels);
+}
+
+void CALLBACK SPUstartChannels2(unsigned short channels)
+{
+ //SoundOn(16,24,channels);
+}
+
+void CALLBACK SPUstopChannels1(unsigned short channels)
+{
+ //SoundOff(0,16,channels);
+}
+
+void CALLBACK SPUstopChannels2(unsigned short channels)
+{
+ //SoundOff(16,24,channels);
+}