X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=frontend%2Fmain.c;h=372fdf1d7965fa94267fce3412cf71823ad0d810;hp=28446d348aaf465dd431b9624311f9083b648650;hb=47bf65ab6163fb70eb2ad309c9487229832bcaed;hpb=80c2304e511b5463b5046f7ff1c49103c786755f diff --git a/frontend/main.c b/frontend/main.c index 28446d34..372fdf1d 100644 --- a/frontend/main.c +++ b/frontend/main.c @@ -1,3 +1,10 @@ +/* + * (C) notaz, 2010 + * + * This work is licensed under the terms of the GNU GPLv2 or later. + * See the COPYING file in the top-level directory. + */ + #include #include #include @@ -6,10 +13,18 @@ #include #include +#include "plugin.h" +#include "pcnt.h" +#include "menu.h" #include "../gui/Linux.h" #include "../libpcsxcore/misc.h" +#include "../plugins/cdrcimg/cdrcimg.h" +#include "common/plat.h" +#include "common/input.h" +int ready_to_go; int UseGui; +static char *(*real_getenv)(const char *name); static void make_path(char *buf, size_t size, const char *dir, const char *fname) { @@ -53,25 +68,56 @@ static void CreateMemcard(char *filename, char *conf_mcd) { } } +void set_cd_image(const char *fname) +{ + const char *ext; + int len; + + len = strlen(fname); + ext = fname; + if (len > 2) + ext = fname + len - 2; + + if (strcasecmp(ext, ".z") == 0) { + SetIsoFile(NULL); + cdrcimg_set_fname(fname); + strcpy(Config.Cdr, "builtin_cdrcimg"); + } else { + SetIsoFile(fname); + strcpy(Config.Cdr, "builtin_cdr"); + } +} + int main(int argc, char *argv[]) { char file[MAXPATHLEN] = ""; char path[MAXPATHLEN]; - int runcd = 0; + const char *cdfile = NULL; int loadst = 0; + void *tmp; int i; + tmp = dlopen("/lib/libdl.so.2", RTLD_LAZY); + if (tmp == NULL) + tmp = dlopen("/lib32/libdl.so.2", RTLD_LAZY); + if (tmp != NULL) + real_getenv = dlsym(tmp, "getenv"); + if (real_getenv == NULL) { + fprintf(stderr, "%s\n", dlerror()); + return 1; + } + dlclose(tmp); + // what is the name of the config file? // it may be redefined by -cfg on the command line strcpy(cfgfile_basename, "pcsx.cfg"); + emuLog = stdout; SetIsoFile(NULL); - Config.PsxOut = 1; // read command line options for (i = 1; i < argc; i++) { - if (!strcmp(argv[i], "-nogui")) UseGui = FALSE; - else if (!strcmp(argv[i], "-psxout")) Config.PsxOut = 1; + if (!strcmp(argv[i], "-psxout")) Config.PsxOut = 1; else if (!strcmp(argv[i], "-load")) loadst = atol(argv[++i]); else if (!strcmp(argv[i], "-cfg")) { if (i+1 >= argc) break; @@ -93,8 +139,7 @@ int main(int argc, char *argv[]) isofilename[0] = 0; } - SetIsoFile(isofilename); - runcd = 1; + cdfile = isofilename; } else if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "-help") || @@ -131,27 +176,22 @@ int main(int argc, char *argv[]) CheckSubDir(); // ScanAllPlugins(); + strcpy(Config.Bios, "HLE"); + strcpy(Config.BiosDir, "./"); + + strcpy(Config.PluginsDir, "plugins"); + strcpy(Config.Gpu, "builtin_gpu"); + strcpy(Config.Spu, "builtin_spu"); + strcpy(Config.Cdr, "builtin_cdr"); + strcpy(Config.Pad1, "builtin_pad"); + strcpy(Config.Pad2, "builtin_pad"); + // try to load config // if the config file doesn't exist if (LoadConfig() == -1) { // Uh oh, no config file found, use some defaults Config.PsxAuto = 1; - snprintf(Config.BiosDir, sizeof(Config.BiosDir), "." BIOS_DIR); - snprintf(Config.PluginsDir, sizeof(Config.PluginsDir), "." PLUGINS_DIR); - - // Update available plugins, but not GUI - //UpdatePluginsBIOS(); - - // Pick some defaults, if they're available -/* - set_default_plugin(GpuConfS.plist[0], Config.Gpu); - set_default_plugin(SpuConfS.plist[0], Config.Spu); - set_default_plugin(CdrConfS.plist[0], Config.Cdr); - set_default_plugin(Pad1ConfS.plist[0], Config.Pad1); - set_default_plugin(Pad2ConfS.plist[0], Config.Pad2); - set_default_plugin(BiosConfS.plist[0], Config.Bios); -*/ // create & load default memcards if they don't exist CreateMemcard("card1.mcd", Config.Mcd1); CreateMemcard("card2.mcd", Config.Mcd2); @@ -169,52 +209,70 @@ int main(int argc, char *argv[]) chdir(plugin_default_dir); g_free(plugin_default_dir); */ - if (SysInit() == -1) return 1; - // if !gui - { - // the following only occurs if the gui isn't started - if (LoadPlugins() == -1) { - SysMessage("Failed loading plugins!"); - return 1; - } + if (cdfile) + set_cd_image(cdfile); - if (OpenPlugins() == -1) { - return 1; - } + if (SysInit() == -1) + return 1; - SysReset(); - CheckCdrom(); + // frontend stuff + in_init(); + in_probe(); + plat_init(); + menu_init(); - if (file[0] != '\0') { - Load(file); - } else { - if (runcd) { - if (LoadCdrom() == -1) { - ClosePlugins(); - printf(_("Could not load CD-ROM!\n")); - return -1; - } + if (LoadPlugins() == -1) { + SysMessage("Failed loading plugins!"); + return 1; + } + pcnt_hook_plugins(); + + if (OpenPlugins() == -1) { + return 1; + } + + SysReset(); + CheckCdrom(); + + if (file[0] != '\0') { + if (Load(file) != -1) + ready_to_go = 1; + } else { + if (cdfile) { + if (LoadCdrom() == -1) { + ClosePlugins(); + printf(_("Could not load CD-ROM!\n")); + return -1; } + ready_to_go = 1; } + } - // If a state has been specified, then load that - if (loadst) { - StatesC = loadst - 1; - char *state_filename = get_state_filename(StatesC); - LoadState(state_filename); - free(state_filename); - } + // If a state has been specified, then load that + if (loadst) { + StatesC = loadst - 1; + char *state_filename = get_state_filename(StatesC); + int ret = LoadState(state_filename); + printf("%s state %s\n", ret ? "failed to load" : "loaded", state_filename); + free(state_filename); + } + + if (ready_to_go) + menu_prepare_emu(); + else + menu_loop(); + while (1) + { psxCpu->Execute(); + menu_loop(); } return 0; } int SysInit() { - emuLog = stdout; - if (EmuInit() == -1) { printf("PSX emulator couldn't be initialized.\n"); return -1; @@ -339,19 +397,6 @@ void SysPrintf(const char *fmt, ...) { vsprintf(msg, fmt, list); va_end(list); - if (Config.PsxOut) { - static char linestart = 1; - int l = strlen(msg); - - printf(linestart ? " * %s" : "%s", msg); - - if (l > 0 && msg[l - 1] == '\n') { - linestart = 1; - } else { - linestart = 0; - } - } - fprintf(emuLog, "%s", msg); } @@ -369,11 +414,52 @@ void SysMessage(const char *fmt, ...) { fprintf(stderr, "%s\n", msg); } +#if 1 +/* this is to avoid having to hack every plugin to stop using $HOME */ +char *getenv(const char *name) +{ + static char ret[8] = "."; + + if (name && strcmp(name, "HOME") == 0 && + ((int)name >> 28) == 0) // HACK: let libs find home + return ret; + + return real_getenv(name); +} +#endif + +/* we hook statically linked plugins here */ +static const char *builtin_plugins[] = { + "builtin_gpu", "builtin_spu", "builtin_cdr", "builtin_pad", + "builtin_cdrcimg", +}; + +static const int builtin_plugin_ids[] = { + PLUGIN_GPU, PLUGIN_SPU, PLUGIN_CDR, PLUGIN_PAD, + PLUGIN_CDRCIMG, +}; + void *SysLoadLibrary(const char *lib) { + const char *tmp = strrchr(lib, '/'); + int i; + + printf("dlopen %s\n", lib); + if (tmp != NULL) { + tmp++; + for (i = 0; i < ARRAY_SIZE(builtin_plugins); i++) + if (strcmp(tmp, builtin_plugins[i]) == 0) + return (void *)(long)(PLUGIN_DL_BASE + builtin_plugin_ids[i]); + } + return dlopen(lib, RTLD_NOW); } void *SysLoadSym(void *lib, const char *sym) { + unsigned int plugid = (unsigned int)(long)lib; + + if (PLUGIN_DL_BASE <= plugid && plugid < PLUGIN_DL_BASE + ARRAY_SIZE(builtin_plugins)) + return plugin_link(plugid - PLUGIN_DL_BASE, sym); + return dlsym(lib, sym); } @@ -382,6 +468,11 @@ const char *SysLibError() { } void SysCloseLibrary(void *lib) { + unsigned int plugid = (unsigned int)(long)lib; + + if (PLUGIN_DL_BASE <= plugid && plugid < PLUGIN_DL_BASE + ARRAY_SIZE(builtin_plugins)) + return; + dlclose(lib); }