#include "externals.h"\r
#include "registers.h"\r
#include "spu_config.h"\r
+#include "spu.h"\r
\r
static void SoundOn(int start,int end,unsigned short val);\r
static void SoundOff(int start,int end,unsigned short val);\r
break;\r
//-------------------------------------------------//\r
case H_SPUdata:\r
- *(unsigned short *)(spu.spuMemC + spu.spuAddr) = val;\r
+ *(unsigned short *)(spu.spuMemC + spu.spuAddr) = HTOLE16(val);\r
spu.spuAddr += 2;\r
spu.spuAddr &= 0x7fffe;\r
break;\r
goto rvbd;\r
//-------------------------------------------------//\r
case H_SPUirqAddr:\r
+ //if (val & 1)\r
+ // log_unhandled("w irq with lsb: %08lx %04x\n", reg, val);\r
spu.pSpuIrq=spu.spuMemC+(((unsigned long) val<<3)&~0xf);\r
goto upd_irq;\r
//-------------------------------------------------//\r
break;\r
//-------------------------------------------------//\r
\r
+ case H_SPUmvolL:\r
+ case H_SPUmvolR:\r
+ if (val & 0x8000)\r
+ log_unhandled("w master sweep: %08lx %04x\n", reg, val);\r
+ break;\r
+\r
+ case 0x0dac:\r
+ if (val != 4)\r
+ log_unhandled("1f801dac %04x\n", val);\r
+ break;\r
+\r
/*\r
case H_ExtLeft:\r
//auxprintf("EL %d\n",val);\r
\r
case H_SPUdata:\r
{\r
- unsigned short s = *(unsigned short *)(spu.spuMemC + spu.spuAddr);\r
+ unsigned short s = LE16TOH(*(unsigned short *)(spu.spuMemC + spu.spuAddr));\r
spu.spuAddr += 2;\r
spu.spuAddr &= 0x7fffe;\r
return s;\r
//case H_SPUIsOn2:\r
// return IsSoundOn(16,24);\r
\r
+ case H_SPUMute1:\r
+ case H_SPUMute2:\r
+ log_unhandled("r isOn: %08lx\n", reg);\r
+ break;\r
}\r
\r
return spu.regArea[(r-0xc00)>>1];\r
if(vol&0x8000) // sweep?\r
{\r
short sInc=1; // -> sweep up?\r
+ log_unhandled("ch%d sweepl %04x\n", ch, vol);\r
if(vol&0x2000) sInc=-1; // -> or down?\r
if(vol&0x1000) vol^=0xffff; // -> mmm... phase inverted? have to investigate this\r
vol=((vol&0x7f)+1)/2; // -> sweep: 0..127 -> 0..64\r
if(vol&0x8000) // comments... see above :)\r
{\r
short sInc=1;\r
+ log_unhandled("ch%d sweepr %04x\n", ch, vol);\r
if(vol&0x2000) sInc=-1;\r
if(vol&0x1000) vol^=0xffff;\r
vol=((vol&0x7f)+1)/2; \r
spu.s_chan[ch].iRawPitch = NP;\r
spu.s_chan[ch].sinc = NP << 4;\r
spu.s_chan[ch].sinc_inv = 0;\r
- spu.SB[ch * SB_SIZE + 32] = 1; // -> freq change in simple interpolation mode: set flag\r
- if (val)\r
- spu.dwChannelsAudible |= 1u << ch;\r
- else\r
- spu.dwChannelsAudible &= ~(1u << ch);\r
+ spu.s_chan[ch].bNewPitch = 1;\r
+\r
+ // don't mess spu.dwChannelsAudible as adsr runs independently\r
}\r
\r
////////////////////////////////////////////////////////////////////////\r