From c6e1c9a2ade7884380a422ebeb601e27282398fb Mon Sep 17 00:00:00 2001 From: Nik Henson Date: Mon, 5 Sep 2011 20:55:33 +0000 Subject: [PATCH] - 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 --- Src/Sound/SCSP.cpp | 26 ++++++++++---------------- Src/Supermodel.h | 6 ++++++ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Src/Sound/SCSP.cpp b/Src/Sound/SCSP.cpp index e7986a5..048e267 100644 --- a/Src/Sound/SCSP.cpp +++ b/Src/Sound/SCSP.cpp @@ -1004,22 +1004,16 @@ void SCSP_w32(unsigned int addr,unsigned int val) addr&=0x1f; //DebugLog("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++ - _asm rol val,16 -#else - val = (val>>16)|(val<<16); -#endif + rotl(val, 16); + *(unsigned int *) &(SCSP->Slots[slot].datab[addr]) = val; SCSP_UpdateSlotReg(slot,addr&0x1f); SCSP_UpdateSlotReg(slot,(addr&0x1f)+2); } else if(addr<0x600) { -#ifdef _MSC_VER // MS VisualC++ - _asm rol val,16 -#else - val = (val>>16)|(val<<16); -#endif + rotl(val, 16); + *(unsigned int *) &(SCSP->datab[addr&0xff]) = val; SCSP_UpdateReg(addr&0xff); SCSP_UpdateReg((addr&0xff)+2); @@ -1030,11 +1024,7 @@ void SCSP_w32(unsigned int addr,unsigned int val) { #ifdef USEDSP //DSP -#ifdef _MSC_VER // MS VisualC++ - _asm rol val,16 -#else - val = (val>>16)|(val<<16); -#endif + rotl(val, 16); if(addr<0x780) //COEF *(unsigned int *) &(SCSP->DSP.COEF[(addr-0x700)/2])=val; 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; 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)) addr&=~1; } diff --git a/Src/Supermodel.h b/Src/Supermodel.h index 97e124b..ae0f2eb 100644 --- a/Src/Supermodel.h +++ b/Src/Supermodel.h @@ -58,6 +58,12 @@ #define stricmp strcasecmp #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: