{\r
//-------------------------------------------------//\r
case H_SPUaddr:\r
- spu.spuAddr = (unsigned long) val<<3;\r
+ spu.spuAddr = (unsigned int)val << 3;\r
//check_irq_io(spu.spuAddr);\r
break;\r
//-------------------------------------------------//\r
break;\r
//-------------------------------------------------//\r
case H_SPUctrl:\r
+ spu.spuStat = (spu.spuStat & ~0x3f) | (val & 0x3f);\r
+ spu.spuStat &= ~STAT_IRQ | val;\r
if (!(spu.spuCtrl & CTRL_IRQ)) {\r
- spu.spuStat&=~STAT_IRQ;\r
if (val & CTRL_IRQ)\r
schedule_next_irq();\r
}\r
break;\r
//-------------------------------------------------//\r
case H_SPUstat:\r
- spu.spuStat=val&0xf800;\r
+ //spu.spuStat=val&0xf800;\r
break;\r
//-------------------------------------------------//\r
case H_SPUReverbAddr:\r
goto upd_irq;\r
//-------------------------------------------------//\r
case H_SPUrvolL:\r
- spu.rvb->VolLeft=val;\r
+ spu.rvb->VolLeft = (int16_t)val;\r
break;\r
//-------------------------------------------------//\r
case H_SPUrvolR:\r
- spu.rvb->VolRight=val;\r
+ spu.rvb->VolRight = (int16_t)val;\r
break;\r
//-------------------------------------------------//\r
\r
*/\r
//-------------------------------------------------//\r
case H_SPUon1:\r
+ spu.last_keyon_cycles = cycles;\r
do_samples_if_needed(cycles, 0, 2);\r
SoundOn(0,16,val);\r
break;\r
//-------------------------------------------------//\r
case H_SPUon2:\r
+ spu.last_keyon_cycles = cycles;\r
do_samples_if_needed(cycles, 0, 2);\r
SoundOn(16,24,val);\r
break;\r
//-------------------------------------------------//\r
case H_SPUoff1:\r
+ if (cycles - spu.last_keyon_cycles < 786u) {\r
+ if (val & regAreaGet(H_SPUon1))\r
+ log_unhandled("koff1 %04x %d\n", val, cycles - spu.last_keyon_cycles);\r
+ val &= ~regAreaGet(H_SPUon1);\r
+ }\r
+ do_samples_if_needed(cycles, 0, 2);\r
SoundOff(0,16,val);\r
break;\r
//-------------------------------------------------//\r
case H_SPUoff2:\r
+ if (cycles - spu.last_keyon_cycles < 786u) {\r
+ if (val & regAreaGet(H_SPUon1))\r
+ log_unhandled("koff2 %04x %d\n", val, cycles - spu.last_keyon_cycles);\r
+ val &= ~regAreaGet(H_SPUon2);\r
+ }\r
+ do_samples_if_needed(cycles, 0, 2);\r
SoundOff(16,24,val);\r
break;\r
//-------------------------------------------------//\r
case H_CDLeft:\r
spu.iLeftXAVol=(int16_t)val;\r
- if(spu.cddavCallback) spu.cddavCallback(0,(int16_t)val);\r
+ //if(spu.cddavCallback) spu.cddavCallback(0,(int16_t)val);\r
break;\r
case H_CDRight:\r
spu.iRightXAVol=(int16_t)val;\r
- if(spu.cddavCallback) spu.cddavCallback(1,(int16_t)val);\r
+ //if(spu.cddavCallback) spu.cddavCallback(1,(int16_t)val);\r
break;\r
//-------------------------------------------------//\r
case H_FMod1:\r
return spu.spuCtrl;\r
\r
case H_SPUstat:\r
- return (spu.spuStat & ~0x3F) | (spu.spuCtrl & 0x3F);\r
+ return spu.spuStat;\r
\r
case H_SPUaddr:\r
return (unsigned short)(spu.spuAddr>>3);\r
static void SoundOff(int start,int end,unsigned short val)\r
{\r
int ch;\r
- for(ch=start;ch<end;ch++,val>>=1) // loop channels\r
+ for (ch = start; val && ch < end; ch++, val >>= 1) // loop channels\r
{\r
if(val&1)\r
{\r
spu.s_chan[ch].bReverb=val&1; // -> reverb on/off\r
}\r
}\r
+\r
+// vim:shiftwidth=1:expandtab\r