diff --git a/common/include/PS2Etypes.h b/common/include/PS2Etypes.h index 24ce9f20d0..705d22aa46 100644 --- a/common/include/PS2Etypes.h +++ b/common/include/PS2Etypes.h @@ -87,6 +87,7 @@ typedef unsigned int uint; #define PCSX2_ALIGNED16_EXTERN(x) extern __declspec(align(16)) x #define __naked __declspec(naked) +#define __unused /*unused*/ #define CALLBACK __stdcall #else // _MSC_VER diff --git a/pcsx2/Exceptions.h b/pcsx2/Exceptions.h index 615d0abaf1..c15ffb5acb 100644 --- a/pcsx2/Exceptions.h +++ b/pcsx2/Exceptions.h @@ -349,7 +349,7 @@ namespace Exception StateLoadError_Recoverable( fmt_string( "Unknown or unsupported savestate version: 0x%x", version ) ) {} - explicit UnsupportedStateVersion( int version, const std::string& msg ) : + explicit UnsupportedStateVersion( __unused int version, const std::string& msg ) : StateLoadError_Recoverable( msg ) {} }; diff --git a/pcsx2/IPU/IPU.cpp b/pcsx2/IPU/IPU.cpp index d0d0537645..3c481ccb0a 100644 --- a/pcsx2/IPU/IPU.cpp +++ b/pcsx2/IPU/IPU.cpp @@ -1139,7 +1139,7 @@ int __fastcall getBits(u8 *address, u32 size, u32 advance) { register u32 mask = 0, shift = 0, howmuch; u8* oldbits, *oldaddr = address; - u32 pointer = 0; + u32 pointer = 0, temp; // Check if the current BP has exceeded or reached the limit of 128 if (FillInternalBuffer(&g_BP.BP, 1, 8) < 8) return 0; @@ -1159,7 +1159,8 @@ int __fastcall getBits(u8 *address, u32 size, u32 advance) shift = 8; } - howmuch = min(min(8 - (pointer & 7), 128 - pointer), min(size, shift)); + temp = shift; // Lets not pass a register to min. + howmuch = min(min(8 - (pointer & 7), 128 - pointer), min(size, temp)); if (FillInternalBuffer(&pointer, advance, 8) < 8) { diff --git a/pcsx2/IPU/mpeg2lib/Mpeg.h b/pcsx2/IPU/mpeg2lib/Mpeg.h index 6ff8e5c618..43d2ddef0d 100644 --- a/pcsx2/IPU/mpeg2lib/Mpeg.h +++ b/pcsx2/IPU/mpeg2lib/Mpeg.h @@ -79,15 +79,15 @@ struct macroblock_rgb16{ }; struct decoder_t { - /* first, state that carries information from one macroblock to the */ - /* next inside a slice, and is never used outside of mpeg2_slice() */ + /* first, state that carries information from one macroblock to the */ + /* next inside a slice, and is never used outside of mpeg2_slice() */ - /* DCT coefficients - should be kept aligned ! */ - s16 DCTblock[64]; + /* DCT coefficients - should be kept aligned ! */ + s16 DCTblock[64]; - /* bit parsing stuff */ - u32 bitstream_buf; /* current 32 bit working set */ - int bitstream_bits; /* used bits in working set */ + /* bit parsing stuff */ + u32 bitstream_buf; /* current 32 bit working set */ + int bitstream_bits; /* used bits in working set */ u8 * bitstream_ptr; /* buffer with stream data; 128 bits buffer */ struct macroblock_8 *mb8; @@ -95,42 +95,42 @@ struct decoder_t { struct macroblock_rgb32 *rgb32; struct macroblock_rgb16 *rgb16; - int stride; + int stride; - /* predictor for DC coefficients in intra blocks */ - s16 dc_dct_pred[3]; + /* predictor for DC coefficients in intra blocks */ + s16 dc_dct_pred[3]; - int quantizer_scale; /* remove */ - int dmv_offset; /* remove */ + int quantizer_scale; /* remove */ + int dmv_offset; /* remove */ - /* now non-slice-specific information */ + /* now non-slice-specific information */ - /* sequence header stuff */ - u8 *intra_quantizer_matrix; - u8 *non_intra_quantizer_matrix; + /* sequence header stuff */ + u8 *intra_quantizer_matrix; + u8 *non_intra_quantizer_matrix; - /* picture header stuff */ + /* picture header stuff */ - /* what type of picture this is (I, P, B, D) */ - int coding_type; + /* what type of picture this is (I, P, B, D) */ + int coding_type; - /* picture coding extension stuff */ + /* picture coding extension stuff */ - /* quantization factor for intra dc coefficients */ - int intra_dc_precision; - /* top/bottom/both fields */ - int picture_structure; - /* bool to indicate all predictions are frame based */ - int frame_pred_frame_dct; - /* bool to indicate whether intra blocks have motion vectors */ - /* (for concealment) */ - int concealment_motion_vectors; - /* bit to indicate which quantization table to use */ - int q_scale_type; - /* bool to use different vlc tables */ - int intra_vlc_format; - /* used for DMV MC */ - int top_field_first; + /* quantization factor for intra dc coefficients */ + int intra_dc_precision; + /* top/bottom/both fields */ + int picture_structure; + /* bool to indicate all predictions are frame based */ + int frame_pred_frame_dct; + /* bool to indicate whether intra blocks have motion vectors */ + /* (for concealment) */ + int concealment_motion_vectors; + /* bit to indicate which quantization table to use */ + int q_scale_type; + /* bool to use different vlc tables */ + int intra_vlc_format; + /* used for DMV MC */ + int top_field_first; // Pseudo Sign Offset int sgn; // Dither Enable @@ -146,19 +146,18 @@ struct decoder_t { // Coded block pattern int coded_block_pattern; - /* stuff derived from bitstream */ + /* stuff derived from bitstream */ - /* pointer to the zigzag scan we're supposed to be using */ - const u8 * scan; + /* pointer to the zigzag scan we're supposed to be using */ + const u8 * scan; + + int second_field; - int second_field; - - int mpeg1; + int mpeg1; }; extern void (__fastcall *mpeg2_idct_copy) (s16 * block, u8* dest, int stride); -extern void (__fastcall *mpeg2_idct_add) (int last, s16 * block, - /*u8*/s16* dest, int stride); +extern void (__fastcall *mpeg2_idct_add) (int last, s16 * block, s16* dest, int stride); #define IDEC 0 #define BDEC 1 @@ -188,11 +187,6 @@ void mpeg2_idct_init (); #define BigEndian(out, in) out = _byteswap_ulong(in) #else #define BigEndian(out, in) out = __builtin_bswap32(in) // or we could use the asm function bswap... -// No need to reimplement something already in the compiler. -//#define BigEndian(out, in) \ -// out = (((((in) >> 24) & 0xFF) << 0) + ((((in) >> 16) & 0xFF) << 8) + \ -// ((((in) >> 8) & 0xFF) << 16) + ((((in) >> 0) & 0xFF) << 24)); - #endif #endif//__MPEG_H__ diff --git a/pcsx2/Linux/ConfigDlg.h b/pcsx2/Linux/ConfigDlg.h index 13bfa0c49b..5a8f971e11 100644 --- a/pcsx2/Linux/ConfigDlg.h +++ b/pcsx2/Linux/ConfigDlg.h @@ -251,7 +251,5 @@ void OnConf_Cpu(GtkMenuItem *menuitem, gpointer user_data); void OnConf_Conf(GtkMenuItem *menuitem, gpointer user_data); void SetActiveComboItem(GtkComboBox *widget, char plist[255][255], GList *list, char *conf); void SetComboToGList(GtkComboBox *widget, GList *list); -static void ConfPlugin(PluginConf confs, char* plugin, const char* name); -static void TestPlugin(PluginConf confs, char* plugin, const char* name); #endif // __CONFIGDLG_H__ \ No newline at end of file diff --git a/pcsx2/Linux/LnxSysExec.cpp b/pcsx2/Linux/LnxSysExec.cpp index 7a437df3c1..5ce58e3b1c 100644 --- a/pcsx2/Linux/LnxSysExec.cpp +++ b/pcsx2/Linux/LnxSysExec.cpp @@ -45,9 +45,6 @@ static const uptr m_pagemask = getpagesize()-1; // Linux implementation of SIGSEGV handler. Bind it using sigaction(). void SysPageFaultExceptionFilter( int signal, siginfo_t *info, void * ) { - int err; - - //DevCon::Error("SysPageFaultExceptionFilter!"); // get bad virtual address uptr offset = (u8*)info->si_addr - psM; @@ -420,9 +417,6 @@ namespace HostGui void ResetMenuSlots() { - GtkWidget *Item; - char str[g_MaxPath], str2[g_MaxPath]; - for (int i = 0; i < 5; i++) { Slots[i] = States_isSlotUsed(i); @@ -450,94 +444,94 @@ namespace HostGui #define ALT_EVT(evt) ((evt == XK_Alt_L) || (evt == XK_Alt_R)) #define CAPS_LOCK_EVT(evt) (evt == XK_Caps_Lock) -void __fastcall KeyEvent(keyEvent* ev) -{ - struct KeyModifiers *keymod = &keymodifiers; + void __fastcall KeyEvent(keyEvent* ev) + { + struct KeyModifiers *keymod = &keymodifiers; - if (ev == NULL) return; + if (ev == NULL) return; - if (ev->evt == KEYRELEASE) - { - if (SHIFT_EVT(ev->key)) keymod->shift = FALSE; - if (CTRL_EVT(ev->key)) keymod->control = FALSE; - if (ALT_EVT(ev->key)) keymod->alt = FALSE; - if (CAPS_LOCK_EVT(ev->key)) keymod->capslock = FALSE; - GSkeyEvent(ev); - return; - } + if (GSkeyEvent != NULL) GSkeyEvent(ev); - if (ev->evt == KEYPRESS) - { - if (SHIFT_EVT(ev->key)) keymod->shift = TRUE; - if (CTRL_EVT(ev->key)) keymod->control = TRUE; - if (ALT_EVT(ev->key)) keymod->alt = TRUE; - if (CAPS_LOCK_EVT(ev->key)) keymod->capslock = TRUE; + if (ev->evt == KEYPRESS) + { + if (SHIFT_EVT(ev->key)) keymod->shift = TRUE; + if (CTRL_EVT(ev->key)) keymod->control = TRUE; + if (ALT_EVT(ev->key)) keymod->alt = TRUE; + if (CAPS_LOCK_EVT(ev->key)) keymod->capslock = TRUE; - switch (ev->key) - { - case XK_F1: - case XK_F2: - case XK_F3: - case XK_F4: - case XK_F5: - case XK_F6: - case XK_F7: - case XK_F8: - case XK_F9: - case XK_F10: - case XK_F11: - case XK_F12: - try - { - ProcessFKeys(ev->key - XK_F1 + 1, keymod); - } - catch (Exception::CpuStateShutdown&) - { - // Woops! Something was unrecoverable. Bummer. - // Let's give the user a RunGui! + switch (ev->key) + { + case XK_F1: + case XK_F2: + case XK_F3: + case XK_F4: + case XK_F5: + case XK_F6: + case XK_F7: + case XK_F8: + case XK_F9: + case XK_F10: + case XK_F11: + case XK_F12: + try + { + ProcessFKeys(ev->key - XK_F1 + 1, keymod); + } + catch (Exception::CpuStateShutdown&) + { + // Woops! Something was unrecoverable. Bummer. + // Let's give the user a RunGui! - g_EmulationInProgress = false; - SysEndExecution(); - } - break; + g_EmulationInProgress = false; + SysEndExecution(); + } + break; - case XK_Tab: - CycleFrameLimit(0); - break; + case XK_Tab: + CycleFrameLimit(0); + break; - case XK_Escape: - signal(SIGINT, SIG_DFL); - signal(SIGPIPE, SIG_DFL); + case XK_Escape: + signal(SIGINT, SIG_DFL); + signal(SIGPIPE, SIG_DFL); -#ifdef PCSX2_DEVBUILD - if (g_SaveGSStream >= 3) - { - g_SaveGSStream = 4;// gs state - break; - } -#endif - SysEndExecution(); + #ifdef PCSX2_DEVBUILD + if (g_SaveGSStream >= 3) + { + g_SaveGSStream = 4;// gs state + break; + } + #endif + SysEndExecution(); - if (g_Startup.NoGui) exit(0); + if (g_Startup.NoGui) exit(0); - // fixme: The GUI is now capable of receiving control back from the - // emulator. Which means that when we call SysEscapeExecute() here, the - // emulation loop in ExecuteCpu() will exit. You should be able to set it - // up so that it returns control to the existing GTK event loop, instead of - // always starting a new one via RunGui(). (but could take some trial and - // error) -- (air) + // fixme: The GUI is now capable of receiving control back from the + // emulator. Which means that when we call SysEscapeExecute() here, the + // emulation loop in ExecuteCpu() will exit. You should be able to set it + // up so that it returns control to the existing GTK event loop, instead of + // always starting a new one via RunGui(). (but could take some trial and + // error) -- (air) + + // Easier said then done; running gtk in two threads at the same time can't be + // done, and working around that is pretty fiddly. + RunGui(); + break; - // Easier said then done; running gtk in two threads at the same time can't be - // done, and working around that is pretty fiddly. - RunGui(); - break; + default: + GSkeyEvent(ev); + break; + } + } + else if (ev->evt == KEYRELEASE) + { + if (SHIFT_EVT(ev->key)) keymod->shift = FALSE; + if (CTRL_EVT(ev->key)) keymod->control = FALSE; + if (ALT_EVT(ev->key)) keymod->alt = FALSE; + if (CAPS_LOCK_EVT(ev->key)) keymod->capslock = FALSE; + } - default: - GSkeyEvent(ev); - break; - } - } + return; + } - return; -} } diff --git a/pcsx2/Memory.h b/pcsx2/Memory.h index 41d4d05b32..1ac1e085b7 100644 --- a/pcsx2/Memory.h +++ b/pcsx2/Memory.h @@ -58,7 +58,7 @@ extern u8 *psS; //0.015 mb, scratch pad extern u8 g_RealGSMem[Ps2MemSize::GSregs]; #define PS2MEM_GS g_RealGSMem -#define PSM(mem) (vtlb_GetPhyPtr(mem&0x1fffffff)) //pcsx2 is a competition.The one with most hacks wins :D +#define PSM(mem) (vtlb_GetPhyPtr((mem)&0x1fffffff)) //pcsx2 is a competition.The one with most hacks wins :D #define psMs8(mem) (*(s8 *)&PS2MEM_BASE[(mem) & 0x1ffffff]) #define psMs16(mem) (*(s16*)&PS2MEM_BASE[(mem) & 0x1ffffff]) diff --git a/pcsx2/Misc.cpp b/pcsx2/Misc.cpp index 626830295f..6df6b6535a 100644 --- a/pcsx2/Misc.cpp +++ b/pcsx2/Misc.cpp @@ -420,7 +420,7 @@ char *ParseLang(char *id) { char* mystrlwr( char* string ) { assert( string != NULL ); - while ( 0 != ( *string++ = (char)tolower( *string ) ) ); + while ( 0 != ( *string++ = (char)tolower( *string ) ) ) ; return string; } @@ -493,102 +493,99 @@ void CycleFrameLimit(int dir) void ProcessFKeys(int fkey, struct KeyModifiers *keymod) { - assert(fkey >= 1 && fkey <= 12 ); + assert(fkey >= 1 && fkey <= 12 ); - switch(fkey) - { - case 1: - try - { - gzSavingState( SaveState::GetFilename( StatesC ) ).FreezeAll(); - HostGui::ResetMenuSlots(); - } - catch( Exception::BaseException& ex ) - { - // 99% of the time this is a file permission error and the - // cpu state is intact so just display a passive msg to console. + switch(fkey) { + case 1: + try + { + gzSavingState( SaveState::GetFilename( StatesC ) ).FreezeAll(); + HostGui::ResetMenuSlots(); + } + catch( Exception::BaseException& ex ) + { + // 99% of the time this is a file permission error and the + // cpu state is intact so just display a passive msg to console. - Console::Error( _( "Error > Could not save state to slot %d" ), params StatesC ); - Console::Error( ex.cMessage() ); - } - break; + Console::Error( _( "Error > Could not save state to slot %d" ), params StatesC ); + Console::Error( ex.cMessage() ); + } + break; - case 2: - if( keymod->shift ) - StatesC = (StatesC+NUM_STATES-1) % NUM_STATES; - else - StatesC = (StatesC+1) % NUM_STATES; + case 2: + if( keymod->shift ) + StatesC = (StatesC+NUM_STATES-1) % NUM_STATES; + else + StatesC = (StatesC+1) % NUM_STATES; - Console::Notice( _( " > Selected savestate slot %d" ), params StatesC); + Console::Notice( _( " > Selected savestate slot %d" ), params StatesC); - if( GSchangeSaveState != NULL ) - GSchangeSaveState(StatesC, SaveState::GetFilename(StatesC).c_str()); - break; + if( GSchangeSaveState != NULL ) + GSchangeSaveState(StatesC, SaveState::GetFilename(StatesC).c_str()); + break; - case 3: - try - { - gzLoadingState joe( SaveState::GetFilename( StatesC ) ); // throws exception on version mismatch - cpuReset(); - SysClearExecutionCache(); - joe.FreezeAll(); - } - catch( Exception::StateLoadError_Recoverable& ) - { - // At this point the cpu hasn't been reset, so we can return - // control to the user safely... (and silently) - } - catch( Exception::FileNotFound& ) - { - Console::Notice( _("Saveslot %d cannot be loaded; slot does not exist (file not found)"), params StatesC ); - } - catch( Exception::RuntimeError& ex ) - { - // This is the bad one. Chances are the cpu has been reset, so emulation has - // to be aborted. Sorry user! We'll give you some info for your trouble: + case 3: + try + { + gzLoadingState joe( SaveState::GetFilename( StatesC ) ); // throws exception on version mismatch + cpuReset(); + SysClearExecutionCache(); + joe.FreezeAll(); + } + catch( Exception::StateLoadError_Recoverable& ) + { + // At this point the cpu hasn't been reset, so we can return + // control to the user safely... (and silently) + } + catch( Exception::FileNotFound& ) + { + Console::Notice( _("Saveslot %d cannot be loaded; slot does not exist (file not found)"), params StatesC ); + } + catch( Exception::RuntimeError& ex ) + { + // This is the bad one. Chances are the cpu has been reset, so emulation has + // to be aborted. Sorry user! We'll give you some info for your trouble: - Console::Error( _("An error occured while trying to load saveslot %d"), params StatesC ); - Console::Error( ex.cMessage() ); - Msgbox::Alert( - "Pcsx2 encountered an error while trying to load the savestate\n" - "and emulation had to be aborted." ); + Console::Error( _("An error occured while trying to load saveslot %d"), params StatesC ); + Console::Error( ex.cMessage() ); + Msgbox::Alert( + "Pcsx2 encountered an error while trying to load the savestate\n" + "and emulation had to be aborted." ); - ClosePlugins( true ); + ClosePlugins( true ); - throw Exception::CpuStateShutdown( - "Saveslot load failed; PS2 emulated state had to be shut down." ); // let the GUI handle the error "gracefully" - } - break; + throw Exception::CpuStateShutdown( + "Saveslot load failed; PS2 emulated state had to be shut down." ); // let the GUI handle the error "gracefully" + } + break; - case 4: - CycleFrameLimit(keymod->shift ? -1 : 1); - break; + case 4: + CycleFrameLimit(keymod->shift ? -1 : 1); + break; - // note: VK_F5-VK_F7 are reserved for GS - case 8: - GSmakeSnapshot( SNAPSHOTS_DIR "/" ); - break; - - case 9: //gsdx "on the fly" renderer switching - if (!renderswitch) - { - StateRecovery::MakeGsOnly(); - g_EmulationInProgress = false; - CloseGS(); - renderswitch = true; //go to dx9 sw - StateRecovery::Recover(); - HostGui::BeginExecution(); //also sets g_EmulationInProgress to true later - } - else - { - StateRecovery::MakeGsOnly(); - g_EmulationInProgress = false; - CloseGS(); - renderswitch = false; //return to default renderer - StateRecovery::Recover(); - HostGui::BeginExecution(); //also sets g_EmulationInProgress to true later - } - break; + // note: VK_F5-VK_F7 are reserved for GS + case 8: + GSmakeSnapshot( SNAPSHOTS_DIR "/" ); + break; + + case 9: //gsdx "on the fly" renderer switching + if (!renderswitch) { + StateRecovery::MakeGsOnly(); + g_EmulationInProgress = false; + CloseGS(); + renderswitch = true; //go to dx9 sw + StateRecovery::Recover(); + HostGui::BeginExecution(); //also sets g_EmulationInProgress to true later + } + else { + StateRecovery::MakeGsOnly(); + g_EmulationInProgress = false; + CloseGS(); + renderswitch = false; //return to default renderer + StateRecovery::Recover(); + HostGui::BeginExecution(); //also sets g_EmulationInProgress to true later + } + break; #ifdef PCSX2_DEVBUILD case 10: // There's likely a better way to implement this, but this seemed useful. @@ -602,60 +599,55 @@ void ProcessFKeys(int fkey, struct KeyModifiers *keymod) GSprintf(10,"Logging Disabled."); break; - case 11: - if( mtgsThread != NULL ) - { - Console::Notice( "Cannot make gsstates in MTGS mode" ); - } - else - { - string Text; - if( strgametitle[0] != 0 ) - { - // only take the first two words - char name[256], *tok; - string gsText; + + case 11: + if( mtgsThread != NULL ) { + Console::Notice( "Cannot make gsstates in MTGS mode" ); + } + else + { + string Text; + if( strgametitle[0] != 0 ) { + // only take the first two words + char name[256], *tok; + string gsText; - tok = strtok(strgametitle, " "); - sprintf(name, "%s_", mystrlwr(tok)); - - tok = strtok(NULL, " "); - if( tok != NULL ) strcat(name, tok); + tok = strtok(strgametitle, " "); + sprintf(name, "%s_", mystrlwr(tok)); + tok = strtok(NULL, " "); + if( tok != NULL ) strcat(name, tok); - ssprintf( gsText, "%s.%d.gs", name, StatesC); - Text = Path::Combine( SSTATES_DIR, gsText ); - } - else - { - Text = GetGSStateFilename(); - } - - SaveGSState(Text); - } - break; + + ssprintf( gsText, "%s.%d.gs", name, StatesC); + Text = Path::Combine( SSTATES_DIR, gsText ); + } + else + Text = GetGSStateFilename(); + + SaveGSState(Text); + } + break; #endif - case 12: - if( keymod->shift ) - { + case 12: + if( keymod->shift ) { #ifdef PCSX2_DEVBUILD - iDumpRegisters(cpuRegs.pc, 0); - Console::Notice("hardware registers dumped EE:%x, IOP:%x\n", params cpuRegs.pc, psxRegs.pc); + iDumpRegisters(cpuRegs.pc, 0); + Console::Notice("hardware registers dumped EE:%x, IOP:%x\n", params cpuRegs.pc, psxRegs.pc); #endif - } - else - { - g_Pcsx2Recording ^= 1; - - if( mtgsThread != NULL ) - mtgsThread->SendSimplePacket(GS_RINGTYPE_RECORD, g_Pcsx2Recording, 0, 0); - else if( GSsetupRecording != NULL ) - GSsetupRecording(g_Pcsx2Recording, NULL); - - if( SPU2setupRecording != NULL ) SPU2setupRecording(g_Pcsx2Recording, NULL); - } - break; - } + } + else { + g_Pcsx2Recording ^= 1; + if( mtgsThread != NULL ) { + mtgsThread->SendSimplePacket(GS_RINGTYPE_RECORD, g_Pcsx2Recording, 0, 0); + } + else { + if( GSsetupRecording != NULL ) GSsetupRecording(g_Pcsx2Recording, NULL); + } + if( SPU2setupRecording != NULL ) SPU2setupRecording(g_Pcsx2Recording, NULL); + } + break; + } } void _memset16_unaligned( void* dest, u16 data, size_t size ) diff --git a/pcsx2/Patch.cpp b/pcsx2/Patch.cpp index 5284d16395..9262dcf3b0 100644 --- a/pcsx2/Patch.cpp +++ b/pcsx2/Patch.cpp @@ -609,9 +609,10 @@ void inifile_read( const char * name ) char* pend = buffer+strlen(buffer); while(pstart != pend ) { - // stop at the first . since we only want to update the hex - if( *pstart == '.' ) break; - *pstart++ = toupper(*pstart); + // stop at the first . since we only want to update the hex + if( *pstart == '.' ) break; + *pstart = toupper(*pstart); + *pstart++; } f1 = fopen(buffer, "rt"); diff --git a/pcsx2/VUops.cpp b/pcsx2/VUops.cpp index 0f7a112ae4..e043760350 100644 --- a/pcsx2/VUops.cpp +++ b/pcsx2/VUops.cpp @@ -1309,25 +1309,27 @@ void _vuMINIw(VURegs * VU) { } void _vuOPMULA(VURegs * VU) { - VU->ACC.i.x = VU_MACx_UPDATE(VU, vuDouble(VU->VF[_Fs_].i.y) * vuDouble(VU->VF[_Ft_].i.z)); - VU->ACC.i.y = VU_MACy_UPDATE(VU, vuDouble(VU->VF[_Fs_].i.z) * vuDouble(VU->VF[_Ft_].i.x)); - VU->ACC.i.z = VU_MACz_UPDATE(VU, vuDouble(VU->VF[_Fs_].i.x) * vuDouble(VU->VF[_Ft_].i.y)); - VU_STAT_UPDATE(VU); + VU->ACC.i.x = VU_MACx_UPDATE(VU, vuDouble(VU->VF[_Fs_].i.y) * vuDouble(VU->VF[_Ft_].i.z)); + VU->ACC.i.y = VU_MACy_UPDATE(VU, vuDouble(VU->VF[_Fs_].i.z) * vuDouble(VU->VF[_Ft_].i.x)); + VU->ACC.i.z = VU_MACz_UPDATE(VU, vuDouble(VU->VF[_Fs_].i.x) * vuDouble(VU->VF[_Ft_].i.y)); + VU_STAT_UPDATE(VU); }/*last updated 8/05/03 shadow*/ void _vuOPMSUB(VURegs * VU) { VECTOR * dst; float ftx, fty, ftz; float fsx, fsy, fsz; - if (_Fd_ == 0) dst = &RDzero; - else dst = &VU->VF[_Fd_]; + if (_Fd_ == 0) + dst = &RDzero; + else + dst = &VU->VF[_Fd_]; ftx = vuDouble(VU->VF[_Ft_].i.x); fty = vuDouble(VU->VF[_Ft_].i.y); ftz = vuDouble(VU->VF[_Ft_].i.z); fsx = vuDouble(VU->VF[_Fs_].i.x); fsy = vuDouble(VU->VF[_Fs_].i.y); fsz = vuDouble(VU->VF[_Fs_].i.z); - dst->i.x = VU_MACx_UPDATE(VU, vuDouble(VU->ACC.i.x) - fsy * ftz); - dst->i.y = VU_MACy_UPDATE(VU, vuDouble(VU->ACC.i.y) - fsz * ftx); - dst->i.z = VU_MACz_UPDATE(VU, vuDouble(VU->ACC.i.z) - fsx * fty); - VU_STAT_UPDATE(VU); + dst->i.x = VU_MACx_UPDATE(VU, vuDouble(VU->ACC.i.x) - fsy * ftz); + dst->i.y = VU_MACy_UPDATE(VU, vuDouble(VU->ACC.i.y) - fsz * ftx); + dst->i.z = VU_MACz_UPDATE(VU, vuDouble(VU->ACC.i.z) - fsx * fty); + VU_STAT_UPDATE(VU); }/*last updated 8/05/03 shadow*/ void _vuNOP(VURegs * VU) { @@ -1410,7 +1412,7 @@ void _vuCLIP(VURegs * VU) { float value = fabs(vuDouble(VU->VF[_Ft_].i.w)); VU->clipflag <<= 6; - if ( vuDouble(VU->VF[_Fs_].i.x) > +value ) VU->clipflag|= 0x01; + if ( vuDouble(VU->VF[_Fs_].i.x) > +value ) VU->clipflag|= 0x01; if ( vuDouble(VU->VF[_Fs_].i.x) < -value ) VU->clipflag|= 0x02; if ( vuDouble(VU->VF[_Fs_].i.y) > +value ) VU->clipflag|= 0x04; if ( vuDouble(VU->VF[_Fs_].i.y) < -value ) VU->clipflag|= 0x08; @@ -1431,10 +1433,9 @@ void _vuDIV(VURegs * VU) { float ft = vuDouble(VU->VF[_Ft_].UL[_Ftf_]); float fs = vuDouble(VU->VF[_Fs_].UL[_Fsf_]); -// _vuFMACTestStall(VU, _Fs_); _vuFMACTestStall(VU, _Ft_); VU->statusflag = (VU->statusflag&0xfcf)|((VU->statusflag&0x30)<<6); - if (ft == 0.0) { + if (ft == 0.0) { if (fs == 0.0) { VU->statusflag |= 0x10; } else { @@ -1455,16 +1456,13 @@ void _vuDIV(VURegs * VU) { void _vuSQRT(VURegs * VU) { float ft = vuDouble(VU->VF[_Ft_].UL[_Ftf_]); -// _vuFMACTestStall(VU, _Ft_); VU->statusflag = (VU->statusflag&0xfcf)|((VU->statusflag&0x30)<<6); - if (ft < 0.0 ) - VU->statusflag |= 0x10; + if (ft < 0.0 ) VU->statusflag |= 0x10; VU->q.F = sqrt(fabs(ft)); VU->q.F = vuDouble(VU->q.UL); } //last update 15/01/06 zerofrog - /* Eminent Bug - Dvisior == 0 Check Missing ( D Flag Not Set ) */ /* REFIXED....ASADR; rerefixed....zerofrog */ void _vuRSQRT(VURegs * VU) { @@ -1472,7 +1470,6 @@ void _vuRSQRT(VURegs * VU) { float fs = vuDouble(VU->VF[_Fs_].UL[_Fsf_]); float temp; -// _vuFMACTestStall(VU, _Fs_); _vuFMACTestStall(VU, _Ft_); VU->statusflag = (VU->statusflag&0xfcf)|((VU->statusflag&0x30)<<6); if ( ft == 0.0 ) { @@ -1508,7 +1505,6 @@ void _vuRSQRT(VURegs * VU) { } } //last update 15/01/06 zerofrog - void _vuIADDI(VURegs * VU) { s16 imm = ((VU->code >> 6) & 0x1f); imm = ((imm & 0x10 ? 0xfff0 : 0) | (imm & 0xf)); @@ -1567,7 +1563,7 @@ void _vuMFIR(VURegs * VU) { // Big bug!!! mov from fs to ft not ft to fs. asadr void _vuMTIR(VURegs * VU) { if(_Ft_ == 0) return; - VU->VI[_Ft_].US[0] = *(u16*)&VU->VF[_Fs_].F[_Fsf_]; + VU->VI[_Ft_].US[0] = *(u16*)&VU->VF[_Fs_].F[_Fsf_]; } void _vuMR32(VURegs * VU) { @@ -1624,8 +1620,8 @@ void _vuLQI(VURegs * VU) { if (_Y) VU->VF[_Ft_].UL[1] = ptr[1]; if (_Z) VU->VF[_Ft_].UL[2] = ptr[2]; if (_W) VU->VF[_Ft_].UL[3] = ptr[3]; - } - if (_Fs_ != 0) VU->VI[_Fs_].US[0]++; + } + if (_Fs_ != 0) VU->VI[_Fs_].US[0]++; } /* addr is now signed. Asadr */ @@ -1735,7 +1731,6 @@ As an example for setting the polynomial variable correctly, the 23-bit M-series would be specified as (1 << 14). */ - //The two-tap 23 stage M-series polynomials are x23+x18 and x23+x14 ((1 << 18) and (1 << 14), respectively). //The reverse sequences can be generated by x23+x(23-18) and x23+x(23-14) ((1 << 9) and (1 << 5), respectively) u32 poly = 1 << 5; @@ -1745,23 +1740,13 @@ void SetPoly(u32 newPoly) { } void AdvanceLFSR(VURegs * VU) { - // code from www.project-fao.org + // code from www.project-fao.org (which is no longer there) int x = (VU->VI[REG_R].UL >> 4) & 1; int y = (VU->VI[REG_R].UL >> 22) & 1; VU->VI[REG_R].UL <<= 1; VU->VI[REG_R].UL ^= x ^ y; VU->VI[REG_R].UL = (VU->VI[REG_R].UL&0x7fffff)|0x3f800000; } -// old -// u32 lfsr = VU->VI[REG_R].UL & 0x007FFFFF; -// u32 oldlfsr = lfsr; -// lfsr <<= 1; -// if (oldlfsr & 0x00400000) { -// lfsr ^= poly; -// lfsr |= 1; -// } -// -// VU->VI[REG_R].UL = 0x3F800000 | (lfsr & 0x007FFFFF); void _vuRINIT(VURegs * VU) { VU->VI[REG_R].UL = 0x3F800000 | (VU->VF[_Fs_].UL[_Fsf_] & 0x007FFFFF); @@ -1864,7 +1849,6 @@ void _vuFCGET(VURegs * VU) { s32 _branchAddr(VURegs * VU) { s32 bpc = VU->VI[REG_TPC].SL + ( _Imm11_ * 8 ); - //if (bpc < 0) bpc = VU->VI[REG_TPC].SL + _UImm11_ * 8; bpc&= (VU == &VU1) ? 0x3fff : 0x0fff; return bpc; } @@ -1872,8 +1856,6 @@ s32 _branchAddr(VURegs * VU) { void _setBranch(VURegs * VU, u32 bpc) { VU->branch = 2; VU->branchpc = bpc; -// VU->vuExec(VU); -// VU->VI[REG_TPC].UL = bpc; } void _vuIBEQ(VURegs * VU) { @@ -1926,9 +1908,7 @@ void _vuB(VURegs * VU) { void _vuBAL(VURegs * VU) { s32 bpc = _branchAddr(VU); - if (_Ft_) { - VU->VI[_Ft_].US[0] = (VU->VI[REG_TPC].UL + 8)/8; - } + if (_Ft_) VU->VI[_Ft_].US[0] = (VU->VI[REG_TPC].UL + 8)/8; _setBranch(VU, bpc); } @@ -1940,9 +1920,7 @@ void _vuJR(VURegs * VU) { void _vuJALR(VURegs * VU) { u32 bpc = VU->VI[_Fs_].US[0] * 8; - if (_Ft_) { - VU->VI[_Ft_].US[0] = (VU->VI[REG_TPC].UL + 8)/8; - } + if (_Ft_) VU->VI[_Ft_].US[0] = (VU->VI[REG_TPC].UL + 8)/8; _setBranch(VU, bpc); } @@ -2249,8 +2227,6 @@ void _vuRegs##OP(VURegs * VU, _VURegsNum *VUregsn) { \ VUregsn->cycles = _cycles; \ } - - VUREGS_FTFS(ABS); VUREGS_FDFSFT(ADD, 0); diff --git a/pcsx2/Vif.cpp b/pcsx2/Vif.cpp index 0f778f212a..d4ece5c0d3 100644 --- a/pcsx2/Vif.cpp +++ b/pcsx2/Vif.cpp @@ -35,7 +35,6 @@ PCSX2_ALIGNED16(u32 g_vifCol0[4]); PCSX2_ALIGNED16(u32 g_vifRow1[4]); PCSX2_ALIGNED16(u32 g_vifCol1[4]); -//static int cycles; extern int g_vifCycles; u16 vifqwc = 0; bool mfifodmairq = FALSE; @@ -683,8 +682,11 @@ void mfifoVIF1transfer(int qwc) if (vif1ch->chcr & 0x40) { - if (vif1.stallontag == 1) ret = VIF1transfer(ptag + (2 + vif1.irqoffset), 2 - vif1.irqoffset, 1); //Transfer Tag on Stall - else ret = VIF1transfer(ptag + 2, 2, 1); //Transfer Tag + if (vif1.stallontag == 1) + ret = VIF1transfer(ptag + (2 + vif1.irqoffset), 2 - vif1.irqoffset, 1); //Transfer Tag on Stall + else + ret = VIF1transfer(ptag + 2, 2, 1); //Transfer Tag + if (ret == -2) { VIF_LOG("MFIFO Stallon tag"); @@ -696,7 +698,6 @@ void mfifoVIF1transfer(int qwc) id = (ptag[0] >> 28) & 0x7; vif1ch->qwc = (ptag[0] & 0xffff); vif1ch->madr = ptag[1]; - //cycles += 2; vif1ch->chcr = (vif1ch->chcr & 0xFFFF) | ((*ptag) & 0xFFFF0000); diff --git a/pcsx2/VifDma.cpp b/pcsx2/VifDma.cpp index 2413640c88..02361285c2 100644 --- a/pcsx2/VifDma.cpp +++ b/pcsx2/VifDma.cpp @@ -22,7 +22,6 @@ #include "Vif.h" #include "VUmicro.h" #include "GS.h" - #include "VifDma.h" #include @@ -65,6 +64,7 @@ static const unsigned int VIF1dmanum = 1; int g_vifCycles = 0; bool path3hack = FALSE; +bool Path3transfer = FALSE; typedef void (__fastcall *UNPACKFUNCTYPE)(u32 *dest, u32 *data, int size); typedef int (*UNPACKPARTFUNCTYPESSE)(u32 *dest, u32 *data, int size); @@ -73,6 +73,9 @@ extern void (*Vif0CMDTLB[75])(); extern int (__fastcall *Vif1TransTLB[128])(u32 *data); extern int (__fastcall *Vif0TransTLB[128])(u32 *data); +u32 *vif0ptag, *vif1ptag; +u8 s_maskwrite[256]; + struct VIFUnpackFuncTable { UNPACKFUNCTYPE funcU; @@ -334,7 +337,7 @@ static void ProcessMemSkip(int size, unsigned int unpackType, const unsigned int static void VIFunpack(u32 *data, vifCode *v, int size, const unsigned int VIFdmanum) { u32 *dest; - unsigned int unpackType; + u32 unpackType; UNPACKFUNCTYPE func; const VIFUnpackFuncTable *ft; vifStruct *vif; @@ -381,6 +384,7 @@ static void VIFunpack(u32 *data, vifCode *v, int size, const unsigned int VIFdma { VIF_LOG("*PCSX2*: warning v->size != size"); } + if ((v->addr + size*4) > memsize) { Console::Notice("*PCSX2*: fixme unpack overflow"); @@ -416,7 +420,7 @@ static void VIFunpack(u32 *data, vifCode *v, int size, const unsigned int VIFdma { int destinc, unpacksize; - VIFUNPACK_LOG("aligning packet size = %d offset %d addr %x", size, vifRegs->offset, vif->tag.addr); + VIFUNPACK_LOG("Aligning packet size = %d offset %d addr %x", size, vifRegs->offset, vif->tag.addr); // SSE doesn't handle such small data if (v->size != (size >> 2)) @@ -426,7 +430,7 @@ static void VIFunpack(u32 *data, vifCode *v, int size, const unsigned int VIFdma { if (((u32)size / (u32)ft->dsize) < ((u32)ft->qsize - vifRegs->offset)) { - Console::WriteLn("wasnt enough left size/dsize = %x left to write %x", params(size / ft->dsize), (ft->qsize - vifRegs->offset)); + Console::WriteLn("Wasn't enough left size/dsize = %x left to write %x", params(size / ft->dsize), (ft->qsize - vifRegs->offset)); } unpacksize = min(((u32)size / (u32)ft->dsize), ((u32)ft->qsize - vifRegs->offset)); } @@ -455,7 +459,7 @@ static void VIFunpack(u32 *data, vifCode *v, int size, const unsigned int VIFdma { dest += destinc; } - VIFUNPACK_LOG("aligning packet done size = %d offset %d addr %x", size, vifRegs->offset, vif->tag.addr); + VIFUNPACK_LOG("Aligning packet done size = %d offset %d addr %x", size, vifRegs->offset, vif->tag.addr); } else if (v->size != (size >> 2)) @@ -475,7 +479,8 @@ static void VIFunpack(u32 *data, vifCode *v, int size, const unsigned int VIFdma // continuation from last stream incdest = ((vifRegs->cycle.cl - vifRegs->cycle.wl) << 2) + 4; - while (size >= ft->gsize && vifRegs->num > 0) + + while ((size >= ft->gsize) && (vifRegs->num > 0)) { func(dest, (u32*)cdata, ft->qsize); cdata += ft->gsize; @@ -501,7 +506,7 @@ static void VIFunpack(u32 *data, vifCode *v, int size, const unsigned int VIFdma } - if (size >= ft->gsize && !(v->addr&0xf)) + if ((size >= ft->gsize) && !(v->addr&0xf)) { const UNPACKPARTFUNCTYPESSE* pfn; int writemask; @@ -540,6 +545,7 @@ static void VIFunpack(u32 *data, vifCode *v, int size, const unsigned int VIFdma oldcycle = *(u32*) & vifRegs->cycle; vifRegs->cycle.cl = vifRegs->cycle.wl = 1; } + size = min(size, (int)vifRegs->num * ft->gsize); //size will always be the same or smaller pfn = vif->usn ? VIFfuncTableSSE[unpackType].funcU : VIFfuncTableSSE[unpackType].funcS; @@ -573,10 +579,10 @@ static void VIFunpack(u32 *data, vifCode *v, int size, const unsigned int VIFdma else { - if (unpackType == 0xC && vifRegs->cycle.cl == vifRegs->cycle.wl) //No use when SSE is available + if ((unpackType == 0xC) && (vifRegs->cycle.cl == vifRegs->cycle.wl)) //No use when SSE is available { // v4-32 - if (vifRegs->mode == 0 && !(vifRegs->code & 0x10000000) && vif->usn == 0) + if ((vifRegs->mode == 0) && !(vifRegs->code & 0x10000000) && (vif->usn == 0)) { vifRegs->num -= size >> 4; memcpy_fast((u8*)dest, cdata, size); @@ -587,7 +593,7 @@ static void VIFunpack(u32 *data, vifCode *v, int size, const unsigned int VIFdma incdest = ((vifRegs->cycle.cl - vifRegs->cycle.wl) << 2) + 4; - while (size >= ft->gsize && vifRegs->num > 0) + while ((size >= ft->gsize) && (vifRegs->num > 0)) { func(dest, (u32*)cdata, ft->qsize); cdata += ft->gsize; @@ -690,7 +696,6 @@ static void VIFunpack(u32 *data, vifCode *v, int size, const unsigned int VIFdma static void vuExecMicro(u32 addr, const u32 VIFdmanum) { - int _cycles; VURegs * VU; if (VIFdmanum == 0) @@ -729,21 +734,13 @@ static void vuExecMicro(u32 addr, const u32 VIFdmanum) } if (VIFdmanum == 0) - { - _cycles = VU0.cycle; vu0ExecMicro(addr); - } else - { - _cycles = VU1.cycle; vu1ExecMicro(addr); - } } -u8 s_maskwrite[256]; void vif0Init() { - u32 i; for (i = 0; i < 256; ++i) @@ -911,6 +908,7 @@ static int __fastcall Vif0TransMPG(u32 *data) // MPG else { int ret; + _vif0mpgTransfer(vif0.tag.addr, data, vif0.tag.size); ret = vif0.tag.size; vif0.tag.size = 0; @@ -932,8 +930,9 @@ static int __fastcall Vif0TransUnpack(u32 *data) // UNPACK } else { - int ret; /* we got all the data, transfer it fully */ + int ret; + VIFunpack(data, &vif0.tag, vif0.tag.size, VIF0dmanum); ret = vif0.tag.size; vif0.tag.size = 0; @@ -1080,7 +1079,10 @@ int VIF0transfer(u32 *data, int size, int istag) } vif0.cmd = 0; } - else Vif0CMDTLB[(vif0.cmd & 0x7f)](); + else + { + Vif0CMDTLB[(vif0.cmd & 0x7f)](); + } } ++data; --vif0.vifpacketsize; @@ -1107,24 +1109,23 @@ int VIF0transfer(u32 *data, int size, int istag) g_vifCycles += (transferred >> 2) * BIAS; /* guessing */ // use tag.size because some game doesn't like .cmd - if (vif0.irq && vif0.tag.size == 0) + if (vif0.irq && (vif0.tag.size == 0)) { vif0.vifstalled = 1; if (((vif0Regs->code >> 24) & 0x7f) != 0x7)vif0Regs->stat |= VIF0_STAT_VIS; //else Console::WriteLn("VIF0 IRQ on MARK"); + // spiderman doesn't break on qw boundaries vif0.irqoffset = transferred % 4; // cannot lose the offset - if (istag) + if (!istag) { - return -2; + transferred = transferred >> 2; + vif0ch->madr += (transferred << 4); + vif0ch->qwc -= transferred; } - - transferred = transferred >> 2; - vif0ch->madr += (transferred << 4); - vif0ch->qwc -= transferred; - //Console::WriteLn("Stall on vif0, FromSPR = %x, Vif0MADR = %x Sif0MADR = %x STADR = %x", params psHu32(0x1000d010), vif0ch->madr, psHu32(0x1000c010), psHu32(DMAC_STADR)); + //else Console::WriteLn("Stall on vif0, FromSPR = %x, Vif0MADR = %x Sif0MADR = %x STADR = %x", params psHu32(0x1000d010), vif0ch->madr, psHu32(0x1000c010), psHu32(DMAC_STADR)); return -2; } @@ -1149,8 +1150,7 @@ int _VIF0chain() if (vif0ch->qwc == 0 && vif0.vifstalled == 0) return 0; pMem = (u32*)dmaGetAddr(vif0ch->madr); - if (pMem == NULL) - return -1; + if (pMem == NULL) return -1; if (vif0.vifstalled) ret = VIF0transfer(pMem + vif0.irqoffset, vif0ch->qwc * 4 - vif0.irqoffset, 0); @@ -1160,8 +1160,6 @@ int _VIF0chain() return ret; } -u32 *vif0ptag; - int _chainVIF0() { int id, ret; @@ -1212,10 +1210,10 @@ int _chainVIF0() void vif0Interrupt() { - g_vifCycles = 0; //Reset the cycle count, Wouldnt reset on stall if put lower down. + g_vifCycles = 0; //Reset the cycle count, Wouldn't reset on stall if put lower down. VIF_LOG("vif0Interrupt: %8.8x", cpuRegs.cycle); - if (vif0.irq && vif0.tag.size == 0) + if (vif0.irq && (vif0.tag.size == 0)) { vif0Regs->stat |= VIF0_STAT_INT; hwIntcIrq(VIF0intc); @@ -1250,8 +1248,11 @@ void vif0Interrupt() return; } - if (vif0ch->qwc > 0) _VIF0chain(); - else _chainVIF0(); + if (vif0ch->qwc > 0) + _VIF0chain(); + else + _chainVIF0(); + CPU_INT(0, g_vifCycles); return; } @@ -1330,104 +1331,106 @@ void dmaVIF0() void vif0Write32(u32 mem, u32 value) { - if (mem == 0x10003830) // MARK + switch (mem) { - VIF_LOG("VIF0_MARK write32 0x%8.8x", value); + case 0x10003830: // MARK + VIF_LOG("VIF0_MARK write32 0x%8.8x", value); - /* Clear mark flag in VIF0_STAT and set mark with 'value' */ - vif0Regs->stat &= ~VIF0_STAT_MRK; - vif0Regs->mark = value; - } - else if (mem == 0x10003810) // FBRST - { - VIF_LOG("VIF0_FBRST write32 0x%8.8x", value); + /* Clear mark flag in VIF0_STAT and set mark with 'value' */ + vif0Regs->stat &= ~VIF0_STAT_MRK; + vif0Regs->mark = value; + break; + + case 0x10003810: // FBRST + VIF_LOG("VIF0_FBRST write32 0x%8.8x", value); - if (value & 0x1) - { - /* Reset VIF */ - //Console::WriteLn("Vif0 Reset %x", params vif0Regs->stat); - memzero_obj(vif0); - vif0ch->qwc = 0; //? - cpuRegs.interrupt &= ~1; //Stop all vif0 DMA's - psHu64(0x10004000) = 0; - psHu64(0x10004008) = 0; - vif0.done = 1; - vif0Regs->err = 0; - vif0Regs->stat &= ~(0xF000000 | VIF0_STAT_INT | VIF0_STAT_VSS | VIF0_STAT_VIS | VIF0_STAT_VFS | VIF0_STAT_VPS); // FQC=0 - } - if (value & 0x2) - { - /* Force Break the VIF */ - /* I guess we should stop the VIF dma here, but not 100% sure (linuz) */ - cpuRegs.interrupt &= ~1; //Stop all vif0 DMA's - vif0Regs->stat |= VIF0_STAT_VFS; - vif0Regs->stat &= ~VIF0_STAT_VPS; - vif0.vifstalled = 1; - Console::WriteLn("vif0 force break"); - } - if (value & 0x4) - { - /* Stop VIF */ - // Not completely sure about this, can't remember what game, used this, but 'draining' the VIF helped it, instead of - // just stoppin the VIF (linuz). - vif0Regs->stat |= VIF0_STAT_VSS; - vif0Regs->stat &= ~VIF0_STAT_VPS; - vif0.vifstalled = 1; - } - if (value & 0x8) - { - int cancel = 0; - - /* Cancel stall, first check if there is a stall to cancel, and then clear VIF0_STAT VSS|VFS|VIS|INT|ER0|ER1 bits */ - if (vif0Regs->stat & (VIF0_STAT_VSS | VIF0_STAT_VIS | VIF0_STAT_VFS)) - cancel = 1; - - vif0Regs->stat &= ~(VIF0_STAT_VSS | VIF0_STAT_VFS | VIF0_STAT_VIS | - VIF0_STAT_INT | VIF0_STAT_ER0 | VIF0_STAT_ER1); - if (cancel) + if (value & 0x1) { - if (vif0.vifstalled) + /* Reset VIF */ + //Console::WriteLn("Vif0 Reset %x", params vif0Regs->stat); + memzero_obj(vif0); + vif0ch->qwc = 0; //? + cpuRegs.interrupt &= ~1; //Stop all vif0 DMA's + psHu64(0x10004000) = 0; + psHu64(0x10004008) = 0; + vif0.done = 1; + vif0Regs->err = 0; + vif0Regs->stat &= ~(0xF000000 | VIF0_STAT_INT | VIF0_STAT_VSS | VIF0_STAT_VIS | VIF0_STAT_VFS | VIF0_STAT_VPS); // FQC=0 + } + if (value & 0x2) + { + /* Force Break the VIF */ + /* I guess we should stop the VIF dma here, but not 100% sure (linuz) */ + cpuRegs.interrupt &= ~1; //Stop all vif0 DMA's + vif0Regs->stat |= VIF0_STAT_VFS; + vif0Regs->stat &= ~VIF0_STAT_VPS; + vif0.vifstalled = 1; + Console::WriteLn("vif0 force break"); + } + if (value & 0x4) + { + /* Stop VIF */ + // Not completely sure about this, can't remember what game, used this, but 'draining' the VIF helped it, instead of + // just stoppin the VIF (linuz). + vif0Regs->stat |= VIF0_STAT_VSS; + vif0Regs->stat &= ~VIF0_STAT_VPS; + vif0.vifstalled = 1; + } + if (value & 0x8) + { + bool cancel = FALSE; + + /* Cancel stall, first check if there is a stall to cancel, and then clear VIF0_STAT VSS|VFS|VIS|INT|ER0|ER1 bits */ + if (vif0Regs->stat & (VIF0_STAT_VSS | VIF0_STAT_VIS | VIF0_STAT_VFS)) + cancel = TRUE; + + vif0Regs->stat &= ~(VIF0_STAT_VSS | VIF0_STAT_VFS | VIF0_STAT_VIS | + VIF0_STAT_INT | VIF0_STAT_ER0 | VIF0_STAT_ER1); + if (cancel) { - g_vifCycles = 0; + if (vif0.vifstalled) + { + g_vifCycles = 0; - // loop necessary for spiderman - if (vif0.stallontag == 1) - _chainVIF0(); - else - _VIF0chain(); + // loop necessary for spiderman + if (vif0.stallontag == 1) + _chainVIF0(); + else + _VIF0chain(); - vif0ch->chcr |= 0x100; - CPU_INT(0, g_vifCycles); // Gets the timing right - Flatout + vif0ch->chcr |= 0x100; + CPU_INT(0, g_vifCycles); // Gets the timing right - Flatout + } } } - } - } - else if (mem == 0x10003820) - { // ERR - VIF_LOG("VIF0_ERR write32 0x%8.8x", value); + break; + + case 0x10003820: + // ERR + VIF_LOG("VIF0_ERR write32 0x%8.8x", value); - /* Set VIF0_ERR with 'value' */ - vif0Regs->err = value; - } - else - { - Console::WriteLn("Unknown Vif0 write to %x", params mem); - if (mem >= 0x10003900 && mem < 0x10003980) - { - assert((mem&0xf) == 0); + /* Set VIF0_ERR with 'value' */ + vif0Regs->err = value; + break; + + default: + Console::WriteLn("Unknown Vif0 write to %x", params mem); + if (mem >= 0x10003900 && mem < 0x10003980) + { + assert((mem&0xf) == 0); - if (mem < 0x10003940) - g_vifRow0[(mem>>4)&3] = value; + if (mem < 0x10003940) + g_vifRow0[(mem>>4)&3] = value; + else + g_vifCol0[(mem>>4)&3] = value; + + } else - g_vifCol0[(mem>>4)&3] = value; - - } - else - { - psHu32(mem) = value; - } + { + psHu32(mem) = value; + } + break; } - /* Other registers are read-only so do nothing for them */ } @@ -1753,8 +1756,8 @@ static int __fastcall Vif1TransUnpack(u32 *data) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Vif1 CMD Base Commands //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// fixme: Global variables should not have the same name as local variables, and this probably shouldn't be local anyways. int transferred = 0; -bool Path3transfer = FALSE; static void Vif1CMDNop() // NOP { vif1.cmd &= ~0x7f; @@ -1810,6 +1813,7 @@ static void Vif1CMDMskPath3() // MSKPATH3 } else { + // fixme: This is the *only* reason 'transferred' is global. Otherwise it'd be local to Vif1Transfer. if (gif->chcr & 0x100) CPU_INT(2, (transferred >> 2) * BIAS); // Restart Path3 on its own, time it right! psHu32(GIF_STAT) &= ~0x2; } @@ -1951,7 +1955,6 @@ void (*Vif1CMDTLB[82])() = }; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - int VIF1transfer(u32 *data, int size, int istag) { int ret; @@ -1969,10 +1972,7 @@ int VIF1transfer(u32 *data, int size, int istag) if (vif1.cmd) { vif1Regs->stat |= VIF1_STAT_VPS_T; //Decompression has started - } - - if (vif1.cmd) - { + ret = Vif1TransTLB[vif1.cmd](data); data += ret; vif1.vifpacketsize -= ret; @@ -2032,10 +2032,8 @@ int VIF1transfer(u32 *data, int size, int istag) transferred += size - vif1.vifpacketsize; g_vifCycles += (transferred >> 2) * BIAS; /* guessing */ - vif1.irqoffset = transferred % 4; // cannot lose the offset - if (vif1.irq && vif1.cmd == 0) { vif1.vifstalled = 1; @@ -2044,15 +2042,15 @@ int VIF1transfer(u32 *data, int size, int istag) if (vif1ch->qwc == 0 && (vif1.irqoffset == 0 || istag == 1)) vif1.inprogress = 0; + // spiderman doesn't break on qw boundaries - if (istag) return -2; transferred = transferred >> 2; vif1ch->madr += (transferred << 4); vif1ch->qwc -= transferred; - if (vif1ch->qwc == 0 && vif1.irqoffset == 0) vif1.inprogress = 0; + if ((vif1ch->qwc == 0) && (vif1.irqoffset == 0)) vif1.inprogress = 0; //Console::WriteLn("Stall on vif1, FromSPR = %x, Vif1MADR = %x Sif0MADR = %x STADR = %x", params psHu32(0x1000d010), vif1ch->madr, psHu32(0x1000c010), psHu32(DMAC_STADR)); return -2; } @@ -2070,7 +2068,6 @@ int VIF1transfer(u32 *data, int size, int istag) if (vif1ch->qwc == 0 && (vif1.irqoffset == 0 || istag == 1)) vif1.inprogress = 0; - return 0; } @@ -2147,8 +2144,7 @@ int _VIF1chain() } pMem = (u32*)dmaGetAddr(vif1ch->madr); - if (pMem == NULL) - return -1; + if (pMem == NULL) return -1; VIF_LOG("VIF1chain size=%d, madr=%lx, tadr=%lx", vif1ch->qwc, vif1ch->madr, vif1ch->tadr); @@ -2161,10 +2157,6 @@ int _VIF1chain() return ret; } -static int prevvifcycles = 0; -static u32* prevviftag = NULL; -u32 *vif1ptag; - int _chainVIF1() { return vif1.done;//Return Done @@ -2172,7 +2164,6 @@ int _chainVIF1() __forceinline void vif1SetupTransfer() { - switch (vif1.dmamode) { case 0: //Normal @@ -2195,17 +2186,19 @@ __forceinline void vif1SetupTransfer() } id = (vif1ptag[0] >> 28) & 0x7; //ID for DmaChain copied from bit 28 of the tag + vif1ch->qwc = (u16)vif1ptag[0]; //QWC set to lower 16bits of the tag vif1ch->madr = vif1ptag[1]; //MADR = ADDR field + vif1ch->chcr = (vif1ch->chcr & 0xFFFF) | ((*vif1ptag) & 0xFFFF0000); //Transfer upper part of tag to CHCR bits 31-15 + g_vifCycles += 1; // Add 1 g_vifCycles from the QW read for the tag - vif1ch->chcr = (vif1ch->chcr & 0xFFFF) | ((*vif1ptag) & 0xFFFF0000); //Transfer upper part of tag to CHCR bits 31-15 // Transfer dma tag if tte is set VIF_LOG("VIF1 Tag %8.8x_%8.8x size=%d, id=%d, madr=%lx, tadr=%lx\n", vif1ptag[1], vif1ptag[0], vif1ch->qwc, id, vif1ch->madr, vif1ch->tadr); - if (!vif1.done && (psHu32(DMAC_CTRL) & 0xC0) == 0x40 && id == 4) // STD == VIF1 + if (!vif1.done && ((psHu32(DMAC_CTRL) & 0xC0) == 0x40) && (id == 4)) // STD == VIF1 { // there are still bugs, need to also check if gif->madr +16*qwc >= stadr, if not, stall if ((vif1ch->madr + vif1ch->qwc * 16) >= psHu32(DMAC_STADR)) @@ -2246,6 +2239,7 @@ __forceinline void vif1SetupTransfer() break; } } + __forceinline void vif1Interrupt() { VIF_LOG("vif1Interrupt: %8.8x", cpuRegs.cycle); @@ -2267,7 +2261,7 @@ __forceinline void vif1Interrupt() vif1ch->chcr &= ~0x100; return; } - else if (vif1ch->qwc > 0 || vif1.irqoffset > 0) + else if ((vif1ch->qwc > 0) || (vif1.irqoffset > 0)) { if (vif1.stallontag == 1) vif1SetupTransfer(); @@ -2278,7 +2272,7 @@ __forceinline void vif1Interrupt() if (vif1.inprogress == 1) _VIF1chain(); - if (vif1.done == 0 || vif1.inprogress == 1) + if ((vif1.done == 0) || (vif1.inprogress == 1)) { if (!(psHu32(DMAC_CTRL) & 0x1)) @@ -2287,7 +2281,7 @@ __forceinline void vif1Interrupt() return; } - if (vif1.inprogress == 0)vif1SetupTransfer(); + if (vif1.inprogress == 0) vif1SetupTransfer(); CPU_INT(1, vif1ch->qwc * BIAS); return; @@ -2303,8 +2297,6 @@ __forceinline void vif1Interrupt() if (vif1.cmd != 0) Console::WriteLn("vif1.cmd still set %x", params vif1.cmd); #endif - prevviftag = NULL; - prevvifcycles = 0; vif1ch->chcr &= ~0x100; g_vifCycles = 0; hwDmacIrq(DMAC_VIF1); @@ -2365,135 +2357,142 @@ void dmaVIF1() void vif1Write32(u32 mem, u32 value) { - if (mem == 0x10003c30) // MARK + switch (mem) { - VIF_LOG("VIF1_MARK write32 0x%8.8x", value); + case 0x10003c30: // MARK + VIF_LOG("VIF1_MARK write32 0x%8.8x", value); - /* Clear mark flag in VIF1_STAT and set mark with 'value' */ - vif1Regs->stat &= ~VIF1_STAT_MRK; - vif1Regs->mark = value; - } - else if (mem == 0x10003c10) // FBRST - { - VIF_LOG("VIF1_FBRST write32 0x%8.8x", value); + /* Clear mark flag in VIF1_STAT and set mark with 'value' */ + vif1Regs->stat &= ~VIF1_STAT_MRK; + vif1Regs->mark = value; + break; + + case 0x10003c10: // FBRST + VIF_LOG("VIF1_FBRST write32 0x%8.8x", value); - if (value & 0x1) - { - /* Reset VIF */ - memzero_obj(vif1); - cpuRegs.interrupt &= ~((1 << 1) | (1 << 10)); //Stop all vif1 DMA's - vif1ch->qwc = 0; //? - psHu64(0x10005000) = 0; - psHu64(0x10005008) = 0; - vif1.done = 1; - vif1Regs->err = 0; - vif1.inprogress = 0; - vif1Regs->stat &= ~(0x1F800000 | VIF1_STAT_INT | VIF1_STAT_VSS | VIF1_STAT_VIS | VIF1_STAT_VFS | VIF1_STAT_VPS); // FQC=0 - } - if (value & 0x2) - { - /* Force Break the VIF */ - /* I guess we should stop the VIF dma here, but not 100% sure (linuz) */ - vif1Regs->stat |= VIF1_STAT_VFS; - vif1Regs->stat &= ~VIF1_STAT_VPS; - cpuRegs.interrupt &= ~((1 << 1) | (1 << 10)); //Stop all vif1 DMA's - vif1.vifstalled = 1; - Console::WriteLn("vif1 force break"); - } - if (value & 0x4) - { - /* Stop VIF */ - // Not completly sure about this, can't remember what game used this, but 'draining' the VIF helped it, instead of - // just stoppin the VIF (linuz). - vif1Regs->stat |= VIF1_STAT_VSS; - vif1Regs->stat &= ~VIF1_STAT_VPS; - cpuRegs.interrupt &= ~((1 << 1) | (1 << 10)); //Stop all vif1 DMA's - vif1.vifstalled = 1; - } - if (value & 0x8) - { - int cancel = 0; - - /* Cancel stall, first check if there is a stall to cancel, and then clear VIF1_STAT VSS|VFS|VIS|INT|ER0|ER1 bits */ - if (vif1Regs->stat & (VIF1_STAT_VSS | VIF1_STAT_VIS | VIF1_STAT_VFS)) + if (value & 0x1) { - cancel = 1; + /* Reset VIF */ + memzero_obj(vif1); + cpuRegs.interrupt &= ~((1 << 1) | (1 << 10)); //Stop all vif1 DMA's + vif1ch->qwc = 0; //? + psHu64(0x10005000) = 0; + psHu64(0x10005008) = 0; + vif1.done = 1; + vif1Regs->err = 0; + vif1.inprogress = 0; + vif1Regs->stat &= ~(0x1F800000 | VIF1_STAT_INT | VIF1_STAT_VSS | VIF1_STAT_VIS | VIF1_STAT_VFS | VIF1_STAT_VPS); // FQC=0 } - - vif1Regs->stat &= ~(VIF1_STAT_VSS | VIF1_STAT_VFS | VIF1_STAT_VIS | - VIF1_STAT_INT | VIF1_STAT_ER0 | VIF1_STAT_ER1); - if (cancel) + if (value & 0x2) { - if (vif1.vifstalled) - { - g_vifCycles = 0; - // loop necessary for spiderman - if ((psHu32(DMAC_CTRL) & 0xC) == 0x8) - { + /* Force Break the VIF */ + /* I guess we should stop the VIF dma here, but not 100% sure (linuz) */ + vif1Regs->stat |= VIF1_STAT_VFS; + vif1Regs->stat &= ~VIF1_STAT_VPS; + cpuRegs.interrupt &= ~((1 << 1) | (1 << 10)); //Stop all vif1 DMA's + vif1.vifstalled = 1; + Console::WriteLn("vif1 force break"); + } + if (value & 0x4) + { + /* Stop VIF */ + // Not completely sure about this, can't remember what game used this, but 'draining' the VIF helped it, instead of + // just stoppin the VIF (linuz). + vif1Regs->stat |= VIF1_STAT_VSS; + vif1Regs->stat &= ~VIF1_STAT_VPS; + cpuRegs.interrupt &= ~((1 << 1) | (1 << 10)); //Stop all vif1 DMA's + vif1.vifstalled = 1; + } + if (value & 0x8) + { + bool cancel = FALSE; - //Console::WriteLn("MFIFO Stall"); - CPU_INT(10, vif1ch->qwc * BIAS); - } - else + /* Cancel stall, first check if there is a stall to cancel, and then clear VIF1_STAT VSS|VFS|VIS|INT|ER0|ER1 bits */ + if (vif1Regs->stat & (VIF1_STAT_VSS | VIF1_STAT_VIS | VIF1_STAT_VFS)) + { + cancel = TRUE; + } + + vif1Regs->stat &= ~(VIF1_STAT_VSS | VIF1_STAT_VFS | VIF1_STAT_VIS | + VIF1_STAT_INT | VIF1_STAT_ER0 | VIF1_STAT_ER1); + + if (cancel) + { + if (vif1.vifstalled) { - // Gets the timing right - Flatout - CPU_INT(1, vif1ch->qwc * BIAS); + g_vifCycles = 0; + // loop necessary for spiderman + if ((psHu32(DMAC_CTRL) & 0xC) == 0x8) + { + //Console::WriteLn("MFIFO Stall"); + CPU_INT(10, vif1ch->qwc * BIAS); + } + else + { + // Gets the timing right - Flatout + CPU_INT(1, vif1ch->qwc * BIAS); + } + vif1ch->chcr |= 0x100; } - vif1ch->chcr |= 0x100; } } - } - } - else if (mem == 0x10003c20) // ERR - { - VIF_LOG("VIF1_ERR write32 0x%8.8x", value); + break; + + case 0x10003c20: // ERR + VIF_LOG("VIF1_ERR write32 0x%8.8x", value); - /* Set VIF1_ERR with 'value' */ - vif1Regs->err = value; - } - else if (mem == 0x10003c00) // STAT - { + /* Set VIF1_ERR with 'value' */ + vif1Regs->err = value; + break; + + case 0x10003c00: // STAT VIF_LOG("VIF1_STAT write32 0x%8.8x", value); #ifdef PCSX2_DEVBUILD - /* Only FDR bit is writable, so mask the rest */ - if ((vif1Regs->stat & VIF1_STAT_FDR) ^(value & VIF1_STAT_FDR)) - { - // different so can't be stalled - if (vif1Regs->stat & (VIF1_STAT_INT | VIF1_STAT_VSS | VIF1_STAT_VIS | VIF1_STAT_VFS)) + /* Only FDR bit is writable, so mask the rest */ + if ((vif1Regs->stat & VIF1_STAT_FDR) ^(value & VIF1_STAT_FDR)) { - Console::WriteLn("changing dir when vif1 fifo stalled"); + // different so can't be stalled + if (vif1Regs->stat & (VIF1_STAT_INT | VIF1_STAT_VSS | VIF1_STAT_VIS | VIF1_STAT_VFS)) + { + DevCon::WriteLn("changing dir when vif1 fifo stalled"); + } } - } #endif - vif1Regs->stat = (vif1Regs->stat & ~VIF1_STAT_FDR) | (value & VIF1_STAT_FDR); - if (vif1Regs->stat & VIF1_STAT_FDR) - { - vif1Regs->stat |= 0x01000000; - } - else - { - vif1ch->qwc = 0; - vif1.vifstalled = 0; - vif1.done = 1; - vif1Regs->stat &= ~0x1F000000; // FQC=0 - } - } - else if (mem == 0x10003c50) // MODE - { - vif1Regs->mode = value; - } - else - { - Console::WriteLn("Unknown Vif1 write to %x", params mem); - if (mem >= 0x10003d00 && mem < 0x10003d80) - { - assert((mem&0xf) == 0); - if (mem < 0x10003d40) g_vifRow1[(mem>>4)&3] = value; - else g_vifCol1[(mem>>4)&3] = value; - } - else psHu32(mem) = value; + vif1Regs->stat = (vif1Regs->stat & ~VIF1_STAT_FDR) | (value & VIF1_STAT_FDR); + if (vif1Regs->stat & VIF1_STAT_FDR) + { + vif1Regs->stat |= 0x01000000; + } + else + { + vif1ch->qwc = 0; + vif1.vifstalled = 0; + vif1.done = 1; + vif1Regs->stat &= ~0x1F000000; // FQC=0 + } + break; + + case 0x10003c50: // MODE + vif1Regs->mode = value; + break; + + default: + Console::WriteLn("Unknown Vif1 write to %x", params mem); + if ((mem >= 0x10003d00) && (mem < 0x10003d80)) + { + assert((mem&0xf) == 0); + if (mem < 0x10003d40) + g_vifRow1[(mem>>4)&3] = value; + else + g_vifCol1[(mem>>4)&3] = value; + } + else + { + psHu32(mem) = value; + } + break; } /* Other registers are read-only so do nothing for them */ diff --git a/pcsx2/configure.ac b/pcsx2/configure.ac index b1d4479144..d2d5ea39d6 100644 --- a/pcsx2/configure.ac +++ b/pcsx2/configure.ac @@ -35,7 +35,7 @@ else DEBUG_FLAGS=" -O0 -g " fi -WARNING_FLAGS="-Wno-format -Wno-unused-value" +WARNING_FLAGS="-Wno-format -Wno-unused-parameter -Wno-unused-value -Wunused-variable " EXTRA_WARNING_FLAGS="-Wall -Wextra" NORMAL_FLAGS=" -pipe -msse -msse2 -O2 ${WARNING_FLAGS}" # These optimizations seem to cause issues with GCC 4.3.3, so we'll turn them off. diff --git a/pcsx2/vssprintf.cpp b/pcsx2/vssprintf.cpp index 234017f0e1..7657683e54 100644 --- a/pcsx2/vssprintf.cpp +++ b/pcsx2/vssprintf.cpp @@ -460,7 +460,7 @@ static void cropzeros(char *buffer) stop = buffer--; while (*buffer == '0') buffer--; if (*buffer == '.') buffer--; - while (*++buffer = *stop++); + while (*++buffer = *stop++) ; } } diff --git a/pcsx2/x86/BaseblockEx.h b/pcsx2/x86/BaseblockEx.h index 6d32ed0f05..c62dec7f3b 100644 --- a/pcsx2/x86/BaseblockEx.h +++ b/pcsx2/x86/BaseblockEx.h @@ -55,12 +55,12 @@ struct BASEBLOCKEX class BaseBlocks { private: - std::vector blocks; // switch to a hash map later? std::multimap links; typedef std::multimap::iterator linkiter_t; unsigned long size; uptr recompiler; + std::vector blocks; public: BaseBlocks(unsigned long size_, uptr recompiler_) : @@ -78,8 +78,10 @@ public: inline int Index (u32 startpc) const { int idx = LastIndex(startpc); - if (idx == -1 || startpc < blocks[idx].startpc || - blocks[idx].size && (startpc >= blocks[idx].startpc + blocks[idx].size * 4)) + // fixme: I changed the parenthesis to be unambiguous, but this needs to be checked to see if ((x or y or z) and w) + // is correct, or ((x or y) or (z and w)), or some other variation. --arcum42 + if (((idx == -1) || (startpc < blocks[idx].startpc) || + (blocks[idx].size)) && (startpc >= blocks[idx].startpc + blocks[idx].size * 4)) return -1; else return idx; @@ -99,7 +101,7 @@ public: inline void Remove(int idx) { - u32 startpc = blocks[idx].startpc; + //u32 startpc = blocks[idx].startpc; std::pair range = links.equal_range(blocks[idx].startpc); for (linkiter_t i = range.first; i != range.second; ++i) *(u32*)i->second = recompiler - (i->second + 4); diff --git a/pcsx2/x86/ix86-32/iCore-32.cpp b/pcsx2/x86/ix86-32/iCore-32.cpp index 0a70906ba8..1021644be3 100644 --- a/pcsx2/x86/ix86-32/iCore-32.cpp +++ b/pcsx2/x86/ix86-32/iCore-32.cpp @@ -168,15 +168,10 @@ void _flushConstRegs() continue; if (g_cpuConstRegs[i].SL[j] != -1) continue; -#if 1 - if (eaxval > 0) - XOR32RtoR(EAX, EAX), eaxval = 0; -#else - if (eaxval > 0) - MOV32ItoR(EAX, -1), eaxval = -1; -#endif - if (eaxval == 0) - NOT32R(EAX), eaxval = -1; + + if (eaxval > 0) XOR32RtoR(EAX, EAX), eaxval = 0; + if (eaxval == 0) NOT32R(EAX), eaxval = -1; + MOV32RtoM((uptr)&cpuRegs.GPR.r[i].SL[j], EAX); done[j + 2] |= 1<= 0 && reg < 32 ); - -// if( X86_ISVI(type) ) -// assert( reg < 16 || reg == REG_R ); // don't alloc EAX and ESP,EBP if MODE_NOFRAME int oldmode = mode; @@ -265,9 +237,8 @@ int _allocX86reg(int x86reg, int type, int reg, int mode) if (!x86regs[i].inuse || x86regs[i].type != type || x86regs[i].reg != reg) continue; if( (noframe && i == EBP) || (i >= maxreg) ) { - if( x86regs[i].mode & MODE_READ ) - readfromreg = i; - //if( xmmregs[i].mode & MODE_WRITE ) mode |= MODE_WRITE; + if (x86regs[i].mode & MODE_READ) readfromreg = i; + mode |= x86regs[i].mode&MODE_WRITE; x86regs[i].inuse = 0; break; @@ -277,7 +248,6 @@ int _allocX86reg(int x86reg, int type, int reg, int mode) // requested specific reg, so return that instead if( i != x86reg ) { if( x86regs[i].mode & MODE_READ ) readfromreg = i; - //if( x86regs[i].mode & MODE_WRITE ) mode |= MODE_WRITE; mode |= x86regs[i].mode&MODE_WRITE; x86regs[i].inuse = 0; break; @@ -288,8 +258,10 @@ int _allocX86reg(int x86reg, int type, int reg, int mode) if( type == X86TYPE_GPR ) _flushConstReg(reg); - if( X86_ISVI(type) && reg < 16 ) MOVZX32M16toR(i, _x86GetAddr(type, reg)); - else MOV32MtoR(i, _x86GetAddr(type, reg)); + if( X86_ISVI(type) && reg < 16 ) + MOVZX32M16toR(i, _x86GetAddr(type, reg)); + else + MOV32MtoR(i, _x86GetAddr(type, reg)); x86regs[i].mode |= MODE_READ; } @@ -314,7 +286,8 @@ int _allocX86reg(int x86reg, int type, int reg, int mode) x86regs[x86reg].inuse = 1; if( mode & MODE_READ ) { - if( readfromreg >= 0 ) MOV32RtoR(x86reg, readfromreg); + if( readfromreg >= 0 ) + MOV32RtoR(x86reg, readfromreg); else { if( type == X86TYPE_GPR ) { @@ -334,8 +307,10 @@ int _allocX86reg(int x86reg, int type, int reg, int mode) } else { if( X86_ISVI(type) && reg < 16 ) { - if( reg == 0 ) XOR32RtoR(x86reg, x86reg); - else MOVZX32M16toR(x86reg, _x86GetAddr(type, reg)); + if( reg == 0 ) + XOR32RtoR(x86reg, x86reg); + else + MOVZX32M16toR(x86reg, _x86GetAddr(type, reg)); } else MOV32MtoR(x86reg, _x86GetAddr(type, reg)); } @@ -353,8 +328,10 @@ int _checkX86reg(int type, int reg, int mode) if (x86regs[i].inuse && x86regs[i].reg == reg && x86regs[i].type == type) { if( !(x86regs[i].mode & MODE_READ) && (mode&MODE_READ) ) { - if( X86_ISVI(type) ) MOVZX32M16toR(i, _x86GetAddr(type, reg)); - else MOV32MtoR(i, _x86GetAddr(type, reg)); + if( X86_ISVI(type) ) + MOVZX32M16toR(i, _x86GetAddr(type, reg)); + else + MOV32MtoR(i, _x86GetAddr(type, reg)); } x86regs[i].mode |= mode; @@ -404,8 +381,10 @@ void _deleteX86reg(int type, int reg, int flush) case 1: if( x86regs[i].mode & MODE_WRITE) { - if( X86_ISVI(type) && x86regs[i].reg < 16 ) MOV16RtoM(_x86GetAddr(type, x86regs[i].reg), i); - else MOV32RtoM(_x86GetAddr(type, x86regs[i].reg), i); + if( X86_ISVI(type) && x86regs[i].reg < 16 ) + MOV16RtoM(_x86GetAddr(type, x86regs[i].reg), i); + else + MOV32RtoM(_x86GetAddr(type, x86regs[i].reg), i); // get rid of MODE_WRITE since don't want to flush again x86regs[i].mode &= ~MODE_WRITE; @@ -476,7 +455,8 @@ __forceinline void* _MMXGetAddr(int reg) int _getFreeMMXreg() { - int i, tempi; + int i; + int tempi = -1; u32 bestcount = 0x10000; for (i=0; i>16)&0x1f]); } - else if( IS_MEMORYREG(arg) ) PUSH32M(argmem); - else { - assert( (arg&0xfff0) == 0 ); - // assume it is a GPR reg - PUSH32R(arg&0xf); - } + else if( IS_MEMORYREG(arg) ) { + PUSH32M(argmem); + } + else { + assert( (arg&0xfff0) == 0 ); + // assume it is a GPR reg + PUSH32R(arg&0xf); + } } __forceinline void _callFunctionArg1(uptr fn, u32 arg1, uptr arg1mem) { - _callPushArg(arg1, arg1mem); - CALLFunc((uptr)fn); - ADD32ItoR(ESP, 4); + _callPushArg(arg1, arg1mem); + CALLFunc((uptr)fn); + ADD32ItoR(ESP, 4); } __forceinline void _callFunctionArg2(uptr fn, u32 arg1, u32 arg2, uptr arg1mem, uptr arg2mem) { - _callPushArg(arg2, arg2mem); - _callPushArg(arg1, arg1mem); - CALLFunc((uptr)fn); - ADD32ItoR(ESP, 8); + _callPushArg(arg2, arg2mem); + _callPushArg(arg1, arg1mem); + CALLFunc((uptr)fn); + ADD32ItoR(ESP, 8); } __forceinline void _callFunctionArg3(uptr fn, u32 arg1, u32 arg2, u32 arg3, uptr arg1mem, uptr arg2mem, uptr arg3mem) { - _callPushArg(arg3, arg3mem); - _callPushArg(arg2, arg2mem); - _callPushArg(arg1, arg1mem); - CALLFunc((uptr)fn); - ADD32ItoR(ESP, 12); + _callPushArg(arg3, arg3mem); + _callPushArg(arg2, arg2mem); + _callPushArg(arg1, arg1mem); + CALLFunc((uptr)fn); + ADD32ItoR(ESP, 12); } void _recPushReg(int mmreg) @@ -931,8 +908,8 @@ void _recPushReg(int mmreg) PUSH32I(g_psxConstRegs[(mmreg>>16)&0x1f]); } else { - assert( (mmreg&0xfff0) == 0 ); - PUSH32R(mmreg); + assert( (mmreg&0xfff0) == 0 ); + PUSH32R(mmreg); } } @@ -947,11 +924,13 @@ void _signExtendSFtoM(u32 mem) int _signExtendMtoMMX(x86MMXRegType to, u32 mem) { int t0reg = _allocMMXreg(-1, MMX_TEMP, 0); + MOVDMtoMMX(t0reg, mem); MOVQRtoR(to, t0reg); PSRADItoR(t0reg, 31); PUNPCKLDQRtoR(to, t0reg); _freeMMXreg(t0reg); + return to; } @@ -1054,7 +1033,7 @@ int _allocCheckGPRtoMMX(EEINST* pinst, int reg, int mode) return _checkMMXreg(MMX_GPR+reg, mode); } -// fixme - yay stupid? This sucks, and is used form iCOp2.cpp only. +// fixme - yay stupid? This sucks, and is used from iCOP2.cpp only. // Surely there is a better way! void _recMove128MtoM(u32 to, u32 from) { diff --git a/pcsx2/x86/ix86-32/iR5900-32.cpp b/pcsx2/x86/ix86-32/iR5900-32.cpp index 06f3b62b92..6d568c95b8 100644 --- a/pcsx2/x86/ix86-32/iR5900-32.cpp +++ b/pcsx2/x86/ix86-32/iR5900-32.cpp @@ -607,8 +607,9 @@ static void recShutdown( void ) s_nInstCacheSize = 0; } -// Ignored by Linux +#ifdef _MSC_VER #pragma warning(disable:4731) // frame pointer register 'ebp' modified by inline assembly code +#endif void recStep( void ) { }