mirror of
https://github.com/RetroDECK/Supermodel.git
synced 2025-02-16 17:35:39 +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;
|
||||
//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]);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue