X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=maemo%2Fmain.c;h=45317040c5950cdafa2969a2e1eab23ae45f0aab;hp=90a55a90b7cf805cf65da19d07a0aee0d0abd731;hb=d84e376741b37109597cb3a08d31def4de3fc598;hpb=b7b2fb4165eee505bc05cbf23309bb5ed4289494 diff --git a/maemo/main.c b/maemo/main.c index 90a55a90..45317040 100644 --- a/maemo/main.c +++ b/maemo/main.c @@ -7,98 +7,33 @@ #include #include -#include -#include -#include -#include +#include #include -#include #include "main.h" -#include "plugin.h" -#include "pcnt.h" #include "menu.h" +#include "plugin.h" +#include "plugin_lib.h" #include "../libpcsxcore/misc.h" -#include "../plugins/cdrcimg/cdrcimg.h" -#include "common/plat.h" -#include "common/input.h" - -int ready_to_go; -unsigned long gpuDisp; -char cfgfile_basename[MAXPATHLEN]; -static char *(*real_getenv)(const char *name); - -static void make_path(char *buf, size_t size, const char *dir, const char *fname) -{ - if (fname) - snprintf(buf, size, ".%s%s", dir, fname); - else - snprintf(buf, size, ".%s", dir); -} -#define MAKE_PATH(buf, dir, fname) \ - make_path(buf, sizeof(buf), dir, fname) - -static void create_profile_dir(const char *directory) { - char path[MAXPATHLEN]; - - MAKE_PATH(path, directory, NULL); - mkdir(path, S_IRWXU | S_IRWXG); -} - -static void CheckSubDir() { - // make sure that ~/.pcsx exists - create_profile_dir(PCSX_DOT_DIR); - - create_profile_dir(BIOS_DIR); - create_profile_dir(MEMCARD_DIR); - create_profile_dir(STATES_DIR); - create_profile_dir(PLUGINS_DIR); - create_profile_dir(PLUGINS_CFG_DIR); - create_profile_dir(CHEATS_DIR); - create_profile_dir(PATCHES_DIR); - create_profile_dir(PCSX_DOT_DIR "cfg"); -} - -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"); - } -} - -// from softgpu plugin -extern int iUseDither; -extern int UseFrameSkip; -extern int UseFrameLimit; -extern uint32_t dwActFixes; -extern float fFrameRateHz; -extern int dwFrameRateTicks; +#include "../libpcsxcore/new_dynarec/new_dynarec.h" +#include "../plugins/dfinput/main.h" +#include "maemo_common.h" // sound plugin -extern int iUseReverb; -extern int iUseInterpolation; -extern int iXAPitch; -extern int iSPUIRQWait; extern int iUseTimer; +int g_opts = OPT_SHOWFPS; +int g_maemo_opts; +char file_name[MAXPATHLEN]; + +enum sched_action emu_action; +void do_emu_action(void); + static void ChangeWorkingDirectory(char *exe) { - s8 exepath[1024]; - s8* s; - sprintf(exepath, "%s", exe); + char exepath[1024]; + char *s; + snprintf(exepath, sizeof(exepath), "%s", exe); s = strrchr(exepath, '/'); if (s != NULL) { *s = '\0'; @@ -106,54 +41,19 @@ static void ChangeWorkingDirectory(char *exe) } } -int main(int argc, char *argv[]) +int maemo_main(int argc, char **argv) { ChangeWorkingDirectory("c"); char file[MAXPATHLEN] = ""; char path[MAXPATHLEN]; 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); - - memset(&Config, 0, sizeof(PcsxConfig)); - strcpy(Config.Net, "Disabled"); - - CheckSubDir(); - - MAKE_PATH(Config.Mcd1, MEMCARD_DIR, "card1.mcd"); - MAKE_PATH(Config.Mcd2, MEMCARD_DIR, "card2.mcd"); - strcpy(Config.Bios, "HLE"); strcpy(Config.BiosDir, "/home/user/MyDocs"); - - - Config.PsxAuto = 1; - strcpy(Config.PluginsDir, "/opt/maemo/usr/games/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"); - + snprintf(Config.PatchesDir, sizeof(Config.PatchesDir), "/opt/maemo/usr/games" PATCHES_DIR); + Config.PsxAuto = 1; // read command line options for (i = 1; i < argc; i++) { @@ -161,7 +61,6 @@ int main(int argc, char *argv[]) else if (!strcmp(argv[i], "-load")) loadst = atol(argv[++i]); else if (!strcmp(argv[i], "-cdfile")) { char isofilename[MAXPATHLEN]; - if (i+1 >= argc) break; strncpy(isofilename, argv[++i], MAXPATHLEN); if (isofilename[0] != '/') { @@ -173,93 +72,44 @@ int main(int argc, char *argv[]) } else isofilename[0] = 0; } - cdfile = isofilename; } - else if (!strcmp(argv[i],"-frameskip")){ - - int tv_reg=atol(argv[++i]); - if (tv_reg>0){ - UseFrameSkip=1; - fFrameRateHz = (tv_reg==1)?50.0f: 59.94f; - dwFrameRateTicks = (100000*100 / (unsigned long)(fFrameRateHz*100)); - } - } - else if (!strcmp(argv[i],"-sputhreaded")){ - iUseTimer=1; - } - else if (!strcmp(argv[i],"-nosound")){ - strcpy(Config.Spu, "spunull.so"); - } - else if(!strcmp(argv[i], "-bdir")) sprintf(Config.BiosDir, "%s", argv[++i]); - else if(!strcmp(argv[i], "-bios")) sprintf(Config.Bios, "%s", argv[++i]); - else if (!strcmp(argv[i],"-gles")){ - strcpy(Config.Gpu, "gpuGLES.so"); + else if (!strcmp(argv[i],"-frameskip")) { + int tv_reg = atol(argv[++i]); + if (tv_reg > 0) + pl_rearmed_cbs.frameskip = -1; } + else if (!strcmp(argv[i],"-fullscreen")) g_maemo_opts |= 2; + else if (!strcmp(argv[i],"-accel")) g_maemo_opts |= 4; + else if (!strcmp(argv[i],"-sputhreaded")) iUseTimer=1; + else if (!strcmp(argv[i],"-nosound")) strcpy(Config.Spu, "spunull.so"); + else if (!strcmp(argv[i], "-bdir")) sprintf(Config.BiosDir, "%s", argv[++i]); + else if (!strcmp(argv[i], "-bios")) sprintf(Config.Bios, "%s", argv[++i]); + else if (!strcmp(argv[i], "-gles")) strcpy(Config.Gpu, "gpuGLES.so"); else if (!strcmp(argv[i], "-cdda")) Config.Cdda = 1; else if (!strcmp(argv[i], "-xa")) Config.Xa = 1; else if (!strcmp(argv[i], "-rcnt")) Config.RCntFix = 1 ; else if (!strcmp(argv[i], "-sio")) Config.Sio = 1; else if (!strcmp(argv[i], "-spuirq")) Config.SpuIrq = 1; else if (!strcmp(argv[i], "-vsync")) Config.VSyncWA = 1; - else if (!strcmp(argv[i], "-h") || - !strcmp(argv[i], "-help") || - !strcmp(argv[i], "--help")) { - printf(PACKAGE_NAME " " PACKAGE_VERSION "\n"); - printf("%s\n", _( - " pcsx [options] [file]\n" - "\toptions:\n" - "\t-cdfile FILE\tRuns a CD image file\n" - "\t-psxout\t\tEnable PSX output\n" - "\t-nosound\t\tDisable sound using spunull plugin\n" - "\t-sputhreaded\t\tMove sound to separate thread\n" - "\t-frameskip\t\tEnable frameskip\n" - "\t-load STATENUM\tLoads savestate STATENUM (1-5)\n" - "\t-h -help\tDisplay this message\n" - "\tfile\t\tLoads file\n")); - return 0; - } else { - strncpy(file, argv[i], MAXPATHLEN); - if (file[0] != '/') { - getcwd(path, MAXPATHLEN); - if (strlen(path) + strlen(file) + 1 < MAXPATHLEN) { - strcat(path, "/"); - strcat(path, file); - strcpy(file, path); - } else - file[0] = 0; - } - } } - - - - snprintf(Config.PatchesDir, sizeof(Config.PatchesDir), "/opt/maemo/usr/games" PATCHES_DIR); -/* - // switch to plugin dotdir - // this lets plugins work without modification! - gchar *plugin_default_dir = g_build_filename(getenv("HOME"), PLUGINS_DIR, NULL); - chdir(plugin_default_dir); - g_free(plugin_default_dir); -*/ - hildon_init(&argc, &argv); - if (cdfile) + if (cdfile) { set_cd_image(cdfile); + strcpy(file_name, strrchr(cdfile,'/')); + } if (SysInit() == -1) return 1; - // frontend stuff - + pl_init(); if (LoadPlugins() == -1) { SysMessage("Failed loading plugins!"); return 1; } - pcnt_hook_plugins(); if (OpenPlugins() == -1) { return 1; @@ -283,321 +133,38 @@ int main(int argc, char *argv[]) } } + if (!ready_to_go) { + printf ("something goes wrong, maybe you forgot -cdfile ? \n"); + return 1; + } + // If a state has been specified, then load that if (loadst) { - char state_filename[MAXPATHLEN]; - int ret = get_state_filename(state_filename, sizeof(state_filename), loadst - 1); - if (ret == 0) - ret = LoadState(state_filename); - printf("%s state %s\n", ret ? "failed to load" : "loaded", state_filename); + int ret = emu_load_state(loadst - 1); + printf("%s state %d\n", ret ? "failed to load" : "loaded", loadst); } + maemo_init(&argc, &argv); - if (ready_to_go) - maemo_init(); - else - { - printf ("somethings goes wrong, maybe you forgot -cdfile ? \n"); - exit(0); + if (GPU_open != NULL) { + int ret = GPU_open(&gpuDisp, "PCSX", NULL); + if (ret) + fprintf(stderr, "Warning: GPU_open returned %d\n", ret); } + dfinput_activate(); + pl_timing_prepare(Config.PsxType); + while (1) + { + stop = 0; + emu_action = SACTION_NONE; psxCpu->Execute(); - - - return 0; -} - -int SysInit() { - if (EmuInit() == -1) { - printf("PSX emulator couldn't be initialized.\n"); - return -1; - } - - LoadMcds(Config.Mcd1, Config.Mcd2); /* TODO Do we need to have this here, or in the calling main() function?? */ - - if (Config.Debug) { - StartDebugger(); - } - - return 0; -} - -void SysRunGui() { - printf("SysRunGui\n"); -} - -void StartGui() { - printf("StartGui\n"); -} - -void SysReset() { - EmuReset(); - - // hmh core forgets this - CDR_stop(); -} - -void SysClose() { - EmuShutdown(); - ReleasePlugins(); - - StopDebugger(); - - if (emuLog != NULL) fclose(emuLog); -} - -void SysUpdate() { -} - -void OnFile_Exit() { - printf("OnFile_Exit\n"); - plat_finish(); - SysClose(); - exit(0); -} - -int get_state_filename(char *buf, int size, int i) { - char trimlabel[33]; - int j; - - strncpy(trimlabel, CdromLabel, 32); - trimlabel[32] = 0; - for (j = 31; j >= 0; j--) - if (trimlabel[j] == ' ') - trimlabel[j] = 0; - else - continue; - - snprintf(buf, size, "." STATES_DIR "%.32s-%.9s.%3.3d", - trimlabel, CdromId, i); - - return 0; -} - -void SysPrintf(const char *fmt, ...) { - va_list list; - char msg[512]; - - va_start(list, fmt); - vsprintf(msg, fmt, list); - va_end(list); - - fprintf(emuLog, "%s", msg); -} - -void SysMessage(const char *fmt, ...) { - va_list list; - char msg[512]; - - va_start(list, fmt); - vsprintf(msg, fmt, list); - va_end(list); - - if (msg[strlen(msg) - 1] == '\n') - msg[strlen(msg) - 1] = 0; - - fprintf(stderr, "%s\n", msg); -} - -static void SignalExit(int sig) { - ClosePlugins(); - OnFile_Exit(); -} - -#define PARSEPATH(dst, src) \ - ptr = src + strlen(src); \ - while (*ptr != '\' && ptr != src) ptr--; \ - if (ptr != src) { \ - strcpy(dst, ptr+1); \ - } - -static int _OpenPlugins(void) { - int ret; - - signal(SIGINT, SignalExit); - signal(SIGPIPE, SignalExit); - - GPU_clearDynarec(clearDynarec); - - ret = CDR_open(); - if (ret < 0) { SysMessage(_("Error opening CD-ROM plugin!")); return -1; } - ret = SPU_open(); - if (ret < 0) { SysMessage(_("Error opening SPU plugin!")); return -1; } - SPU_registerCallback(SPUirq); - // pcsx-rearmed: we handle gpu elsewhere - //ret = GPU_open(&gpuDisp, "PCSX", NULL); - //if (ret < 0) { SysMessage(_("Error opening GPU plugin!")); return -1; } - ret = PAD1_open(&gpuDisp); - if (ret < 0) { SysMessage(_("Error opening Controller 1 plugin!")); return -1; } - ret = PAD2_open(&gpuDisp); - if (ret < 0) { SysMessage(_("Error opening Controller 2 plugin!")); return -1; } - - if (Config.UseNet && !NetOpened) { - netInfo info; - char path[MAXPATHLEN]; - char dotdir[MAXPATHLEN]; - - MAKE_PATH(dotdir, "/.pcsx/plugins/", NULL); - - strcpy(info.EmuName, "PCSX " PACKAGE_VERSION); - strncpy(info.CdromID, CdromId, 9); - strncpy(info.CdromLabel, CdromLabel, 9); - info.psxMem = psxM; - info.GPU_showScreenPic = GPU_showScreenPic; - info.GPU_displayText = GPU_displayText; - info.GPU_showScreenPic = GPU_showScreenPic; - info.PAD_setSensitive = PAD1_setSensitive; - sprintf(path, "%s%s", Config.BiosDir, Config.Bios); - strcpy(info.BIOSpath, path); - strcpy(info.MCD1path, Config.Mcd1); - strcpy(info.MCD2path, Config.Mcd2); - sprintf(path, "%s%s", dotdir, Config.Gpu); - strcpy(info.GPUpath, path); - sprintf(path, "%s%s", dotdir, Config.Spu); - strcpy(info.SPUpath, path); - sprintf(path, "%s%s", dotdir, Config.Cdr); - strcpy(info.CDRpath, path); - NET_setInfo(&info); - - ret = NET_open(&gpuDisp); - if (ret < 0) { - if (ret == -2) { - // -2 is returned when something in the info - // changed and needs to be synced - char *ptr; - - PARSEPATH(Config.Bios, info.BIOSpath); - PARSEPATH(Config.Gpu, info.GPUpath); - PARSEPATH(Config.Spu, info.SPUpath); - PARSEPATH(Config.Cdr, info.CDRpath); - - strcpy(Config.Mcd1, info.MCD1path); - strcpy(Config.Mcd2, info.MCD2path); - return -2; - } else { - Config.UseNet = FALSE; - } - } else { - if (NET_queryPlayer() == 1) { - if (SendPcsxInfo() == -1) Config.UseNet = FALSE; - } else { - if (RecvPcsxInfo() == -1) Config.UseNet = FALSE; - } - } - NetOpened = TRUE; - } else if (Config.UseNet) { - NET_resume(); + if (emu_action != SACTION_NONE) + do_emu_action(); } return 0; } -int OpenPlugins() { - int ret; - - while ((ret = _OpenPlugins()) == -2) { - ReleasePlugins(); - LoadMcds(Config.Mcd1, Config.Mcd2); - if (LoadPlugins() == -1) return -1; - } - return ret; -} - -void ClosePlugins() { - int ret; - - signal(SIGINT, SIG_DFL); - signal(SIGPIPE, SIG_DFL); - ret = CDR_close(); - if (ret < 0) { SysMessage(_("Error closing CD-ROM plugin!")); return; } - ret = SPU_close(); - if (ret < 0) { SysMessage(_("Error closing SPU plugin!")); return; } - ret = PAD1_close(); - if (ret < 0) { SysMessage(_("Error closing Controller 1 Plugin!")); return; } - ret = PAD2_close(); - if (ret < 0) { SysMessage(_("Error closing Controller 2 plugin!")); return; } - // pcsx-rearmed: we handle gpu elsewhere - //ret = GPU_close(); - //if (ret < 0) { SysMessage(_("Error closing GPU plugin!")); return; } - - if (Config.UseNet) { - NET_pause(); - } -} - -#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, '/'); - void *ret; - int i; - - printf("plugin: %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]); - } - -#if defined(__x86_64__) || defined(__i386__) - // convenience hack - char name[MAXPATHLEN]; - snprintf(name, sizeof(name), "%s.x86", lib); - lib = name; -#endif - - ret = dlopen(lib, RTLD_NOW); - if (ret == NULL) - fprintf(stderr, "dlopen: %s\n", dlerror()); - return ret; -} - -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); -} - -const char *SysLibError() { - return dlerror(); -} - -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); -} -