notaz.gp2x.de
/
pcsx_rearmed.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
spu: adjust irqs again
[pcsx_rearmed.git]
/
plugins
/
dfsound
/
registers.c
diff --git
a/plugins/dfsound/registers.c
b/plugins/dfsound/registers.c
index
61d0b81
..
bcac4d9
100644
(file)
--- a/
plugins/dfsound/registers.c
+++ b/
plugins/dfsound/registers.c
@@
-22,6
+22,7
@@
#include "externals.h"
\r
#include "registers.h"
\r
#include "spu_config.h"
\r
#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
\r
static void SoundOn(int start,int end,unsigned short val);
\r
static void SoundOff(int start,int end,unsigned short val);
\r
@@
-36,17
+37,19
@@
static void ReverbOn(int start,int end,unsigned short val);
// WRITE REGISTERS: called by main emu
\r
////////////////////////////////////////////////////////////////////////
\r
\r
// WRITE REGISTERS: called by main emu
\r
////////////////////////////////////////////////////////////////////////
\r
\r
-static const uint32_t ignore_dupe[
8
] = {
\r
+static const uint32_t ignore_dupe[
16
] = {
\r
// ch 0-15 c40 c80 cc0
\r
0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f,
\r
// ch 16-24 d40 control reverb
\r
// ch 0-15 c40 c80 cc0
\r
0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f,
\r
// ch 16-24 d40 control reverb
\r
- 0x7f7f7f7f, 0x7f7f7f7f, 0xff05ff0f, 0xffffffff
\r
+ 0x7f7f7f7f, 0x7f7f7f7f, 0xff05ff0f, 0xffffffff,
\r
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
\r
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff
\r
};
\r
\r
void CALLBACK SPUwriteRegister(unsigned long reg, unsigned short val,
\r
unsigned int cycles)
\r
{
\r
};
\r
\r
void CALLBACK SPUwriteRegister(unsigned long reg, unsigned short val,
\r
unsigned int cycles)
\r
{
\r
- int r = reg & 0xff
f
;
\r
+ int r = reg & 0xff
e
;
\r
int rofs = (r - 0xc00) >> 1;
\r
int changed = spu.regArea[rofs] != val;
\r
spu.regArea[rofs] = val;
\r
int rofs = (r - 0xc00) >> 1;
\r
int changed = spu.regArea[rofs] != val;
\r
spu.regArea[rofs] = val;
\r
@@
-118,18
+121,26
@@
void CALLBACK SPUwriteRegister(unsigned long reg, unsigned short val,
}
\r
return;
\r
}
\r
}
\r
return;
\r
}
\r
+ else if (0x0e00 <= r && r < 0x0e60)
\r
+ {
\r
+ int ch = (r >> 2) & 0x1f;
\r
+ log_unhandled("c%02d w %cvol %04x\n", ch, (r & 2) ? 'r' : 'l', val);
\r
+ spu.s_chan[ch].iVolume[(r >> 1) & 1] = (signed short)val >> 1;
\r
+ }
\r
\r
switch(r)
\r
{
\r
//-------------------------------------------------//
\r
case H_SPUaddr:
\r
spu.spuAddr = (unsigned long) val<<3;
\r
\r
switch(r)
\r
{
\r
//-------------------------------------------------//
\r
case H_SPUaddr:
\r
spu.spuAddr = (unsigned long) val<<3;
\r
+ //check_irq_io(spu.spuAddr);
\r
break;
\r
//-------------------------------------------------//
\r
case H_SPUdata:
\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
spu.spuAddr += 2;
\r
spu.spuAddr &= 0x7fffe;
\r
+ check_irq_io(spu.spuAddr);
\r
break;
\r
//-------------------------------------------------//
\r
case H_SPUctrl:
\r
break;
\r
//-------------------------------------------------//
\r
case H_SPUctrl:
\r
@@
-149,7
+160,10
@@
void CALLBACK SPUwriteRegister(unsigned long reg, unsigned short val,
goto rvbd;
\r
//-------------------------------------------------//
\r
case H_SPUirqAddr:
\r
goto rvbd;
\r
//-------------------------------------------------//
\r
case H_SPUirqAddr:
\r
- spu.pSpuIrq=spu.spuMemC+(((unsigned long) val<<3)&~0xf);
\r
+ //if (val & 1)
\r
+ // log_unhandled("w irq with lsb: %08lx %04x\n", reg, val);
\r
+ spu.pSpuIrq = spu.spuMemC + (((int)val << 3) & ~0xf);
\r
+ //check_irq_io(spu.spuAddr);
\r
goto upd_irq;
\r
//-------------------------------------------------//
\r
case H_SPUrvolL:
\r
goto upd_irq;
\r
//-------------------------------------------------//
\r
case H_SPUrvolL:
\r
@@
-161,6
+175,17
@@
void CALLBACK SPUwriteRegister(unsigned long reg, unsigned short val,
break;
\r
//-------------------------------------------------//
\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_ExtLeft:
\r
//auxprintf("EL %d\n",val);
\r
@@
-286,7
+311,7
@@
rvbd:
\r
unsigned short CALLBACK SPUreadRegister(unsigned long reg)
\r
{
\r
\r
unsigned short CALLBACK SPUreadRegister(unsigned long reg)
\r
{
\r
- const unsigned long r
=reg&0xfff
;
\r
+ const unsigned long r
= reg & 0xffe
;
\r
\r
if(r>=0x0c00 && r<0x0d80)
\r
{
\r
\r
if(r>=0x0c00 && r<0x0d80)
\r
{
\r
@@
-296,7
+321,7
@@
unsigned short CALLBACK SPUreadRegister(unsigned long reg)
{
\r
const int ch=(r>>4)-0xc0;
\r
if(spu.dwNewChannel&(1<<ch)) return 1; // we are started, but not processed? return 1
\r
{
\r
const int ch=(r>>4)-0xc0;
\r
if(spu.dwNewChannel&(1<<ch)) return 1; // we are started, but not processed? return 1
\r
- if((spu.dwChannel
On&(1<<ch)) &&
// same here... we haven't decoded one sample yet, so no envelope yet. return 1 as well
\r
+ if((spu.dwChannel
sAudible&(1<<ch)) &&
// same here... we haven't decoded one sample yet, so no envelope yet. return 1 as well
\r
!spu.s_chan[ch].ADSRX.EnvelopeVol)
\r
return 1;
\r
return (unsigned short)(spu.s_chan[ch].ADSRX.EnvelopeVol>>16);
\r
!spu.s_chan[ch].ADSRX.EnvelopeVol)
\r
return 1;
\r
return (unsigned short)(spu.s_chan[ch].ADSRX.EnvelopeVol>>16);
\r
@@
-309,6
+334,13
@@
unsigned short CALLBACK SPUreadRegister(unsigned long reg)
}
\r
}
\r
}
\r
}
\r
}
\r
}
\r
+ else if (0x0e00 <= r && r < 0x0e60)
\r
+ {
\r
+ int ch = (r >> 2) & 0x1f;
\r
+ int v = spu.s_chan[ch].iVolume[(r >> 1) & 1] << 1;
\r
+ log_unhandled("c%02d r %cvol %04x\n", ch, (r & 2) ? 'r' : 'l', v);
\r
+ return v;
\r
+ }
\r
\r
switch(r)
\r
{
\r
\r
switch(r)
\r
{
\r
@@
-321,11
+353,13
@@
unsigned short CALLBACK SPUreadRegister(unsigned long reg)
case H_SPUaddr:
\r
return (unsigned short)(spu.spuAddr>>3);
\r
\r
case H_SPUaddr:
\r
return (unsigned short)(spu.spuAddr>>3);
\r
\r
+ // this reportedly doesn't work on real hw
\r
case H_SPUdata:
\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
spu.spuAddr += 2;
\r
spu.spuAddr &= 0x7fffe;
\r
+ //check_irq_io(spu.spuAddr);
\r
return s;
\r
}
\r
\r
return s;
\r
}
\r
\r
@@
-335,6
+369,23
@@
unsigned short CALLBACK SPUreadRegister(unsigned long reg)
//case H_SPUIsOn2:
\r
// return IsSoundOn(16,24);
\r
\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
+ case 0x0dac:
\r
+ case H_SPUirqAddr:
\r
+ case H_CDLeft:
\r
+ case H_CDRight:
\r
+ case H_ExtLeft:
\r
+ case H_ExtRight:
\r
+ break;
\r
+
\r
+ default:
\r
+ if (r >= 0xda0)
\r
+ log_unhandled("spu r %08lx\n", reg);
\r
+ break;
\r
}
\r
\r
return spu.regArea[(r-0xc00)>>1];
\r
}
\r
\r
return spu.regArea[(r-0xc00)>>1];
\r
@@
-350,7
+401,7
@@
static void SoundOn(int start,int end,unsigned short val)
\r
for(ch=start;ch<end;ch++,val>>=1) // loop channels
\r
{
\r
\r
for(ch=start;ch<end;ch++,val>>=1) // loop channels
\r
{
\r
- if((val&1) && regAreaGet
(ch,6))
// mmm... start has to be set before key on !?!
\r
+ if((val&1) && regAreaGet
Ch(ch, 6))
// mmm... start has to be set before key on !?!
\r
{
\r
spu.s_chan[ch].bIgnoreLoop = 0;
\r
spu.dwNewChannel|=(1<<ch);
\r
{
\r
spu.s_chan[ch].bIgnoreLoop = 0;
\r
spu.dwNewChannel|=(1<<ch);
\r
@@
-431,6
+482,7
@@
static void SetVolumeL(unsigned char ch,short vol) // LEFT VOLUME
if(vol&0x8000) // sweep?
\r
{
\r
short sInc=1; // -> sweep up?
\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&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
@@
-446,6
+498,7
@@
static void SetVolumeL(unsigned char ch,short vol) // LEFT VOLUME
\r
vol&=0x3fff;
\r
spu.s_chan[ch].iLeftVolume=vol; // store volume
\r
\r
vol&=0x3fff;
\r
spu.s_chan[ch].iLeftVolume=vol; // store volume
\r
+ //spu.regArea[(0xe00-0xc00)/2 + ch*2 + 0] = vol << 1;
\r
}
\r
\r
////////////////////////////////////////////////////////////////////////
\r
}
\r
\r
////////////////////////////////////////////////////////////////////////
\r
@@
-457,6
+510,7
@@
static void SetVolumeR(unsigned char ch,short vol) // RIGHT VOLUME
if(vol&0x8000) // comments... see above :)
\r
{
\r
short sInc=1;
\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
if(vol&0x2000) sInc=-1;
\r
if(vol&0x1000) vol^=0xffff;
\r
vol=((vol&0x7f)+1)/2;
\r
@@
-472,6
+526,7
@@
static void SetVolumeR(unsigned char ch,short vol) // RIGHT VOLUME
vol&=0x3fff;
\r
\r
spu.s_chan[ch].iRightVolume=vol;
\r
vol&=0x3fff;
\r
\r
spu.s_chan[ch].iRightVolume=vol;
\r
+ //spu.regArea[(0xe00-0xc00)/2 + ch*2 + 1] = vol << 1;
\r
}
\r
\r
////////////////////////////////////////////////////////////////////////
\r
}
\r
\r
////////////////////////////////////////////////////////////////////////
\r
@@
-487,7
+542,9
@@
static void SetPitch(int ch,unsigned short val) // SET PITCH
spu.s_chan[ch].iRawPitch = NP;
\r
spu.s_chan[ch].sinc = NP << 4;
\r
spu.s_chan[ch].sinc_inv = 0;
\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
+ spu.s_chan[ch].bNewPitch = 1;
\r
+
\r
+ // don't mess spu.dwChannelsAudible as adsr runs independently
\r
}
\r
\r
////////////////////////////////////////////////////////////////////////
\r
}
\r
\r
////////////////////////////////////////////////////////////////////////
\r