- Changes to let SCSP.cpp compile under Visual Studio 64-bit

- Fixed unsigned int overflow bug in SCSP.cpp that was causing VF3 to crash on selection screen when running 64-bit
This commit is contained in:
Nik Henson 2011-09-05 20:55:33 +00:00
parent 9f6a01eb55
commit c6e1c9a2ad
2 changed files with 16 additions and 16 deletions

View file

@ -1004,22 +1004,16 @@ void SCSP_w32(unsigned int addr,unsigned int val)
addr&=0x1f; addr&=0x1f;
//DebugLog("Slot %02X Reg %02X write dword %08X\n",slot,addr,val); //DebugLog("Slot %02X Reg %02X write dword %08X\n",slot,addr,val);
//printf("Slot %02X Reg %02X write dword %08X\n",slot,addr,val); //printf("Slot %02X Reg %02X write dword %08X\n",slot,addr,val);
#ifdef _MSC_VER // MS VisualC++ rotl(val, 16);
_asm rol val,16
#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);
SCSP_UpdateSlotReg(slot,(addr&0x1f)+2); SCSP_UpdateSlotReg(slot,(addr&0x1f)+2);
} }
else if(addr<0x600) else if(addr<0x600)
{ {
#ifdef _MSC_VER // MS VisualC++ rotl(val, 16);
_asm rol val,16
#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);
SCSP_UpdateReg((addr&0xff)+2); SCSP_UpdateReg((addr&0xff)+2);
@ -1030,11 +1024,7 @@ void SCSP_w32(unsigned int addr,unsigned int val)
{ {
#ifdef USEDSP #ifdef USEDSP
//DSP //DSP
#ifdef _MSC_VER // MS VisualC++ rotl(val, 16);
_asm rol val,16
#else
val = (val>>16)|(val<<16);
#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)
@ -1606,7 +1596,11 @@ signed int inline SCSP_UpdateSlot(_SLOT *slot)
signed int smp=(SCSP->RINGBUF[(SCSP->BUFPTR+MDXSL(slot))&63]+SCSP->RINGBUF[(SCSP->BUFPTR+MDYSL(slot))&63])/2; signed int smp=(SCSP->RINGBUF[(SCSP->BUFPTR+MDXSL(slot))&63]+SCSP->RINGBUF[(SCSP->BUFPTR+MDYSL(slot))&63])/2;
smp>>=11; smp>>=11;
addr+=smp; // Check for underflow before adding to addr
if (smp >= 0 || (DWORD)(-smp) < addr)
addr+=smp;
else
addr = 0;
if(!PCM8B(slot)) if(!PCM8B(slot))
addr&=~1; addr&=~1;
} }

View file

@ -58,6 +58,12 @@
#define stricmp strcasecmp #define stricmp strcasecmp
#endif #endif
// 32-bit rotate left
#ifdef _MSC_VER // MS VisualC++ - use VS intrinsic function _rotl
#define rotl(val, shift) val = _rotl(val, shift)
#else // Otherwise assume GCC which should optimise following to asm
#define rotl(val, shift) val = (val>>shift)|(val<<(32-shift))
#endif
/* /*
* Fundamental Data Types: * Fundamental Data Types: