mirror of
https://github.com/RetroDECK/Supermodel.git
synced 2025-04-10 19:15:14 +00:00
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:
parent
7b58fd0644
commit
99149124e6
|
@ -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]);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue