From 670def4974f11faa129afdd35dc6f93c4208f016 Mon Sep 17 00:00:00 2001 From: "Jake.Stine" Date: Thu, 27 Aug 2009 08:48:00 +0000 Subject: [PATCH] Linux only: Preliminary fixups for supporting the new improved commandline and g_Startup implementation. git-svn-id: http://pcsx2.googlecode.com/svn/trunk@1686 96395faa-99c1-11dd-bbfe-3dabce05a288 --- pcsx2/CDVD/CDVDaccess.cpp | 9 ++- pcsx2/Linux/LnxMain.cpp | 39 +++++++------ pcsx2/Linux/LnxMain.h | 2 +- pcsx2/Linux/LnxSysExec.cpp | 107 ++++++++++++++++++++++++++++------- pcsx2/windows/WinSysExec.cpp | 1 + 5 files changed, 112 insertions(+), 46 deletions(-) diff --git a/pcsx2/CDVD/CDVDaccess.cpp b/pcsx2/CDVD/CDVDaccess.cpp index 2b4809f489..98a561e072 100644 --- a/pcsx2/CDVD/CDVDaccess.cpp +++ b/pcsx2/CDVD/CDVDaccess.cpp @@ -38,7 +38,7 @@ // performed quite liberally by many games (perhaps intended to keep the PS2 DVD // from spinning down due to idle activity?). // Cache is set to -1 for init and when the disc is removed/changed, which invokes -// a new DiskTypeCheck. Al subsequent checks use the non-negative value here. +// a new DiskTypeCheck. All subsequent checks use the non-negative value here. // static int diskTypeCached = -1; @@ -47,9 +47,9 @@ int lastReadSize; // Records last read block length for block dumping static int plsn = 0; -static isoFile *blockDumpFile; +static isoFile *blockDumpFile = NULL; -// Assertion check for CDVD != NULL (in devel and debgu builds), because its handier than +// Assertion check for CDVD != NULL (in devel and debug builds), because its handier than // relying on DEP exceptions -- and a little more reliable too. static void CheckNullCDVD() { @@ -103,8 +103,6 @@ int CheckDiskTypeFS(int baseType) return CDVD_TYPE_ILLEGAL; // << Only for discs which aren't ps2 at all. } -static char bleh[2352]; - static int FindDiskType(int mType) { int dataTracks = 0; @@ -120,6 +118,7 @@ static int FindDiskType(int mType) } else if (mType < 0) { + static char bleh[2352]; cdvdTD td; CDVD->getTD(0,&td); diff --git a/pcsx2/Linux/LnxMain.cpp b/pcsx2/Linux/LnxMain.cpp index d61d69676a..9a1edbd1f9 100644 --- a/pcsx2/Linux/LnxMain.cpp +++ b/pcsx2/Linux/LnxMain.cpp @@ -30,7 +30,6 @@ char elfname[g_MaxPath]; int main(int argc, char *argv[]) { - char *file = NULL; char elfname[g_MaxPath]; efile = 0; @@ -62,7 +61,7 @@ int main(int argc, char *argv[]) memset(&g_Startup, 0, sizeof(g_Startup)); #endif - if (!ParseCommandLine(argc, argv, file)) return 0; + if (!ParseCommandLine(argc, argv)) return 0; // make gtk thread safe if using MTGS if (CHECK_MULTIGS) @@ -127,21 +126,18 @@ int main(int argc, char *argv[]) return 0; } #endif - - if (!g_Startup.NoGui && (file == NULL)) + + if( !g_Startup.Enabled ) { StartGui(); return 0; } - if (OpenPlugins(file) == -1) return -1; + CDVDsys_ChangeSource( g_Startup.CdvdSource ); + DoCDVDopen( g_Startup.ImageName ); + if (OpenPlugins() == -1) return -1; - SysReset(); - - cpuExecuteBios(); - if (file) strcpy(elfname, file); - if (!efile) efile = GetPS2ElfName(elfname); - loadElfFile(elfname); + SysPrepareExecution( (g_Startup.StartupMode == Startup_FromELF) ? g_Startup.ImageName : NULL, !g_Startup.SkipBios ); return 0; } @@ -332,15 +328,16 @@ void OnLanguage(GtkMenuItem *menuitem, gpointer user_data) void OnFile_RunCD(GtkMenuItem *menuitem, gpointer user_data) { - CDVD = CDVD_plugin; - //SysReset(); + SysReset(); + CDVDsys_ChangeSource( CDVDsrc_Plugin ); + DoCDVDopen( NULL ); SysPrepareExecution(NULL); } void OnFile_RunBIOS(GtkMenuItem *menuitem, gpointer user_data) { - CDVD = NODISC; SysReset(); + CDVDsys_ChangeSource( CDVDsrc_NoDisc ); SysPrepareExecution(NULL, true); } @@ -348,13 +345,13 @@ void OnRunIso_Ok(GtkButton* button, gpointer user_data) { gchar *File; string curdir; - CDVD = ISO; File = (gchar*)gtk_file_selection_get_filename(GTK_FILE_SELECTION(FileSel)); - strcpy(isoFileName, File); gtk_widget_destroy(FileSel); - //SysReset(); + SysReset(); + CDVDsys_ChangeSource( CDVDsrc_Iso ); + DoCDVDopen( FileSel ); SysPrepareExecution( NULL ); } @@ -387,6 +384,9 @@ void OnFile_BlockDump(GtkMenuItem *menuitem, gpointer user_data) SaveConfig(); } +// Currently this OnRunElf function uses the CDVDplugin source. It's also valid to use the +// Iso and NoDisc sources when running ELF files, although those need new menu commands and +// are outside the scope of my GTK capabilities. ;) -- air void OnRunElf_Ok(GtkButton* button, gpointer user_data) { gchar *File; @@ -395,6 +395,9 @@ void OnRunElf_Ok(GtkButton* button, gpointer user_data) strcpy(elfname, File); gtk_widget_destroy(FileSel); + SysReset(); + CDVDsys_ChangeSource( CDVDsrc_Plugin ); + OpenCDVD( NULL ); SysPrepareExecution(elfname); } @@ -407,7 +410,7 @@ void OnFile_LoadElf(GtkMenuItem *menuitem, gpointer user_data) { GtkWidget *Ok, *Cancel; - FileSel = gtk_file_selection_new("Select Psx Elf File"); + FileSel = gtk_file_selection_new("Select PS2 Elf File"); Ok = GTK_FILE_SELECTION(FileSel)->ok_button; gtk_signal_connect(GTK_OBJECT(Ok), "clicked", GTK_SIGNAL_FUNC(OnRunElf_Ok), NULL); diff --git a/pcsx2/Linux/LnxMain.h b/pcsx2/Linux/LnxMain.h index 7639f9f7b6..5359a36afb 100644 --- a/pcsx2/Linux/LnxMain.h +++ b/pcsx2/Linux/LnxMain.h @@ -29,7 +29,7 @@ extern bool applychanges; extern bool Slots[5]; -extern bool ParseCommandLine(int argc, char *argv[], char *file); +extern bool ParseCommandLine(int argc, char *argv[], char **file); extern void MemoryCard_Init(); void OnLanguage(GtkMenuItem *menuitem, gpointer user_data); diff --git a/pcsx2/Linux/LnxSysExec.cpp b/pcsx2/Linux/LnxSysExec.cpp index 2bd55604c5..717a3cfeae 100644 --- a/pcsx2/Linux/LnxSysExec.cpp +++ b/pcsx2/Linux/LnxSysExec.cpp @@ -87,74 +87,137 @@ __noinline void SysPageFaultExceptionFilter( int signal, siginfo_t *info, void * mmap_ClearCpuBlock( offset & ~m_pagemask ); } -bool ParseCommandLine(int argc, char *argv[], char *file) +#define CmdSwitchIs( text ) ( stricmp( token, text ) == 0 ) + +bool ParseCommandLine(int argc, const char *argv[]) { int i = 1; - g_Startup.BootMode = BootMode_Bios; + g_Startup.Enabled = false; + g_Startup.NoGui = false; + g_Startup.ImageName = NULL; + g_Startup.ElfFile = NULL; + + g_Startup.StartupMode = Startup_FromCDVD; + g_Startup.SkipBios = true; + g_Startup.CdvdSource = CDVDsrc_Plugin; + + bool _legacy_ForceElfLoad = false; + while (i < argc) { - char* token = argv[i++]; + const char* token = argv[i++]; - if (stricmp(token, "-help") == 0 || stricmp(token, "--help") == 0 || stricmp(token, "-h") == 0) + if (CmdSwitchIs("-help") || CmdSwitchIs("--help") || CmdSwitchIs("-h")) { //Msgbox::Alert( phelpmsg ); return false; } - else if (stricmp(token, "-nogui") == 0) + else if (CmdSwitchIs("-nogui")) { - g_Startup.NoGui = FALSE; + g_Startup.NoGui = true; + g_Startup.Enabled = true; } - else if (stricmp(token, "-loadgs") == 0) + else if( CmdSwitchIs( "skipbios" ) ) { + g_Startup.SkipBios = true; + } + else if( CmdSwitchIs( "nodisc" ) ) { + g_Startup.CdvdSource = CDVDsrc_NoDisc; + g_Startup.Enabled = true; + } + else if( CmdSwitchIs( "usecd" ) ) { + g_Startup.CdvdSource = CDVDsrc_Plugin; + g_Startup.Enabled = true; + } + else if( CmdSwitchIs( "elf" ) ) { + g_Startup.StartupMode = Startup_FromELF; + token = argv[i++]; + g_Startup.ElfFile = token; + g_Startup.Enabled = true; + } + + // depreciated command switch + else if (CmdSwitchIs("-bootmode")) + { + token = argv[i++]; + int mode = atoi( token ); + g_Startup.Enabled = true; + g_Startup.SkipBios = !( mode & 0x10000 ); + switch( mode & 0xf ) + { + case 0: + g_Startup.CdvdSource = CDVDsrc_Plugin; + break; + + case 1: + _legacy_ForceElfLoad = true; + break; + + case 2: + g_Startup.CdvdSource = CDVDsrc_Iso; + break; + + case 3: + g_Startup.CdvdSource = CDVDsrc_NoDisc; + break; + } + } + + else if (CmdSwitchIs("-loadgs")) { g_pRunGSState = argv[i++]; } - else if( strcmp(token, "-bootmode" ) == 0) - { - token = argv[i++]; - g_Startup.BootMode = (StartupMode)atoi( token); - g_Startup.Enabled = true; - } - else if (stricmp(token, "-gs") == 0) + else if (CmdSwitchIs("-gs")) { token = argv[i++]; g_Startup.gsdll = token; } - else if (stricmp(token, "-cdvd") == 0) + else if (CmdSwitchIs("-cdvd")) { token = argv[i++]; g_Startup.cdvddll = token; } - else if (stricmp(token, "-spu") == 0) + else if (CmdSwitchIs("-spu")) { token = argv[i++]; g_Startup.spudll = token; } - else if (stricmp(token, "-pad") == 0) + else if (CmdSwitchIs("-pad")) { token = argv[i++]; g_Startup.pad1dll = token; g_Startup.pad2dll = token; } - else if (stricmp(token, "-pad1") == 0) + else if (CmdSwitchIs("-pad1")) { token = argv[i++]; g_Startup.pad1dll = token; } - else if (stricmp(token, "-pad2") == 0) + else if (CmdSwitchIs("-pad2")) { token = argv[i++]; g_Startup.pad2dll = token; } - else if (stricmp(token, "-loadgs") == 0) + else if (CmdSwitchIs("-loadgs")) { token = argv[i++]; g_pRunGSState = token; } else { - file = token; - printf("opening file %s\n", file); + printf("opening file %s\n", token); + + g_Startup.ImageName = token; + g_Startup.Enabled = true; + g_Startup.CdvdSource = CDVDsrc_Iso; + + if( _legacy_ForceElfLoad ) + { + // This retains compatibility with the older Bootmode switch. + g_Startup.ElfFile = file; + g_Startup.StartupMode = Startup_FromELF; + g_Startup.CdvdSource = CDVDsrc_Plugin; + } } } return true; diff --git a/pcsx2/windows/WinSysExec.cpp b/pcsx2/windows/WinSysExec.cpp index 0b2f3b350d..2ec664b52e 100644 --- a/pcsx2/windows/WinSysExec.cpp +++ b/pcsx2/windows/WinSysExec.cpp @@ -140,6 +140,7 @@ int ParseCommandLine( int tokenCount, TCHAR *const *const tokens ) else if( CmdSwitchIs( "elf" ) ) { g_Startup.StartupMode = Startup_FromELF; g_Startup.ElfFile = param; + g_Startup.Enabled = true; } else if( CmdSwitchIs( "loadgs" ) ) {