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

View file

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

View file

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

View file

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