1 /////////////////////////////////////////////////////////
3 // 0. Get type/name/version
8 // 5. Dma/register/xa calls...
11 /////////////////////////////////////////////////////////
17 #include "../../include/psemu_plugin_defs.h"
18 // some ms windows compatibility define
22 ////////////////////////////////////////////////////////////////////////
24 ////////////////////////////////////////////////////////////////////////
26 const unsigned char version = 1;
27 const unsigned char revision = 1;
28 const unsigned char build = 1;
29 static char * libraryName = "Pete's Null Audio Driver";
30 static char * libraryInfo = "Pete's Null Audio Driver V1.1\nCoded by Pete Bernert\n";
32 ////////////////////////////////////////////////////////////////////////
34 unsigned short regArea[10000]; // psx buffer
35 unsigned short spuMem[256*1024];
36 unsigned char * spuMemC;
37 unsigned char * pSpuIrq=0;
39 unsigned short spuCtrl, spuStat, spuIrq=0; // some vars to store psx reg infos
40 unsigned long spuAddr=0xffffffff; // address into spu mem
43 ////////////////////////////////////////////////////////////////////////
45 ////////////////////////////////////////////////////////////////////////
47 void (CALLBACK *irqCallback)(void)=0; // func of main emu, called on spu irq
48 void (CALLBACK *cddavCallback)(short, short)=0;
50 ////////////////////////////////////////////////////////////////////////
52 ////////////////////////////////////////////////////////////////////////
54 void CALLBACK SPUwriteRegister(unsigned long reg, unsigned short val, unsigned int cycles)
56 unsigned long r=reg&0xfff;
57 regArea[(r-0xc00)>>1] = val;
59 if(r>=0x0c00 && r<0x0d80)
64 //------------------------------------------------// l volume
68 //------------------------------------------------// r volume
72 //------------------------------------------------// pitch
76 //------------------------------------------------// start
78 //s_chan[ch].pStart=spuMemC+((unsigned long) val<<3);
80 //------------------------------------------------// adsr level
83 //------------------------------------------------// adsr rate
86 //------------------------------------------------// adsr volume
89 //------------------------------------------------// loop adr
92 //------------------------------------------------//
99 //-------------------------------------------------//
101 spuAddr = (unsigned long) val<<3;
103 //-------------------------------------------------//
105 spuMem[spuAddr>>1] = val;
107 if(spuAddr>0x7ffff) spuAddr=0;
109 //-------------------------------------------------//
113 //-------------------------------------------------//
115 spuStat=val & 0xf800;
117 //-------------------------------------------------//
120 pSpuIrq=spuMemC+((unsigned long) val<<3);
122 //-------------------------------------------------//
126 //-------------------------------------------------//
128 //SoundOn(16,24,val);
130 //-------------------------------------------------//
132 //SoundOff(0,16,val);
134 //-------------------------------------------------//
136 //SoundOff(16,24,val);
138 //-------------------------------------------------//
140 if(cddavCallback) cddavCallback(0,val);
143 if(cddavCallback) cddavCallback(1,val);
145 //-------------------------------------------------//
149 //-------------------------------------------------//
153 //-------------------------------------------------//
157 //-------------------------------------------------//
159 //NoiseOn(16,24,val);
161 //-------------------------------------------------//
163 //ReverbOn(0,16,val);
165 //-------------------------------------------------//
167 //ReverbOn(16,24,val);
169 //-------------------------------------------------//
175 ////////////////////////////////////////////////////////////////////////
\r
177 unsigned short CALLBACK SPUreadRegister(unsigned long reg, unsigned int cycles)
179 unsigned long r=reg&0xfff;
181 if(r>=0x0c00 && r<0x0d80)
187 //int ch=(r>>4)-0xc0;
188 static unsigned short adsr_dummy_vol=0;
189 adsr_dummy_vol=!adsr_dummy_vol;
190 return adsr_dummy_vol;
193 case 14: // return curr loop adr
195 //int ch=(r>>4)-0xc0;
210 return (unsigned short)(spuAddr>>3);
214 unsigned short s=spuMem[spuAddr>>1];
216 if(spuAddr>0x7ffff) spuAddr=0;
223 return regArea[(r-0xc00)>>1];
226 ////////////////////////////////////////////////////////////////////////
228 unsigned short CALLBACK SPUreadDMA(void)
230 unsigned short s=spuMem[spuAddr>>1];
232 if(spuAddr>0x7ffff) spuAddr=0;
236 ////////////////////////////////////////////////////////////////////////
238 void CALLBACK SPUwriteDMA(unsigned short val)
240 spuMem[spuAddr>>1] = val; // spu addr got by writeregister
\r
241 spuAddr+=2; // inc spu addr
242 if(spuAddr>0x7ffff) spuAddr=0; // wrap
245 ////////////////////////////////////////////////////////////////////////
247 void CALLBACK SPUwriteDMAMem(unsigned short * pusPSXMem,int iSize,unsigned int cycles)
252 spuMem[spuAddr>>1] = *pusPSXMem++; // spu addr got by writeregister
\r
253 spuAddr+=2; // inc spu addr
254 if(spuAddr>0x7ffff) spuAddr=0; // wrap
258 ////////////////////////////////////////////////////////////////////////
260 void CALLBACK SPUreadDMAMem(unsigned short * pusPSXMem,int iSize,unsigned int cycles)
265 *pusPSXMem++=spuMem[spuAddr>>1]; // spu addr got by writeregister
266 spuAddr+=2; // inc spu addr
267 if(spuAddr>0x7ffff) spuAddr=0; // wrap
271 ////////////////////////////////////////////////////////////////////////
273 ////////////////////////////////////////////////////////////////////////
275 void CALLBACK SPUplayADPCMchannel(xa_decode_t *xap, unsigned int cycles, int is_start)
279 void CALLBACK SPUsetCDvol(unsigned char ll, unsigned char lr,
280 unsigned char rl, unsigned char rr, unsigned int cycle)
284 ////////////////////////////////////////////////////////////////////////
286 ////////////////////////////////////////////////////////////////////////
288 ////////////////////////////////////////////////////////////////////////
290 long CALLBACK SPUinit(void)
292 spuMemC=(unsigned char *)spuMem; // just small setup
296 ////////////////////////////////////////////////////////////////////////
300 long CALLBACK SPUopen(void)
302 if(bSPUIsOpen) return 0;
306 //if(pConfigFile) ReadConfigFile(pConfigFile);
308 return PSE_SPU_ERR_SUCCESS;
311 ////////////////////////////////////////////////////////////////////////
313 void SPUsetConfigFile(char * pCfg)
318 ////////////////////////////////////////////////////////////////////////
320 long CALLBACK SPUclose(void)
322 if(!bSPUIsOpen) return 0;
327 ////////////////////////////////////////////////////////////////////////
329 long CALLBACK SPUshutdown(void)
334 void CALLBACK SPUconfigure(void)
338 ////////////////////////////////////////////////////////////////////////
340 ////////////////////////////////////////////////////////////////////////
342 long CALLBACK SPUtest(void)
347 void SPUasync(unsigned int cycle, unsigned int flags)
351 int SPUplayCDDAchannel(short *pcm, int nbytes, unsigned int cycle, int is_start)
356 ////////////////////////////////////////////////////////////////////////
357 // this functions will be called once,
358 // passes a callback that should be called on SPU-IRQ
360 void CALLBACK SPUregisterCallback(void (CALLBACK *callback)(void))
362 irqCallback = callback;
365 void CALLBACK SPUregisterCDDAVolume(void (CALLBACK *CDDAVcallback)(short, short))
367 cddavCallback = CDDAVcallback;
370 ////////////////////////////////////////////////////////////////////////
\r
372 char * CALLBACK PSEgetLibName(void)
377 ////////////////////////////////////////////////////////////////////////
379 unsigned long CALLBACK PSEgetLibType(void)
384 ////////////////////////////////////////////////////////////////////////
\r
386 unsigned long CALLBACK PSEgetLibVersion(void)
\r
388 return version<<16|revision<<8|build;
392 char * SPUgetLibInfos(void)
397 ////////////////////////////////////////////////////////////////////////
\r
401 unsigned long Future[256];
405 ////////////////////////////////////////////////////////////////////////
\r
407 long DoFreeze(int ulFreezeMode, SPUFreeze_t * pF, unsigned short **ram,
408 void * pF2, unsigned int cycles)
419 memset(pF,0,sizeof(SPUFreeze_t)+sizeof(SPUNULLFreeze_t));
421 strcpy(pF->PluginName, "PBNUL");
422 pF->PluginVersion = 1;
423 pF->Size = sizeof(SPUFreeze_t)+sizeof(SPUNULLFreeze_t);
425 if(ulFreezeMode==2) return 1;
427 memcpy(pF->SPUPorts, regArea, 0x200);
431 if(ulFreezeMode!=0) return 0;
433 memcpy(regArea, pF->SPUPorts, 0x200);
437 if(i!=H_SPUon1-0xc00 && i!=H_SPUon2-0xc00)
438 SPUwriteRegister(0x1f801c00+i*2,regArea[i],cycles);
440 SPUwriteRegister(H_SPUon1,regArea[(H_SPUon1-0xc00)/2],cycles);
441 SPUwriteRegister(H_SPUon2,regArea[(H_SPUon2-0xc00)/2],cycles);
446 void CALLBACK SPUregisterScheduleCb(void (CALLBACK *callback)(unsigned int))