X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=maemo%2Fmain.c;fp=maemo%2Fmain.c;h=90a55a90b7cf805cf65da19d07a0aee0d0abd731;hp=0000000000000000000000000000000000000000;hb=b7b2fb4165eee505bc05cbf23309bb5ed4289494;hpb=5b09a334e068f486786104a80663e189e43b1686 diff --git a/maemo/main.c b/maemo/main.c new file mode 100644 index 00000000..90a55a90 --- /dev/null +++ b/maemo/main.c @@ -0,0 +1,603 @@ +/* + * (C) notaz, 2010-2011 + * + * 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 +#include +#include +#include +#include +#include + +#include "main.h" +#include "plugin.h" +#include "pcnt.h" +#include "menu.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; + +// sound plugin +extern int iUseReverb; +extern int iUseInterpolation; +extern int iXAPitch; +extern int iSPUIRQWait; +extern int iUseTimer; + +static void ChangeWorkingDirectory(char *exe) +{ + s8 exepath[1024]; + s8* s; + sprintf(exepath, "%s", exe); + s = strrchr(exepath, '/'); + if (s != NULL) { + *s = '\0'; + chdir(exepath); + } +} + +int 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"); + + + // read command line options + for (i = 1; i < argc; i++) { + if (!strcmp(argv[i], "-psxout")) Config.PsxOut = 1; + 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] != '/') { + getcwd(path, MAXPATHLEN); + if (strlen(path) + strlen(isofilename) + 1 < MAXPATHLEN) { + strcat(path, "/"); + strcat(path, isofilename); + strcpy(isofilename, path); + } 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], "-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) + set_cd_image(cdfile); + + if (SysInit() == -1) + return 1; + + // frontend stuff + + + if (LoadPlugins() == -1) { + SysMessage("Failed loading plugins!"); + return 1; + } + pcnt_hook_plugins(); + + if (OpenPlugins() == -1) { + return 1; + } + plugin_call_rearmed_cbs(); + + CheckCdrom(); + SysReset(); + + 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) { + 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); + } + + + if (ready_to_go) + maemo_init(); + else + { + printf ("somethings goes wrong, maybe you forgot -cdfile ? \n"); + exit(0); + } + + + + 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(); + } + + 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); +} +