First part of SCSP clean up: pointer arithmetic made more safe (I hope). To-do: convert data types to Supermodel standards.

This commit is contained in:
Bart Trzynadlowski 2011-09-05 06:53:26 +00:00
parent 7b58fd0644
commit 99149124e6
4 changed files with 70 additions and 70 deletions

View file

@ -923,12 +923,12 @@ void SCSP_w8(unsigned int addr,unsigned char val)
addr&=0x1f;
//DebugLog("Slot %02X Reg %02X write byte %04X\n",slot,addr^1,val);
//printf("Slot %02X Reg %02X write byte %04X\n",slot,addr^1,val);
*((unsigned char *) (SCSP->Slots[slot].datab+(addr^1))) = val;
*(unsigned char *) &(SCSP->Slots[slot].datab[addr^1]) = val;
SCSP_UpdateSlotReg(slot,(addr^1)&0x1f);
}
else if(addr<0x600)
{
*((unsigned char *) (SCSP->datab+((addr&0xff)^1))) = val;
*(unsigned char *) &(SCSP->datab[(addr&0xff)^1]) = val;
SCSP_UpdateReg((addr^1)&0xff);
}
else if(addr<0x700)
@ -938,11 +938,11 @@ void SCSP_w8(unsigned int addr,unsigned char val)
#ifdef USEDSP
//DSP
if(addr<0x780) //COEF
*(((unsigned char *) SCSP->DSP.COEF) + ((addr-0x700)^1))=val;
((unsigned char *) SCSP->DSP.COEF)[(addr-0x700)^1]=val;
else if(addr<0x7C0)
*(((unsigned char *) SCSP->DSP.MADRS) + ((addr-0x780)^1))=val;
((unsigned char *) SCSP->DSP.MADRS)[(addr-0x780)^1]=val;
else if(addr>=0x800 && addr<0xC00)
*(((unsigned char *) SCSP->DSP.MPRO) + ((addr-0x800)^1))=val;
((unsigned char *) SCSP->DSP.MPRO)[(addr-0x800)^1]=val;
else
int a=1;
if(addr==0xBFE)
@ -963,12 +963,12 @@ void SCSP_w16(unsigned int addr,unsigned short val)
addr&=0x1f;
//DebugLog("Slot %02X Reg %02X write word %04X\n",slot,addr,val);
//printf("Slot %02X Reg %02X write word %04X\n",slot,addr,val);
*((unsigned short *) (SCSP->Slots[slot].datab+(addr))) = val;
*(unsigned short *) &(SCSP->Slots[slot].datab[addr]) = val;
SCSP_UpdateSlotReg(slot,addr&0x1f);
}
else if(addr<0x600)
{
*((unsigned short *) (SCSP->datab+((addr&0xff)))) = val;
*(unsigned short *) &(SCSP->datab[addr&0xff]) = val;
SCSP_UpdateReg(addr&0xff);
}
else if(addr<0x700)
@ -978,11 +978,11 @@ void SCSP_w16(unsigned int addr,unsigned short val)
#ifdef USEDSP
//DSP
if(addr<0x780) //COEF
*((unsigned short *) (SCSP->DSP.COEF+(addr-0x700)/2))=val;
*(unsigned short *) &(SCSP->DSP.COEF[(addr-0x700)/2])=val;
else if(addr<0x800)
*((unsigned short *) (SCSP->DSP.MADRS+(addr-0x780)/2))=val;
*(unsigned short *) &(SCSP->DSP.MADRS[(addr-0x780)/2])=val;
else if(addr<0xC00)
*((unsigned short *) (SCSP->DSP.MPRO+(addr-0x800)/2))=val;
*(unsigned short *) &(SCSP->DSP.MPRO[(addr-0x800)/2])=val;
else
int a=1;
if(addr==0xBFE)
@ -1008,7 +1008,7 @@ void SCSP_w32(unsigned int addr,unsigned int val)
#else
val = (val>>16)|(val<<16);
#endif
*((unsigned int *) (SCSP->Slots[slot].datab+(addr))) = val;
*(unsigned int *) &(SCSP->Slots[slot].datab[addr]) = val;
SCSP_UpdateSlotReg(slot,addr&0x1f);
SCSP_UpdateSlotReg(slot,(addr&0x1f)+2);
}
@ -1019,7 +1019,7 @@ void SCSP_w32(unsigned int addr,unsigned int val)
#else
val = (val>>16)|(val<<16);
#endif
*((unsigned int *) (SCSP->datab+((addr&0xff)))) = val;
*(unsigned int *) &(SCSP->datab[addr&0xff]) = val;
SCSP_UpdateReg(addr&0xff);
SCSP_UpdateReg((addr&0xff)+2);
}
@ -1035,11 +1035,11 @@ void SCSP_w32(unsigned int addr,unsigned int val)
val = (val>>16)|(val<<16);
#endif
if(addr<0x780) //COEF
*((unsigned int *) (SCSP->DSP.COEF+(addr-0x700)/2))=val;
*(unsigned int *) &(SCSP->DSP.COEF[(addr-0x700)/2])=val;
else if(addr<0x800)
*((unsigned int *) (SCSP->DSP.MADRS+(addr-0x780)/2))=val;
*(unsigned int *) &(SCSP->DSP.MADRS[(addr-0x780)/2])=val;
else if(addr<0xC00)
*((unsigned int *) (SCSP->DSP.MPRO+(addr-0x800)/2))=val;
*(unsigned int *) &(SCSP->DSP.MPRO[(addr-0x800)/2])=val;
else
int a=1;
if(addr==0xBFC)
@ -1059,13 +1059,13 @@ unsigned char SCSP_r8(unsigned int addr)
addr&=0x1f;
SCSP_UpdateSlotRegR(slot,(addr^1)&0x1f);
v=*((unsigned char *) (SCSP->Slots[slot].datab+(addr^1)));
v=*(unsigned char *) &(SCSP->Slots[slot].datab[addr^1]);
//DebugLog("Slot %02X Reg %02X Read byte %02X",slot,addr^1,v);
}
else if(addr<0x600)
{
SCSP_UpdateRegR(addr&0xff);
v= *((unsigned char *) (SCSP->datab+((addr&0xff)^1)));
v= *(unsigned char *) &(SCSP->datab[(addr&0xff)^1]);
//ErrorLogMessage("SCSP Reg %02X Read byte %02X",addr&0xff,v);
}
else if(addr<0x700)
@ -1082,13 +1082,13 @@ unsigned short SCSP_r16(unsigned int addr)
int slot=addr/0x20;
addr&=0x1f;
SCSP_UpdateSlotRegR(slot,addr&0x1f);
v=*((unsigned short *) (SCSP->Slots[slot].datab+(addr)));
v=*(unsigned short *) &(SCSP->Slots[slot].datab[addr]);
//DebugLog("Slot %02X Reg %02X Read word %04X",slot,addr,v);
}
else if(addr<0x600)
{
SCSP_UpdateRegR(addr&0xff);
v= *((unsigned short *) (SCSP->datab+((addr&0xff))));
v= *(unsigned short *) &(SCSP->datab[addr&0xff]);
//ErrorLogMessage("SCSP Reg %02X Read word %04X",addr&0xff,v);
}
else if(addr<0x700)
@ -1279,7 +1279,7 @@ SCSPNAME(_8bit,lfo,alfo,loop)\
}\
else\
{\
signed short *p=(signed short *) (slot->base+((slot->cur_addr>>(SHIFT-1))&(~1)));\
signed short *p=(signed short *) &(slot->base[(slot->cur_addr>>(SHIFT-1))&(~1)]);\
signed int fpart=slot->cur_addr&((1<<SHIFT)-1);\
sample=(p[0]);\
}\
@ -1611,7 +1611,7 @@ signed int inline SCSP_UpdateSlot(_SLOT *slot)
if(PCM8B(slot)) //8 bit signed
{
signed char *p=(signed char *) (slot->base+(addr^1));
signed char *p=(signed char *) &(slot->base[addr^1]);
int s;
signed int fpart=slot->cur_addr&((1<<SHIFT)-1);
sample=(p[0])<<8;
@ -1626,7 +1626,7 @@ signed int inline SCSP_UpdateSlot(_SLOT *slot)
}
else //16 bit signed (endianness?)
{
signed short *p=(signed short *) (slot->base+addr);
signed short *p=(signed short *) &(slot->base[addr]);
int s;
signed int fpart=slot->cur_addr&((1<<SHIFT)-1);
sample=(p[0]);

View file

@ -29,38 +29,38 @@
#define INCLUDED_SCSP_H
void SCSP_w8(unsigned int addr,unsigned char val);
void SCSP_w16(unsigned int addr,unsigned short val);
void SCSP_w32(unsigned int addr,unsigned int val);
unsigned char SCSP_r8(unsigned int addr);
unsigned short SCSP_r16(unsigned int addr);
unsigned int SCSP_r32(unsigned int addr);
void SCSP_w8(UINT32 addr,UINT8 val);
void SCSP_w16(UINT32 addr,UINT16 val);
void SCSP_w32(UINT32 addr,UINT32 val);
UINT8 SCSP_r8(UINT32 addr);
UINT16 SCSP_r16(UINT32 addr);
UINT32 SCSP_r32(UINT32 addr);
void SCSP_SetCB(int (*Run68k)(int cycles),void (*Int68k)(int irq));
void SCSP_Update();
void SCSP_MidiIn(unsigned char);
void SCSP_MidiOutW(unsigned char);
unsigned char SCSP_MidiOutFill();
unsigned char SCSP_MidiInFill();
void SCSP_MidiIn(UINT8);
void SCSP_MidiOutW(UINT8);
UINT8 SCSP_MidiOutFill();
UINT8 SCSP_MidiInFill();
void SCSP_CpuRunScanline();
unsigned char SCSP_MidiOutR();
UINT8 SCSP_MidiOutR();
void SCSP_Init(int n);
void SCSP_SetRAM(int n,unsigned char *r);
void SCSP_SetRAM(int n,UINT8 *r);
void SCSP_RTECheck();
int SCSP_IRQCB(int);
void SCSP_Master_w8(unsigned int addr,unsigned char val);
void SCSP_Master_w16(unsigned int addr,unsigned short val);
void SCSP_Master_w32(unsigned int addr,unsigned int val);
void SCSP_Slave_w8(unsigned int addr,unsigned char val);
void SCSP_Slave_w16(unsigned int addr,unsigned short val);
void SCSP_Slave_w32(unsigned int addr,unsigned int val);
unsigned char SCSP_Master_r8(unsigned int addr);
unsigned short SCSP_Master_r16(unsigned int addr);
unsigned int SCSP_Master_r32(unsigned int addr);
unsigned char SCSP_Slave_r8(unsigned int addr);
unsigned short SCSP_Slave_r16(unsigned int addr);
unsigned int SCSP_Slave_r32(unsigned int addr);
void SCSP_Master_w8(UINT32 addr,UINT8 val);
void SCSP_Master_w16(UINT32 addr,UINT16 val);
void SCSP_Master_w32(UINT32 addr,UINT32 val);
void SCSP_Slave_w8(UINT32 addr,UINT8 val);
void SCSP_Slave_w16(UINT32 addr,UINT16 val);
void SCSP_Slave_w32(UINT32 addr,UINT32 val);
UINT8 SCSP_Master_r8(UINT32 addr);
UINT16 SCSP_Master_r16(UINT32 addr);
UINT32 SCSP_Master_r32(UINT32 addr);
UINT8 SCSP_Slave_r8(UINT32 addr);
UINT16 SCSP_Slave_r16(UINT32 addr);
UINT32 SCSP_Slave_r32(UINT32 addr);
// Supermodel interface functions
void SCSP_SaveState(CBlockFile *StateFile);

View file

@ -195,7 +195,7 @@ void SCSPDSP_Step(_SCSPDSP *DSP)
f=fopen("dsp.txt","wt");
for(int step=0;step</*128*/DSP->LastStep;++step)
{
unsigned short *IPtr=DSP->MPRO+step*4;
unsigned short *IPtr=&(DSP->MPRO[step*4]);
// if(IPtr[0]==0 && IPtr[1]==0 && IPtr[2]==0 && IPtr[3]==0)
// break;
@ -615,7 +615,7 @@ void SCSPDSP_Recompile(_SCSPDSP *DSP)
for(int step=0;step</*128*/DSP->LastStep;++step)
{
unsigned short *IPtr=DSP->MPRO+step*4;
unsigned short *IPtr=&(DSP->MPRO[step*4]);
_INST ThisInst,NextInst;
DecodeInst(IPtr,&ThisInst);
DecodeInst(IPtr+4,&NextInst);
@ -1069,7 +1069,7 @@ void SCSPDSP_Start(_SCSPDSP *DSP)
DSP->Stopped=false;
for(i=127;i>=0;--i)
{
unsigned short *IPtr=DSP->MPRO+i*4;
unsigned short *IPtr=&(DSP->MPRO[i*4]);
if(IPtr[0]!=0 || IPtr[1]!=0 || IPtr[2]!=0 || IPtr[3]!=0)
break;

View file

@ -9,47 +9,47 @@
struct _SCSPDSP
{
//Config
unsigned short *SCSPRAM;
UINT16 *SCSPRAM;
unsigned int RBP; //Ring buf pointer
unsigned int RBL; //Delay ram (Ring buffer) size in words
//context
signed short COEF[64]; //16 bit signed
unsigned short MADRS[32]; //offsets (in words), 16 bit
unsigned short MPRO[128*4]; //128 steps 64 bit
signed int TEMP[128]; //TEMP regs,24 bit signed
signed int MEMS[32]; //MEMS regs,24 bit signed
INT16 COEF[64]; //16 bit signed
UINT16 MADRS[32]; //offsets (in words), 16 bit
UINT16 MPRO[128*4]; //128 steps 64 bit
INT32 TEMP[128]; //TEMP regs,24 bit signed
INT32 MEMS[32]; //MEMS regs,24 bit signed
unsigned int DEC;
//input
signed int MIXS[16]; //MIXS, 24 bit signed
signed short EXTS[2]; //External inputs (CDDA) 16 bit signed
INT32 MIXS[16]; //MIXS, 24 bit signed
INT16 EXTS[2]; //External inputs (CDDA) 16 bit signed
//output
signed short EFREG[16]; //EFREG, 16 bit signed
INT16 EFREG[16]; //EFREG, 16 bit signed
bool Stopped;
int LastStep;
#ifdef DYNDSP
signed int ACC; //26 bit
signed int SHIFTED; //24 bit
signed int X; //24 bit
signed int Y; //13 bit
signed int B; //26 bit
signed int INPUTS; //24 bit
signed int MEMVAL;
signed int FRC_REG; //13 bit
signed int Y_REG; //24 bit
unsigned int ADDR;
unsigned int ADRS_REG; //13 bit
INT32 ACC; //26 bit
INT32 SHIFTED; //24 bit
INT32 X; //24 bit
INT32 Y; //13 bit
INT32 B; //26 bit
INT32 INPUTS; //24 bit
INT32 MEMVAL;
INT32 FRC_REG; //13 bit
INT32 Y_REG; //24 bit
UINT32 ADDR;
UINT32 ADRS_REG; //13 bit
void (*DoSteps)();
#endif
};
void SCSPDSP_Init(_SCSPDSP *DSP);
void SCSPDSP_SetSample(_SCSPDSP *DSP,signed int sample,int SEL,int MXL);
void SCSPDSP_SetSample(_SCSPDSP *DSP,INT32 sample,int SEL,int MXL);
void SCSPDSP_Step(_SCSPDSP *DSP);
void SCSPDSP_Start(_SCSPDSP *DSP);