mirror of https://github.com/PCSX2/pcsx2.git
Re-re-fixed the Windows.h mess. PsxCommon.h still had a win32 include, and cdvd.cpp and misc.cpp had some win/linux code which I relocated. Also, cleaned up the vtlb's SysExceptionHandler stuff -- moved the platform-specific portions to WinSysExec and LnxSysExec, and moved the shared code portion to a new function in Memory.cpp.
(Yes, Linux is probably broken again.) git-svn-id: http://pcsx2.googlecode.com/svn/trunk@636 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
0acef23784
commit
da25976c6b
|
@ -121,7 +121,7 @@ _CRTIMP extern int errno;
|
|||
#define EILSEQ 42
|
||||
|
||||
/*
|
||||
* Support EDEADLOCK for compatibiity with older MS-C versions.
|
||||
* Support EDEADLOCK for compatibility with older MS-C versions.
|
||||
*/
|
||||
#define EDEADLOCK EDEADLK
|
||||
|
||||
|
|
|
@ -19,11 +19,6 @@
|
|||
#include "PrecompiledHeader.h"
|
||||
|
||||
#include <ctype.h>
|
||||
#include <time.h>
|
||||
|
||||
#ifndef _WIN32
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
#include "PsxCommon.h"
|
||||
#include "CDVDiso.h"
|
||||
|
@ -224,11 +219,10 @@ FILE *_cdvdOpenMechaVer() {
|
|||
char *ptr;
|
||||
int i;
|
||||
char file[g_MaxPath];
|
||||
string Bios;
|
||||
FILE* fd;
|
||||
|
||||
// get the name of the bios file
|
||||
Path::Combine( Bios, Config.BiosDir, Config.Bios );
|
||||
string Bios( Path::Combine( Config.BiosDir, Config.Bios ) );
|
||||
|
||||
// use the bios filename to get the name of the mecha ver file
|
||||
// [TODO] : Upgrade this to use std::string!
|
||||
|
@ -269,12 +263,11 @@ s32 cdvdGetMechaVer(u8* ver)
|
|||
FILE *_cdvdOpenNVM() {
|
||||
char *ptr;
|
||||
int i;
|
||||
string Bios;
|
||||
char file[g_MaxPath];
|
||||
FILE* fd;
|
||||
|
||||
// get the name of the bios file
|
||||
Path::Combine( Bios, Config.BiosDir, Config.Bios );
|
||||
string Bios( Path::Combine( Config.BiosDir, Config.Bios ) );
|
||||
|
||||
// use the bios filename to get the name of the nvm file
|
||||
// [TODO] : Upgrade this to use std::string!
|
||||
|
@ -743,17 +736,6 @@ static uint cdvdBlockReadTime( CDVD_MODE_TYPE mode )
|
|||
|
||||
void cdvdReset()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
SYSTEMTIME st;
|
||||
//Get and set the internal clock to time
|
||||
GetSystemTime(&st);
|
||||
#else
|
||||
time_t traw;
|
||||
struct tm* ptlocal;
|
||||
time(&traw);
|
||||
ptlocal = localtime(&traw);
|
||||
#endif
|
||||
|
||||
memzero_obj(cdvd);
|
||||
|
||||
cdvd.Type = CDVD_TYPE_NODISC;
|
||||
|
@ -772,25 +754,6 @@ void cdvdReset()
|
|||
cdvd.RTC.day = 25;
|
||||
cdvd.RTC.month = 5;
|
||||
cdvd.RTC.year = 7; //2007
|
||||
|
||||
#ifndef _DEBUG
|
||||
#ifdef _WIN32
|
||||
cdvd.RTC.second = (u8)(st.wSecond);
|
||||
cdvd.RTC.minute = (u8)(st.wMinute);
|
||||
cdvd.RTC.hour = (u8)(st.wHour+1)%24;
|
||||
cdvd.RTC.day = (u8)(st.wDay);
|
||||
cdvd.RTC.month = (u8)(st.wMonth);
|
||||
cdvd.RTC.year = (u8)(st.wYear - 2000);
|
||||
#else
|
||||
cdvd.RTC.second = ptlocal->tm_sec;
|
||||
cdvd.RTC.minute = ptlocal->tm_min;
|
||||
cdvd.RTC.hour = ptlocal->tm_hour;
|
||||
cdvd.RTC.day = ptlocal->tm_mday;
|
||||
cdvd.RTC.month = ptlocal->tm_mon;
|
||||
cdvd.RTC.year = ptlocal->tm_year;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
struct Freeze_v10Compat
|
||||
|
|
|
@ -141,4 +141,7 @@ void cdvdWrite17(u8 rt);
|
|||
void cdvdWrite18(u8 rt);
|
||||
void cdvdWrite3A(u8 rt);
|
||||
|
||||
// Platform dependent system time assignment (see WinMisc / LnxMisc)
|
||||
extern void cdvdSetSystemTime( cdvdStruct& setme );
|
||||
|
||||
#endif /* __CDVD_H__ */
|
||||
|
|
|
@ -0,0 +1,56 @@
|
|||
/* Pcsx2 - Pc Ps2 Emulator
|
||||
* Copyright (C) 2002-2009 Pcsx2 Team
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include "PrecompiledHeader.h"
|
||||
|
||||
#include <ctype.h>
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include "cdvd.h"
|
||||
|
||||
void InitCPUTicks()
|
||||
{
|
||||
}
|
||||
|
||||
u64 GetTickFrequency()
|
||||
{
|
||||
return 1000000; // unix measures in microseconds
|
||||
}
|
||||
|
||||
u64 GetCPUTicks()
|
||||
{
|
||||
struct timeval t;
|
||||
gettimeofday(&t, NULL);
|
||||
return ((u64)t.tv_sec*GetTickFrequency())+t.tv_usec;
|
||||
}
|
||||
|
||||
void cdvdSetSystemTime( cdvdStruct& cdvd )
|
||||
{
|
||||
time_t traw;
|
||||
struct tm* ptlocal;
|
||||
time(&traw);
|
||||
ptlocal = localtime(&traw);
|
||||
|
||||
cdvd.RTC.second = ptlocal->tm_sec;
|
||||
cdvd.RTC.minute = ptlocal->tm_min;
|
||||
cdvd.RTC.hour = ptlocal->tm_hour;
|
||||
cdvd.RTC.day = ptlocal->tm_mday;
|
||||
cdvd.RTC.month = ptlocal->tm_mon;
|
||||
cdvd.RTC.year = ptlocal->tm_year;
|
||||
}
|
|
@ -19,6 +19,9 @@
|
|||
#include "Linux.h"
|
||||
#include "LnxSysExec.h"
|
||||
|
||||
#include <sys/mman.h> // needed here? (air)
|
||||
|
||||
|
||||
bool UseGui = true;
|
||||
|
||||
SafeArray<u8>* g_RecoveryState = NULL;
|
||||
|
@ -30,6 +33,45 @@ bool g_EmulationInProgress = false; // Set TRUE if a game is actively running (s
|
|||
static bool sinit = false;
|
||||
GtkWidget *FileSel;
|
||||
|
||||
void InstallLinuxExceptionHandler()
|
||||
{
|
||||
struct sigaction sa;
|
||||
|
||||
sigemptyset(&sa.sa_mask);
|
||||
sa.sa_flags = SA_SIGINFO;
|
||||
sa.sa_sigaction = &SysPageFaultExceptionFilter;
|
||||
sigaction(SIGSEGV, &sa, NULL);
|
||||
}
|
||||
|
||||
void ReleaseLinuxExceptionHandler()
|
||||
{
|
||||
// Code this later.
|
||||
}
|
||||
|
||||
|
||||
// Linux implementation of SIGSEGV handler. Bind it using sigaction().
|
||||
// This is my shot in the dark. Probably needs some work. Good luck! (air)
|
||||
void SysPageFaultExceptionFilter( int signal, siginfo_t *info, void * )
|
||||
{
|
||||
int err;
|
||||
|
||||
//DevCon::Error("SysPageFaultExceptionFilter!");
|
||||
// get bad virtual address
|
||||
u32 offset = (u8*)info->si_addr - psM;
|
||||
|
||||
DevCon::Status( "Protected memory cleanup. Offset 0x%x", params offset );
|
||||
|
||||
if (offset>=Ps2MemSize::Base)
|
||||
{
|
||||
// Bad mojo! Completely invalid address.
|
||||
// Instigate a crash or abort emulation or something.
|
||||
assert( false );
|
||||
}
|
||||
|
||||
mmap_ClearCpuBlock( offset );
|
||||
}
|
||||
|
||||
|
||||
// For issuing notices to both the status bar and the console at the same time.
|
||||
// Single-line text only please! Mutli-line msgs should be directed to the
|
||||
// console directly, thanks.
|
||||
|
@ -521,8 +563,7 @@ void States_Save(int num)
|
|||
// have likely been cleared out. So save from the Recovery buffer instead of
|
||||
// doing a "standard" save:
|
||||
|
||||
string text;
|
||||
SaveState::GetFilename( text, num );
|
||||
string text( SaveState::GetFilename( num ) );
|
||||
gzFile fileptr = gzopen( text.c_str(), "wb" );
|
||||
if( fileptr == NULL )
|
||||
{
|
||||
|
@ -920,10 +961,15 @@ void SysMunmap(uptr base, u32 size)
|
|||
munmap((uptr*)base, size);
|
||||
}
|
||||
|
||||
static const int m_pagemask = getpagesize()-1;
|
||||
|
||||
void SysMemProtect( void* baseaddr, size_t size, PageProtectionMode mode, bool allowExecution )
|
||||
{
|
||||
int lnxmode = 0;
|
||||
|
||||
// make sure size is aligned to the system page size:
|
||||
size = (size + m_pagemask) & ~m_pagemask;
|
||||
|
||||
switch( mode )
|
||||
{
|
||||
case Protect_NoAccess: break;
|
||||
|
|
|
@ -24,6 +24,13 @@
|
|||
#include <sys/mman.h>
|
||||
#include "x86/iR5900.h"
|
||||
|
||||
void SysPageFaultExceptionFilter( int signal, siginfo_t *info, void * );
|
||||
void __fastcall InstallLinuxExceptionHandler();
|
||||
void __fastcall ReleaseLinuxExceptionHandler();
|
||||
|
||||
#define PCSX2_MEM_PROTECT_BEGIN() InstallLinuxExceptionHandler()
|
||||
#define PCSX2_MEM_PROTECT_END() ReleaseLinuxExceptionHandler()
|
||||
|
||||
extern void StartGui();
|
||||
extern void CheckSlots();
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@ bin_PROGRAMS = pcsx2
|
|||
|
||||
# the application source, library search path, and link libraries
|
||||
pcsx2_SOURCES = \
|
||||
interface.c support.c LnxMain.cpp LnxThreads.cpp LnxConsole.cpp LnxSysExec.cpp \
|
||||
interface.c support.c LnxMain.cpp LnxThreads.cpp LnxConsole.cpp LnxSysExec.cpp LnxMisc.cpp \
|
||||
AboutDlg.cpp ConfigDlg.cpp DebugDlg.cpp AdvancedDlg.cpp CpuDlg.cpp HacksDlg.cpp McdDlgs.cpp Pref.cpp \
|
||||
GtkGui.h Linux.h LnxMain.h ConfigDlg.h DebugDlg.h McdDlgs.h interface.h callbacks.h memzero.h support.h
|
||||
|
||||
|
|
116
pcsx2/Memory.cpp
116
pcsx2/Memory.cpp
|
@ -49,7 +49,6 @@ BIOS
|
|||
#include "PsxCommon.h"
|
||||
#include "VUmicro.h"
|
||||
#include "GS.h"
|
||||
#include "vtlb.h"
|
||||
#include "IPU/IPU.h"
|
||||
|
||||
|
||||
|
@ -57,11 +56,6 @@ BIOS
|
|||
#include "Cache.h"
|
||||
#endif
|
||||
|
||||
#ifdef __LINUX__
|
||||
#include <sys/mman.h>
|
||||
#endif
|
||||
|
||||
//#define FULLTLB
|
||||
int MemMode = 0; // 0 is Kernel Mode, 1 is Supervisor Mode, 2 is User Mode
|
||||
|
||||
void memSetKernelMode() {
|
||||
|
@ -95,22 +89,20 @@ u16 ba0R16(u32 mem)
|
|||
void loadBiosRom( const char *ext, u8 *dest, long maxSize )
|
||||
{
|
||||
string Bios1;
|
||||
string Bios;
|
||||
long filesize;
|
||||
|
||||
Path::Combine( Bios, Config.BiosDir, Config.Bios );
|
||||
string Bios( Path::Combine( Config.BiosDir, Config.Bios ) );
|
||||
|
||||
// Try first a basic extension concatenation (normally results in something like name.bin.rom1)
|
||||
ssprintf(Bios1, "%hs.%s", &Bios, ext);
|
||||
if( (filesize=Path::getFileSize( Bios1 ) ) <= 0 )
|
||||
{
|
||||
// Try the name properly extensioned next (name.rom1)
|
||||
Path::ReplaceExtension( Bios1, Bios, ext );
|
||||
Bios1 = Path::ReplaceExtension( Bios, ext );
|
||||
if( (filesize=Path::getFileSize( Bios1 ) ) <= 0 )
|
||||
{
|
||||
// Try for the old-style method (rom1.bin)
|
||||
Path::Combine( Bios1, Config.BiosDir, ext );
|
||||
Bios1 += ".bin";
|
||||
Bios1 = Path::Combine( Config.BiosDir, ext ) + ".bin";
|
||||
if( (filesize=Path::getFileSize( Bios1 ) ) <= 0 )
|
||||
{
|
||||
Console::Error( "\n\n\n"
|
||||
|
@ -126,12 +118,12 @@ void loadBiosRom( const char *ext, u8 *dest, long maxSize )
|
|||
// if we made it this far, we have a successful file found:
|
||||
|
||||
FILE *fp = fopen(Bios1.c_str(), "rb");
|
||||
fread(dest, 1, std::min( maxSize, filesize ), fp);
|
||||
fread(dest, 1, min( maxSize, filesize ), fp);
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
u32 psMPWC[(Ps2MemSize::Base/32)>>12];
|
||||
std::vector<u32> psMPWVA[Ps2MemSize::Base>>12];
|
||||
static u32 psMPWC[(Ps2MemSize::Base/32)>>12];
|
||||
static std::vector<u32> psMPWVA[Ps2MemSize::Base>>12];
|
||||
|
||||
u8 *psM = NULL; //32mb Main Ram
|
||||
u8 *psR = NULL; //4mb rom area
|
||||
|
@ -793,10 +785,8 @@ void memReset()
|
|||
vtlb_VMap(0x00000000,0x00000000,0x20000000);
|
||||
vtlb_VMapUnmap(0x20000000,0x60000000);
|
||||
|
||||
string Bios;
|
||||
FILE *fp;
|
||||
|
||||
Path::Combine( Bios, Config.BiosDir, Config.Bios );
|
||||
string Bios( Path::Combine( Config.BiosDir, Config.Bios ) );
|
||||
|
||||
long filesize;
|
||||
if( ( filesize = Path::getFileSize( Bios ) ) <= 0 )
|
||||
|
@ -807,7 +797,7 @@ void memReset()
|
|||
}
|
||||
|
||||
fp = fopen(Bios.c_str(), "rb");
|
||||
fread(PS2MEM_ROM, 1, std::min( (long)Ps2MemSize::Rom, filesize ), fp);
|
||||
fread(PS2MEM_ROM, 1, min( (long)Ps2MemSize::Rom, filesize ), fp);
|
||||
fclose(fp);
|
||||
|
||||
BiosVersion = GetBiosVersion();
|
||||
|
@ -831,14 +821,7 @@ int mmap_GetRamPageInfo(void* ptr)
|
|||
|
||||
void mmap_MarkCountedRamPage(void* ptr,u32 vaddr)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
DWORD old;
|
||||
VirtualProtect(ptr,1,PAGE_READONLY,&old);
|
||||
#else
|
||||
// fixed? mprotect needs input and size to be aligned to 4096 bytes pagesize.
|
||||
// 'ptr' should be aligned properly, but a size of 1 was invalid. (air)
|
||||
mprotect(ptr, getpagesize(), PROT_READ);
|
||||
#endif
|
||||
SysMemProtect( ptr, 1, Protect_ReadOnly );
|
||||
|
||||
u32 offset=((u8*)ptr-psM);
|
||||
offset>>=12;
|
||||
|
@ -859,86 +842,12 @@ void mmap_ResetBlockTracking()
|
|||
{
|
||||
psMPWVA[i].clear();
|
||||
}
|
||||
#ifdef _WIN32
|
||||
DWORD old;
|
||||
VirtualProtect(psM,Ps2MemSize::Base,PAGE_READWRITE,&old);
|
||||
#else
|
||||
mprotect(psM,Ps2MemSize::Base, PROT_READ|PROT_WRITE);
|
||||
#endif
|
||||
SysMemProtect( psM, Ps2MemSize::Base, Protect_ReadWrite );
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
int SysPageFaultExceptionFilter(EXCEPTION_POINTERS* eps)
|
||||
void mmap_ClearCpuBlock( uint offset )
|
||||
{
|
||||
const _EXCEPTION_RECORD& ExceptionRecord = *eps->ExceptionRecord;
|
||||
//const _CONTEXT& ContextRecord = *eps->ContextRecord;
|
||||
|
||||
if (ExceptionRecord.ExceptionCode != EXCEPTION_ACCESS_VIOLATION)
|
||||
{
|
||||
return EXCEPTION_CONTINUE_SEARCH;
|
||||
}
|
||||
|
||||
// get bad virtual address
|
||||
u32 offset = (u8*)ExceptionRecord.ExceptionInformation[1]-psM;
|
||||
|
||||
if (offset>=Ps2MemSize::Base)
|
||||
return EXCEPTION_CONTINUE_SEARCH;
|
||||
|
||||
DWORD old;
|
||||
VirtualProtect(&psM[offset],1,PAGE_READWRITE,&old);
|
||||
|
||||
offset>>=12;
|
||||
psMPWC[(offset/32)]|=(1<<(offset&31));
|
||||
|
||||
for (u32 i=0;i<psMPWVA[offset].size();i++)
|
||||
{
|
||||
Cpu->Clear(psMPWVA[offset][i],0x1000);
|
||||
}
|
||||
psMPWVA[offset].clear();
|
||||
|
||||
return EXCEPTION_CONTINUE_EXECUTION;
|
||||
}
|
||||
|
||||
#else
|
||||
#include "errno.h"
|
||||
|
||||
void InstallLinuxExceptionHandler()
|
||||
{
|
||||
struct sigaction sa;
|
||||
|
||||
sigemptyset(&sa.sa_mask);
|
||||
sa.sa_flags = SA_SIGINFO;
|
||||
sa.sa_sigaction = &SysPageFaultExceptionFilter;
|
||||
sigaction(SIGSEGV, &sa, NULL);
|
||||
}
|
||||
|
||||
void ReleaseLinuxExceptionHandler()
|
||||
{
|
||||
// Code this later.
|
||||
}
|
||||
// Linux implementation of SIGSEGV handler. Bind it using sigaction().
|
||||
// This is my shot in the dark. Probably needs some work. Good luck! (air)
|
||||
void SysPageFaultExceptionFilter( int signal, siginfo_t *info, void * )
|
||||
{
|
||||
int err;
|
||||
u32 pagesize = getpagesize();
|
||||
|
||||
//DevCon::Error("SysPageFaultExceptionFilter!");
|
||||
// get bad virtual address
|
||||
u32 offset = (u8*)info->si_addr - psM;
|
||||
uptr pageoffset = ( offset / pagesize ) * pagesize;
|
||||
|
||||
DevCon::Status( "Protected memory cleanup. Offset 0x%x", params offset );
|
||||
|
||||
if (offset>=Ps2MemSize::Base)
|
||||
{
|
||||
// Bad mojo! Completly invalid address.
|
||||
// Instigate a crash or abort emulation or something.
|
||||
assert( false );
|
||||
}
|
||||
|
||||
err = mprotect( &psM[pageoffset], pagesize, PROT_READ | PROT_WRITE );
|
||||
if (err) DevCon::Error("SysPageFaultExceptionFilter: %s", params strerror(errno));
|
||||
SysMemProtect( &psM[offset], 1, Protect_ReadWrite );
|
||||
|
||||
offset>>=12;
|
||||
psMPWC[(offset/32)]|=(1<<(offset&31));
|
||||
|
@ -949,4 +858,3 @@ void SysPageFaultExceptionFilter( int signal, siginfo_t *info, void * )
|
|||
}
|
||||
psMPWVA[offset].clear();
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -136,17 +136,12 @@ extern void memClearPageAddr(u32 vaddr);
|
|||
|
||||
extern void memMapVUmicro();
|
||||
|
||||
#ifdef __LINUX__
|
||||
void SysPageFaultExceptionFilter( int signal, siginfo_t *info, void * );
|
||||
void __fastcall InstallLinuxExceptionHandler();
|
||||
void __fastcall ReleaseLinuxExceptionHandler();
|
||||
#endif
|
||||
|
||||
#include "vtlb.h"
|
||||
|
||||
int mmap_GetRamPageInfo(void* ptr);
|
||||
void mmap_MarkCountedRamPage(void* ptr,u32 vaddr);
|
||||
void mmap_ResetBlockTracking();
|
||||
extern int mmap_GetRamPageInfo(void* ptr);
|
||||
extern void mmap_MarkCountedRamPage(void* ptr,u32 vaddr);
|
||||
extern void mmap_ResetBlockTracking();
|
||||
extern void mmap_ClearCpuBlock( uint offset );
|
||||
|
||||
extern void __fastcall memRead8(u32 mem, u8 *out);
|
||||
extern void __fastcall memRead16(u32 mem, u16 *out);
|
||||
|
|
|
@ -68,7 +68,7 @@ FILE *MemoryCard::Load( uint mcd )
|
|||
string str( Config.Mcd[mcd].Filename );
|
||||
|
||||
if( str.empty() )
|
||||
Path::Combine( str, MEMCARDS_DIR, fmt_string( "Mcd00%d.ps2", mcd ) );
|
||||
str = Path::Combine( MEMCARDS_DIR, fmt_string( "Mcd00%d.ps2", mcd ) );
|
||||
|
||||
if( !Path::Exists(str) )
|
||||
Create( str.c_str() );
|
||||
|
|
|
@ -191,13 +191,12 @@ u32 GetBiosVersion() {
|
|||
//2002-09-22 (Florin)
|
||||
int IsBIOS(char *filename, char *description)
|
||||
{
|
||||
string Bios;
|
||||
char ROMVER[14+1], zone[12+1];
|
||||
FILE *fp;
|
||||
unsigned int fileOffset=0, found=FALSE;
|
||||
struct romdir rd;
|
||||
|
||||
Path::Combine( Bios, Config.BiosDir, filename );
|
||||
string Bios( Path::Combine( Config.BiosDir, filename ) );
|
||||
|
||||
int biosFileSize = Path::getFileSize( Bios );
|
||||
if( biosFileSize <= 0) return FALSE;
|
||||
|
@ -415,8 +414,7 @@ void LoadGSState(const string& file)
|
|||
// file not found? try prefixing with sstates folder:
|
||||
if( !Path::isRooted( file ) )
|
||||
{
|
||||
string strfile;
|
||||
Path::Combine( strfile, SSTATES_DIR, file );
|
||||
string strfile( Path::Combine( SSTATES_DIR, file ) );
|
||||
f = new gzLoadingState( strfile.c_str() );
|
||||
|
||||
// If this load attempt fails, then let the exception bubble up to
|
||||
|
@ -509,11 +507,11 @@ char* mystrlwr( char* string )
|
|||
return string;
|
||||
}
|
||||
|
||||
static void GetGSStateFilename( string& dest )
|
||||
static string GetGSStateFilename()
|
||||
{
|
||||
string gsText;
|
||||
ssprintf( gsText, "/%8.8X.%d.gs", ElfCRC, StatesC);
|
||||
Path::Combine( dest, SSTATES_DIR, gsText );
|
||||
return Path::Combine( SSTATES_DIR, gsText );
|
||||
}
|
||||
|
||||
void CycleFrameLimit(int dir)
|
||||
|
@ -578,16 +576,13 @@ void CycleFrameLimit(int dir)
|
|||
|
||||
void ProcessFKeys(int fkey, int shift)
|
||||
{
|
||||
string Text;
|
||||
|
||||
assert(fkey >= 1 && fkey <= 12 );
|
||||
|
||||
switch(fkey) {
|
||||
case 1:
|
||||
try
|
||||
{
|
||||
SaveState::GetFilename( Text, StatesC );
|
||||
gzSavingState( Text ).FreezeAll();
|
||||
gzSavingState( SaveState::GetFilename( StatesC ) ).FreezeAll();
|
||||
}
|
||||
catch( Exception::BaseException& ex )
|
||||
{
|
||||
|
@ -607,17 +602,14 @@ void ProcessFKeys(int fkey, int shift)
|
|||
|
||||
Console::Notice( _( " > Selected savestate slot %d" ), params StatesC);
|
||||
|
||||
if( GSchangeSaveState != NULL ) {
|
||||
SaveState::GetFilename(Text, StatesC);
|
||||
GSchangeSaveState(StatesC, Text.c_str());
|
||||
}
|
||||
if( GSchangeSaveState != NULL )
|
||||
GSchangeSaveState(StatesC, SaveState::GetFilename(StatesC).c_str());
|
||||
break;
|
||||
|
||||
case 3:
|
||||
try
|
||||
{
|
||||
SaveState::GetFilename( Text, StatesC );
|
||||
gzLoadingState joe( Text ); // throws exception on version mismatch
|
||||
gzLoadingState joe( SaveState::GetFilename( StatesC ) ); // throws exception on version mismatch
|
||||
cpuReset();
|
||||
SysResetExecutionState();
|
||||
joe.FreezeAll();
|
||||
|
@ -664,7 +656,9 @@ void ProcessFKeys(int fkey, int shift)
|
|||
if( mtgsThread != NULL ) {
|
||||
Console::Notice( "Cannot make gsstates in MTGS mode" );
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
string Text;
|
||||
if( strgametitle[0] != 0 ) {
|
||||
// only take the first two words
|
||||
char name[256], *tok;
|
||||
|
@ -676,10 +670,10 @@ void ProcessFKeys(int fkey, int shift)
|
|||
if( tok != NULL ) strcat(name, tok);
|
||||
|
||||
ssprintf( gsText, "%s.%d.gs", name, StatesC);
|
||||
Path::Combine( Text, SSTATES_DIR, gsText );
|
||||
Text = Path::Combine( SSTATES_DIR, gsText );
|
||||
}
|
||||
else
|
||||
GetGSStateFilename( Text );
|
||||
Text = GetGSStateFilename();
|
||||
|
||||
SaveGSState(Text);
|
||||
}
|
||||
|
@ -709,7 +703,6 @@ void ProcessFKeys(int fkey, int shift)
|
|||
|
||||
void injectIRX(const char *filename)
|
||||
{
|
||||
string path;
|
||||
char name[260], *p, *q;
|
||||
struct romdir *rd;
|
||||
int iROMDIR=-1, iIOPBTCONF=-1, iBLANK=-1, i, filesize;
|
||||
|
@ -749,7 +742,7 @@ void injectIRX(const char *filename)
|
|||
strcpy(p, name);p[strlen(name)]=0xA;
|
||||
|
||||
//phase 4: find file
|
||||
Path::Combine( path, Config.BiosDir, filename );
|
||||
string path( Path::Combine( Config.BiosDir, filename ) );
|
||||
|
||||
if( !Path::isFile( path ) )
|
||||
{
|
||||
|
@ -775,43 +768,6 @@ void injectIRX(const char *filename)
|
|||
}
|
||||
|
||||
|
||||
// [TODO] I'd like to move the following functions to their own module eventually.
|
||||
// It might even be a good idea to just go ahead and move them into Win32/Linux
|
||||
// specific files since they're all #ifdef'd that way anyways.
|
||||
|
||||
#ifdef _WIN32
|
||||
static LARGE_INTEGER lfreq;
|
||||
#endif
|
||||
|
||||
void InitCPUTicks()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
QueryPerformanceFrequency(&lfreq);
|
||||
#endif
|
||||
}
|
||||
|
||||
u64 GetTickFrequency()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
return lfreq.QuadPart;
|
||||
#else
|
||||
return 1000000; // unix measures in microseconds
|
||||
#endif
|
||||
}
|
||||
|
||||
u64 GetCPUTicks()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
LARGE_INTEGER count;
|
||||
QueryPerformanceCounter(&count);
|
||||
return count.QuadPart;
|
||||
#else
|
||||
struct timeval t;
|
||||
gettimeofday(&t, NULL);
|
||||
return ((u64)t.tv_sec*GetTickFrequency())+t.tv_usec;
|
||||
#endif
|
||||
}
|
||||
|
||||
void _memset16_unaligned( void* dest, u16 data, size_t size )
|
||||
{
|
||||
jASSUME( (size & 0x1) == 0 );
|
||||
|
|
|
@ -26,13 +26,6 @@
|
|||
#include "Patch.h"
|
||||
#include "VU.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#include "windows/cheats/cheats.h"
|
||||
#else
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable:4996) //ignore the stricmp deprecated warning
|
||||
#endif
|
||||
|
|
|
@ -92,23 +92,21 @@ bool isRooted( const string& path )
|
|||
|
||||
// Concatenates two pathnames together, inserting delimiters (backslash on win32)
|
||||
// as needed! Assumes the 'dest' is allocated to at least g_MaxPath length.
|
||||
void Combine( string& dest, const string& srcPath, const string& srcFile )
|
||||
string Combine( const string& srcPath, const string& srcFile )
|
||||
{
|
||||
int pathlen, guesslen;
|
||||
|
||||
if( srcFile.empty() )
|
||||
{
|
||||
// No source filename? Return the path unmodified.
|
||||
dest = srcPath;
|
||||
return;
|
||||
return srcPath;
|
||||
}
|
||||
|
||||
if( isRooted( srcFile ) || srcPath.empty() )
|
||||
{
|
||||
// No source path? Or source filename is rooted?
|
||||
// Return the filename unmodified.
|
||||
dest = srcFile;
|
||||
return;
|
||||
return srcFile;
|
||||
}
|
||||
|
||||
// strip off the srcPath's trailing backslashes (if any)
|
||||
|
@ -127,14 +125,17 @@ void Combine( string& dest, const string& srcPath, const string& srcFile )
|
|||
|
||||
// Concatenate!
|
||||
|
||||
dest.assign( srcPath.begin(), srcPath.begin()+pathlen );
|
||||
string dest( srcPath.begin(), srcPath.begin()+pathlen );
|
||||
dest += Separator;
|
||||
dest += srcFile;
|
||||
return dest;
|
||||
}
|
||||
|
||||
// Replaces the extension of the file with the one given.
|
||||
void ReplaceExtension( string& dest, const string& src, const string& ext )
|
||||
string ReplaceExtension( const string& src, const string& ext )
|
||||
{
|
||||
string dest;
|
||||
|
||||
int pos = src.find_last_of( '.' );
|
||||
if( pos == string::npos || pos == 0 )
|
||||
dest = src;
|
||||
|
@ -146,6 +147,8 @@ void ReplaceExtension( string& dest, const string& src, const string& ext )
|
|||
dest += '.';
|
||||
dest += ext;
|
||||
}
|
||||
|
||||
return dest;
|
||||
}
|
||||
|
||||
// finds the starting character position of a filename for the given source path.
|
||||
|
@ -176,8 +179,9 @@ static int _findFilenamePosition( const string& src)
|
|||
return pos;
|
||||
}
|
||||
|
||||
void ReplaceFilename( string& dest, const string& src, const string& newfilename )
|
||||
string ReplaceFilename( const string& src, const string& newfilename )
|
||||
{
|
||||
string dest;
|
||||
int pos = _findFilenamePosition( src );
|
||||
|
||||
if( pos == 0 )
|
||||
|
@ -190,6 +194,7 @@ void ReplaceFilename( string& dest, const string& src, const string& newfilename
|
|||
dest += '.';
|
||||
dest += newfilename;
|
||||
}
|
||||
return dest;
|
||||
}
|
||||
|
||||
void GetFilename( const string& src, string& dest )
|
||||
|
|
|
@ -24,15 +24,15 @@ extern char MAIN_DIR[g_MaxPath];
|
|||
|
||||
namespace Path
|
||||
{
|
||||
extern void Combine( std::string& dest, const std::string& srcPath, const std::string& srcFile );
|
||||
extern bool isRooted( const std::string& path );
|
||||
extern bool isDirectory( const std::string& path );
|
||||
extern bool isFile( const std::string& path );
|
||||
extern bool Exists( const std::string& path );
|
||||
extern int getFileSize( const std::string& path );
|
||||
|
||||
extern void ReplaceExtension( std::string& dest, const std::string& src, const std::string& ext );
|
||||
extern void ReplaceFilename( std::string& dest, const std::string& src, const std::string& newfilename );
|
||||
extern std::string Combine( const std::string& srcPath, const std::string& srcFile );
|
||||
extern std::string ReplaceExtension( const std::string& src, const std::string& ext );
|
||||
extern std::string ReplaceFilename( const std::string& src, const std::string& newfilename );
|
||||
extern void GetFilename( const std::string& src, std::string& dest );
|
||||
extern void GetDirectory( const std::string& src, std::string& dest );
|
||||
extern void GetRootDirectory( const std::string& src, std::string& dest );
|
||||
|
|
|
@ -594,31 +594,14 @@ int LoadPlugins()
|
|||
{
|
||||
if( loadp ) return 0;
|
||||
|
||||
string Plugin;
|
||||
|
||||
Path::Combine( Plugin, Config.PluginsDir, Config.GS );
|
||||
if (LoadGSplugin(Plugin) == -1) return -1;
|
||||
|
||||
Path::Combine( Plugin, Config.PluginsDir, Config.PAD1 );
|
||||
if (LoadPAD1plugin(Plugin) == -1) return -1;
|
||||
|
||||
Path::Combine( Plugin, Config.PluginsDir, Config.PAD2);
|
||||
if (LoadPAD2plugin(Plugin) == -1) return -1;
|
||||
|
||||
Path::Combine( Plugin, Config.PluginsDir, Config.SPU2);
|
||||
if (LoadSPU2plugin(Plugin) == -1) return -1;
|
||||
|
||||
Path::Combine( Plugin, Config.PluginsDir, Config.CDVD);
|
||||
if (LoadCDVDplugin(Plugin) == -1) return -1;
|
||||
|
||||
Path::Combine( Plugin, Config.PluginsDir, Config.DEV9);
|
||||
if (LoadDEV9plugin(Plugin) == -1) return -1;
|
||||
|
||||
Path::Combine( Plugin, Config.PluginsDir, Config.USB);
|
||||
if (LoadUSBplugin(Plugin) == -1) return -1;
|
||||
|
||||
Path::Combine( Plugin, Config.PluginsDir, Config.FW);
|
||||
if (LoadFWplugin(Plugin) == -1) return -1;
|
||||
if (LoadGSplugin( Path::Combine( Config.PluginsDir, Config.GS )) == -1) return -1;
|
||||
if (LoadPAD1plugin( Path::Combine( Config.PluginsDir, Config.PAD1 )) == -1) return -1;
|
||||
if (LoadPAD2plugin( Path::Combine( Config.PluginsDir, Config.PAD2 )) == -1) return -1;
|
||||
if (LoadSPU2plugin( Path::Combine( Config.PluginsDir, Config.SPU2 )) == -1) return -1;
|
||||
if (LoadCDVDplugin( Path::Combine( Config.PluginsDir, Config.CDVD )) == -1) return -1;
|
||||
if (LoadDEV9plugin( Path::Combine( Config.PluginsDir, Config.DEV9 )) == -1) return -1;
|
||||
if (LoadUSBplugin( Path::Combine( Config.PluginsDir, Config.USB )) == -1) return -1;
|
||||
if (LoadFWplugin( Path::Combine( Config.PluginsDir, Config.FW )) == -1) return -1;
|
||||
|
||||
loadp = true;
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef _PCSX2_PRECOMPILED_HEADER_
|
||||
#define _PCSX2_PRECOMPILED_HEADER_
|
||||
|
||||
#define NOMINMAX // Disables other libs inclusion of their own min/max macros (we use std instead)
|
||||
|
||||
#if defined (__linux__) // some distributions are lower case
|
||||
# define __LINUX__
|
||||
#endif
|
||||
|
@ -39,6 +41,8 @@
|
|||
#endif
|
||||
|
||||
using std::string; // we use it enough, so bring it into the global namespace.
|
||||
using std::min;
|
||||
using std::max;
|
||||
|
||||
#include "zlib/zlib.h"
|
||||
#include "PS2Etypes.h"
|
||||
|
|
|
@ -18,10 +18,6 @@
|
|||
#ifndef __PSXCOMMON_H__
|
||||
#define __PSXCOMMON_H__
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#include "PS2Etypes.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
|
|
@ -27,6 +27,8 @@
|
|||
#ifndef _REDTAPE_WINDOWS_H_
|
||||
#define _REDTAPE_WINDOWS_H_
|
||||
|
||||
#define NOMINMAX // Disables other libs inclusion of their own min/max macros (we use std instead)
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
// Force availability of to WinNT APIs (change to 0x600 to enable XP-specific APIs)
|
||||
|
|
|
@ -51,21 +51,11 @@ static void PostLoadPrep()
|
|||
for(int i=0; i<48; i++) MapTLB(i);
|
||||
}
|
||||
|
||||
void SaveState::GetFilename( string& dest, int slot )
|
||||
{
|
||||
string elfcrcText;
|
||||
ssprintf( elfcrcText, "%8.8X.%3.3d", ElfCRC, slot );
|
||||
Path::Combine( dest, SSTATES_DIR, elfcrcText );
|
||||
}
|
||||
|
||||
string SaveState::GetFilename( int slot )
|
||||
{
|
||||
string elfcrcText, dest;
|
||||
GetFilename( dest, slot );
|
||||
return dest;
|
||||
return Path::Combine( SSTATES_DIR, fmt_string( "%8.8X.%3.3d", ElfCRC, slot ) );
|
||||
}
|
||||
|
||||
|
||||
SaveState::SaveState( const char* msg, const string& destination ) : m_version( g_SaveVersion )
|
||||
{
|
||||
Console::WriteLn( "%s %hs", params msg, &destination );
|
||||
|
|
|
@ -46,7 +46,6 @@ public:
|
|||
SaveState( const char* msg, const string& destination );
|
||||
virtual ~SaveState() { }
|
||||
|
||||
static void GetFilename( string& dest, int slot );
|
||||
static string GetFilename( int slot );
|
||||
|
||||
// Gets the version of savestate that this object is acting on.
|
||||
|
|
|
@ -74,15 +74,6 @@ void SysMemProtect( void* baseaddr, size_t size, PageProtectionMode mode, bool a
|
|||
// *DEPRECIATED* Use Console namespace methods instead.
|
||||
void SysPrintf(const char *fmt, ...); // *DEPRECIATED*
|
||||
|
||||
#ifdef _MSC_VER
|
||||
# define PCSX2_MEM_PROTECT_BEGIN() __try {
|
||||
# define PCSX2_MEM_PROTECT_END() } __except(SysPageFaultExceptionFilter(GetExceptionInformation())) {}
|
||||
#else
|
||||
# define PCSX2_MEM_PROTECT_BEGIN() InstallLinuxExceptionHandler()
|
||||
# define PCSX2_MEM_PROTECT_END() ReleaseLinuxExceptionHandler()
|
||||
#endif
|
||||
|
||||
|
||||
// Console Namespace -- Replacements for SysPrintf.
|
||||
// SysPrintf is depreciated -- We should phase these in over time.
|
||||
namespace Console
|
||||
|
|
|
@ -46,9 +46,7 @@ struct ComboInitializer
|
|||
, PS2E_GetLibName( NULL )
|
||||
, PS2E_GetLibVersion2( NULL )
|
||||
{
|
||||
string tmpStr;
|
||||
Path::Combine( tmpStr, Config.PluginsDir, "*.dll" );
|
||||
Find = FindFirstFile(tmpStr.c_str(), &FindData);
|
||||
Find = FindFirstFile( Path::Combine( Config.PluginsDir, "*.dll" ).c_str(), &FindData);
|
||||
}
|
||||
|
||||
~ComboInitializer()
|
||||
|
@ -64,9 +62,8 @@ struct ComboInitializer
|
|||
|
||||
bool LoadNextLibrary()
|
||||
{
|
||||
string tmpStr;
|
||||
Path::Combine( tmpStr, Config.PluginsDir, FindData.cFileName );
|
||||
Lib = LoadLibrary(tmpStr.c_str());
|
||||
string tmpStr( Path::Combine( Config.PluginsDir, FindData.cFileName ) );
|
||||
Lib = LoadLibrary( tmpStr.c_str() );
|
||||
if (Lib == NULL)
|
||||
{
|
||||
Console::Error( "Plugin load failure: %hs\n\tSysLibError Message: %s", params &tmpStr, SysLibError() );
|
||||
|
@ -180,10 +177,7 @@ BOOL OnConfigureDialog(HWND hW) {
|
|||
HANDLE Find;
|
||||
|
||||
WIN32_FIND_DATA FindData;
|
||||
string tmpStr;
|
||||
|
||||
Path::Combine( tmpStr, Config.BiosDir, "*" );
|
||||
Find=FindFirstFile(tmpStr.c_str(), &FindData);
|
||||
Find = FindFirstFile( Path::Combine( Config.BiosDir, "*" ).c_str(), &FindData);
|
||||
|
||||
do
|
||||
{
|
||||
|
@ -309,12 +303,10 @@ static void ConfPlugin( HWND hW, int confs, const char* name )
|
|||
void *drv;
|
||||
void (*conf)();
|
||||
char * pDLL = GetComboSel(hW, confs);
|
||||
string file;
|
||||
|
||||
if(pDLL==NULL) return;
|
||||
Path::Combine( file, Config.PluginsDir, pDLL );
|
||||
|
||||
drv = SysLoadLibrary(file.c_str());
|
||||
drv = SysLoadLibrary( Path::Combine( Config.PluginsDir, pDLL ).c_str() );
|
||||
if (drv == NULL) return;
|
||||
|
||||
conf = (void (*)()) SysLoadSym(drv, name);
|
||||
|
@ -390,12 +382,10 @@ static void TestPlugin( HWND hW, int confs, const char* name )
|
|||
int (*conf)();
|
||||
int ret = 0;
|
||||
char * pDLL = GetComboSel(hW, confs);
|
||||
string file;
|
||||
|
||||
if (pDLL== NULL) return;
|
||||
Path::Combine( file, Config.PluginsDir, pDLL );
|
||||
|
||||
drv = SysLoadLibrary(file.c_str());
|
||||
drv = SysLoadLibrary( Path::Combine( Config.PluginsDir, pDLL ).c_str() );
|
||||
if (drv == NULL) return;
|
||||
|
||||
conf = (int (*)()) SysLoadSym(drv, name);
|
||||
|
|
|
@ -18,7 +18,6 @@
|
|||
|
||||
#include "Win32.h"
|
||||
#include "Common.h"
|
||||
#include "resource.h"
|
||||
|
||||
unsigned long memory_addr;
|
||||
BOOL mem_inupdate = FALSE;
|
||||
|
|
|
@ -110,12 +110,17 @@ void MemcardConfig::Open_Mcd_Proc(HWND hW, int mcd)
|
|||
|
||||
if (GetOpenFileName ((LPOPENFILENAME)&ofn))
|
||||
{
|
||||
string confusion;
|
||||
Path::Combine( confusion, g_WorkingFolder, szFileName );
|
||||
Edit_SetText(GetDlgItem(hW,mcd == 1 ? IDC_MCD_FILE1 : IDC_MCD_FILE2), _stripPathInfo( confusion.c_str() ) );
|
||||
Edit_SetText(GetDlgItem(hW,mcd == 1 ? IDC_MCD_FILE1 : IDC_MCD_FILE2),
|
||||
_stripPathInfo( Path::Combine( g_WorkingFolder, szFileName ).c_str() ) );
|
||||
}
|
||||
}
|
||||
|
||||
static string m_Default_MemcardsDir[2] =
|
||||
{
|
||||
Path::Combine( MEMCARDS_DIR, DEFAULT_MEMCARD1 ),
|
||||
Path::Combine( MEMCARDS_DIR, DEFAULT_MEMCARD2 )
|
||||
};
|
||||
|
||||
BOOL CALLBACK MemcardConfig::DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch(uMsg)
|
||||
|
@ -136,16 +141,14 @@ BOOL CALLBACK MemcardConfig::DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPA
|
|||
|
||||
if( Config.Mcd[0].Filename[0] == 0 )
|
||||
{
|
||||
string mcdpath;
|
||||
Path::Combine( mcdpath, g_WorkingFolder, MEMCARDS_DIR "\\" DEFAULT_MEMCARD1 );
|
||||
mcdpath._Copy_s( Config.Mcd[1].Filename, g_MaxPath, mcdpath.length() );
|
||||
strcpy_s( Config.Mcd[0].Filename,
|
||||
Path::Combine( g_WorkingFolder, m_Default_MemcardsDir[0] ).c_str() );
|
||||
}
|
||||
|
||||
if( Config.Mcd[1].Filename[1] == 0 )
|
||||
{
|
||||
string mcdpath;
|
||||
Path::Combine( mcdpath, g_WorkingFolder, MEMCARDS_DIR "\\" DEFAULT_MEMCARD1 );
|
||||
mcdpath._Copy_s( Config.Mcd[1].Filename, g_MaxPath, mcdpath.length() );
|
||||
strcpy_s( Config.Mcd[1].Filename,
|
||||
Path::Combine( g_WorkingFolder, m_Default_MemcardsDir[1] ).c_str() );
|
||||
}
|
||||
|
||||
Edit_SetText( GetDlgItem(hWnd,IDC_MCD_FILE1), _stripPathInfo( Config.Mcd[0].Filename ) );
|
||||
|
@ -190,13 +193,8 @@ BOOL CALLBACK MemcardConfig::DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPA
|
|||
|
||||
// reassign text with the extra unnecessary path info stripped out.
|
||||
|
||||
string confusion;
|
||||
|
||||
Path::Combine( confusion, g_WorkingFolder, Config.Mcd[0].Filename );
|
||||
_tcscpy( Config.Mcd[0].Filename, _stripPathInfo( confusion.c_str() ) );
|
||||
|
||||
Path::Combine( confusion, g_WorkingFolder, Config.Mcd[1].Filename );
|
||||
_tcscpy( Config.Mcd[1].Filename, _stripPathInfo( confusion.c_str() ) );
|
||||
_tcscpy( Config.Mcd[0].Filename, _stripPathInfo( Path::Combine( g_WorkingFolder, Config.Mcd[0].Filename ).c_str() ) );
|
||||
_tcscpy( Config.Mcd[1].Filename, _stripPathInfo( Path::Combine( g_WorkingFolder, Config.Mcd[1].Filename ).c_str() ) );
|
||||
|
||||
if( g_EmulationInProgress )
|
||||
{
|
||||
|
@ -244,13 +242,11 @@ void IniFile::MemcardSettings( PcsxConfig& conf )
|
|||
{
|
||||
SetCurrentSection( "Memorycards" );
|
||||
|
||||
string mcdpath;
|
||||
Entry( "Slot1_Path", conf.Mcd[0].Filename,
|
||||
Path::Combine( g_WorkingFolder, m_Default_MemcardsDir[0] ) );
|
||||
|
||||
Path::Combine( mcdpath, g_WorkingFolder, MEMCARDS_DIR "\\" DEFAULT_MEMCARD1 );
|
||||
Entry( "Slot1_Path", conf.Mcd[0].Filename, mcdpath );
|
||||
|
||||
Path::Combine( mcdpath, g_WorkingFolder, MEMCARDS_DIR "\\" DEFAULT_MEMCARD2 );
|
||||
Entry( "Slot2_Path", conf.Mcd[1].Filename, mcdpath );
|
||||
Entry( "Slot2_Path", conf.Mcd[1].Filename,
|
||||
Path::Combine( g_WorkingFolder, m_Default_MemcardsDir[0] ) );
|
||||
|
||||
Entry( "Slot1_Enabled", conf.Mcd[0].Enabled, true );
|
||||
Entry( "Slot2_Enabled", conf.Mcd[1].Enabled, true );
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
|
||||
#include "Win32.h"
|
||||
#include "Common.h"
|
||||
#include "resource.h"
|
||||
|
||||
/*
|
||||
* TODO:
|
||||
|
|
|
@ -295,6 +295,15 @@
|
|||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PrecompiledHeaderThrough="Win32.h"
|
||||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\AboutDlg.h"
|
||||
|
@ -321,6 +330,15 @@
|
|||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PrecompiledHeaderThrough="Win32.h"
|
||||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\ConfigDlg.cpp"
|
||||
|
@ -343,6 +361,15 @@
|
|||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PrecompiledHeaderThrough="Win32.h"
|
||||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CpuDlg.cpp"
|
||||
|
@ -365,6 +392,15 @@
|
|||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PrecompiledHeaderThrough="Win32.h"
|
||||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\HacksDlg.cpp"
|
||||
|
@ -387,6 +423,15 @@
|
|||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PrecompiledHeaderThrough="Win32.h"
|
||||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\ini.cpp"
|
||||
|
@ -431,6 +476,15 @@
|
|||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PrecompiledHeaderThrough="Win32.h"
|
||||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\McdManagerDlg.cpp"
|
||||
|
@ -461,6 +515,8 @@
|
|||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PrecompiledHeaderThrough="Win32.h"
|
||||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
|
@ -511,6 +567,15 @@
|
|||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PrecompiledHeaderThrough="Win32.h"
|
||||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\RDebugger.h"
|
||||
|
@ -541,6 +606,15 @@
|
|||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PrecompiledHeaderThrough="Win32.h"
|
||||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\WindowsPCH.cpp"
|
||||
|
@ -594,6 +668,8 @@
|
|||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
BufferSecurityCheck="false"
|
||||
PrecompiledHeaderThrough="Win32.h"
|
||||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
|
@ -641,6 +717,8 @@
|
|||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
BufferSecurityCheck="false"
|
||||
PrecompiledHeaderThrough="Win32.h"
|
||||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
|
@ -867,6 +945,28 @@
|
|||
RelativePath="..\..\vssprintf.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\WinMisc.cpp"
|
||||
>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PrecompiledHeaderThrough="Win32.h"
|
||||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Devel|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PrecompiledHeaderThrough="Win32.h"
|
||||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<Filter
|
||||
Name="TinyXML"
|
||||
>
|
||||
|
@ -1430,6 +1530,34 @@
|
|||
RelativePath="..\..\Linux\LnxMain.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\Linux\LnxMisc.cpp"
|
||||
>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Devel|Win32"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\Linux\LnxSysExec.cpp"
|
||||
>
|
||||
|
@ -2529,6 +2657,15 @@
|
|||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PrecompiledHeaderThrough="Win32.h"
|
||||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\SaveState.cpp"
|
||||
|
@ -2545,6 +2682,33 @@
|
|||
<File
|
||||
RelativePath="..\WinCompressNTFS.cpp"
|
||||
>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PrecompiledHeaderThrough="Win32.h"
|
||||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Devel|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PrecompiledHeaderThrough="Win32.h"
|
||||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PrecompiledHeaderThrough="Win32.h"
|
||||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\WinThreads.cpp"
|
||||
|
@ -2567,6 +2731,15 @@
|
|||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PrecompiledHeaderThrough="Win32.h"
|
||||
PrecompiledHeaderFile="$(IntDir)\win32.pch"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<Filter
|
||||
Name="Include"
|
||||
|
|
|
@ -35,6 +35,10 @@
|
|||
//Exception handler for the VTLB-based recompilers.
|
||||
int SysPageFaultExceptionFilter(EXCEPTION_POINTERS* eps);
|
||||
|
||||
#define PCSX2_MEM_PROTECT_BEGIN() __try {
|
||||
#define PCSX2_MEM_PROTECT_END() } __except(SysPageFaultExceptionFilter(GetExceptionInformation())) {}
|
||||
|
||||
|
||||
// --->> Ini Configuration [ini.c]
|
||||
|
||||
extern char g_WorkingFolder[g_MaxPath];
|
||||
|
|
|
@ -1,6 +1,21 @@
|
|||
/* Pcsx2 - Pc Ps2 Emulator
|
||||
* Copyright (C) 2002-2009 Pcsx2 Team
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
|
||||
#include "PrecompiledHeader.h"
|
||||
#include "Win32.h"
|
||||
|
||||
// Translates an Errno code into an exception.
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
/* Pcsx2 - Pc Ps2 Emulator
|
||||
* Copyright (C) 2002-2009 Pcsx2 Team
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include "Win32.h"
|
||||
#include "cdvd.h"
|
||||
|
||||
static LARGE_INTEGER lfreq;
|
||||
|
||||
void InitCPUTicks()
|
||||
{
|
||||
QueryPerformanceFrequency( &lfreq );
|
||||
}
|
||||
|
||||
u64 GetTickFrequency()
|
||||
{
|
||||
return lfreq.QuadPart;
|
||||
}
|
||||
|
||||
u64 GetCPUTicks()
|
||||
{
|
||||
LARGE_INTEGER count;
|
||||
QueryPerformanceCounter( &count );
|
||||
return count.QuadPart;
|
||||
}
|
||||
|
||||
void cdvdSetSystemTime( cdvdStruct& cdvd )
|
||||
{
|
||||
SYSTEMTIME st;
|
||||
GetSystemTime(&st);
|
||||
|
||||
cdvd.RTC.second = (u8)(st.wSecond);
|
||||
cdvd.RTC.minute = (u8)(st.wMinute);
|
||||
cdvd.RTC.hour = (u8)(st.wHour+1)%24;
|
||||
cdvd.RTC.day = (u8)(st.wDay);
|
||||
cdvd.RTC.month = (u8)(st.wMonth);
|
||||
cdvd.RTC.year = (u8)(st.wYear - 2000);
|
||||
}
|
|
@ -45,9 +45,30 @@ AppData gApp;
|
|||
|
||||
const char* g_pRunGSState = NULL;
|
||||
|
||||
|
||||
#define CmdSwitchIs( text ) ( stricmp( command, text ) == 0 )
|
||||
|
||||
int SysPageFaultExceptionFilter( EXCEPTION_POINTERS* eps )
|
||||
{
|
||||
const _EXCEPTION_RECORD& ExceptionRecord = *eps->ExceptionRecord;
|
||||
//const _CONTEXT& ContextRecord = *eps->ContextRecord;
|
||||
|
||||
if (ExceptionRecord.ExceptionCode != EXCEPTION_ACCESS_VIOLATION)
|
||||
{
|
||||
return EXCEPTION_CONTINUE_SEARCH;
|
||||
}
|
||||
|
||||
// get bad virtual address
|
||||
u32 offset = (u8*)ExceptionRecord.ExceptionInformation[1]-psM;
|
||||
|
||||
if (offset>=Ps2MemSize::Base)
|
||||
return EXCEPTION_CONTINUE_SEARCH;
|
||||
|
||||
mmap_ClearCpuBlock( offset );
|
||||
|
||||
return EXCEPTION_CONTINUE_EXECUTION;
|
||||
}
|
||||
|
||||
|
||||
// For issuing notices to both the status bar and the console at the same time.
|
||||
// Single-line text only please! Mutli-line msgs should be directed to the
|
||||
// console directly, thanks.
|
||||
|
@ -517,8 +538,7 @@ void States_Save(int num)
|
|||
// have likely been cleared out. So save from the Recovery buffer instead of
|
||||
// doing a "standard" save:
|
||||
|
||||
string text;
|
||||
SaveState::GetFilename( text, num );
|
||||
string text( SaveState::GetFilename( num ) );
|
||||
gzFile fileptr = gzopen( text.c_str(), "wb" );
|
||||
if( fileptr == NULL )
|
||||
{
|
||||
|
|
|
@ -18,22 +18,11 @@
|
|||
#ifndef CHEATS_H_INCLUDED
|
||||
#define CHEATS_H_INCLUDED
|
||||
|
||||
#ifndef __cplusplus
|
||||
//typedef enum ebool
|
||||
//{
|
||||
// false,
|
||||
// true
|
||||
//} bool;
|
||||
#define bool unsigned __int8
|
||||
#define false 0
|
||||
#define true 1
|
||||
#endif
|
||||
|
||||
extern HINSTANCE pInstance;
|
||||
extern bool FirstShow;
|
||||
|
||||
void AddCheat(HINSTANCE hInstance, HWND hParent);
|
||||
void ShowFinder(HINSTANCE hInstance, HWND hParent);
|
||||
void ShowCheats(HINSTANCE hInstance, HWND hParent);
|
||||
extern void AddCheat(HINSTANCE hInstance, HWND hParent);
|
||||
extern void ShowFinder(HINSTANCE hInstance, HWND hParent);
|
||||
extern void ShowCheats(HINSTANCE hInstance, HWND hParent);
|
||||
|
||||
#endif//CHEATS_H_INCLUDED
|
||||
|
|
|
@ -33,23 +33,12 @@ static bool hasCustomConfig()
|
|||
}
|
||||
|
||||
// Returns the FULL (absolute) path and filename of the configuration file.
|
||||
static void GetConfigFilename( string& dest )
|
||||
static string GetConfigFilename()
|
||||
{
|
||||
if( hasCustomConfig() )
|
||||
{
|
||||
// Load a user-specified configuration.
|
||||
// If the configuration isn't found, fail outright (see below)
|
||||
// Load a user-specified configuration, or use the ini relative to the application's working directory.
|
||||
// (Our current working directory can change, so we use the one we detected at startup)
|
||||
|
||||
Path::Combine( dest, g_WorkingFolder, g_CustomConfigFile );
|
||||
}
|
||||
else
|
||||
{
|
||||
// use the ini relative to the application's working directory.
|
||||
// Our current working directory can change, so we use the one we detected
|
||||
// at startup:
|
||||
|
||||
Path::Combine( dest, g_WorkingFolder, CONFIG_DIR "\\pcsx2.ini" );
|
||||
}
|
||||
return Path::Combine( g_WorkingFolder, hasCustomConfig() ? g_CustomConfigFile : (CONFIG_DIR "\\pcsx2.ini") );
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -173,9 +162,8 @@ void IniFileSaver::EnumEntry( const string& var, int& value, const char* const*
|
|||
// InitFile -- Base class implementation.
|
||||
|
||||
IniFile::~IniFile() {}
|
||||
IniFile::IniFile() : m_filename(), m_section("Misc")
|
||||
IniFile::IniFile() : m_filename( GetConfigFilename() ), m_section("Misc")
|
||||
{
|
||||
GetConfigFilename( m_filename );
|
||||
}
|
||||
|
||||
void IniFile::SetCurrentSection( const string& newsection )
|
||||
|
@ -244,10 +232,9 @@ void IniFile::DoConfig( PcsxConfig& Conf )
|
|||
|
||||
bool LoadConfig()
|
||||
{
|
||||
string szIniFile;
|
||||
bool status = true;
|
||||
|
||||
GetConfigFilename( szIniFile );
|
||||
string szIniFile( GetConfigFilename() );
|
||||
|
||||
if( !Path::Exists( szIniFile ) )
|
||||
{
|
||||
|
|
|
@ -133,7 +133,6 @@ using namespace R3000A;
|
|||
static void iIopDumpBlock( int startpc, u8 * ptr )
|
||||
{
|
||||
FILE *f;
|
||||
char filename[ g_MaxPath ];
|
||||
#ifdef __LINUX__
|
||||
char command[256];
|
||||
#endif
|
||||
|
@ -143,17 +142,13 @@ static void iIopDumpBlock( int startpc, u8 * ptr )
|
|||
int numused, count;
|
||||
|
||||
SysPrintf( "dump1 %x:%x, %x\n", startpc, psxpc, psxRegs.cycle );
|
||||
#ifdef _WIN32
|
||||
CreateDirectory("dumps", NULL);
|
||||
sprintf_s( filename, g_MaxPath, "dumps\\psxdump%.8X.txt", startpc);
|
||||
#else
|
||||
mkdir("dumps", 0755);
|
||||
sprintf( filename, "dumps/psxdump%.8X.txt", startpc);
|
||||
#endif
|
||||
Path::CreateDirectory( "dumps" );
|
||||
|
||||
string filename( Path::Combine( "dumps", fmt_string( "psxdump%.8X.txt", startpc ) ) );
|
||||
|
||||
fflush( stdout );
|
||||
|
||||
f = fopen( filename, "w" );
|
||||
f = fopen( filename.c_str(), "w" );
|
||||
assert( f != NULL );
|
||||
for ( i = startpc; i < s_nEndBlock; i += 4 ) {
|
||||
fprintf( f, "%s\n", disR3000Fasm( iopMemRead32( i ), i ) );
|
||||
|
|
|
@ -525,7 +525,9 @@ void SuperVUDumpBlock(list<VuBaseBlock*>& blocks, int vuindex)
|
|||
u32 i;
|
||||
|
||||
Path::CreateDirectory( "dumps" );
|
||||
ssprintf( filename, "dumps\\svu%cdump%.4X.txt", s_vu?'0':'1', s_pFnHeader->startpc );
|
||||
ssprintf( filename, "svu%cdump%.4X.txt", s_vu?'0':'1', s_pFnHeader->startpc );
|
||||
|
||||
filename = Path::Combine( "dumps", filename );
|
||||
|
||||
//SysPrintf( "dump1 %x => %s\n", s_pFnHeader->startpc, filename );
|
||||
|
||||
|
|
Loading…
Reference in New Issue