gpulib: use more conservative loop detection
[pcsx_rearmed.git] / maemo / main.c
index 90a55a9..85db400 100644 (file)
@@ -7,98 +7,44 @@
 
 #include <stdio.h>
 #include <string.h>
-#include <stdarg.h>
-#include <dlfcn.h>
-#include <sys/stat.h>
-#include <sys/types.h>
+#include <stdint.h>
 #include <unistd.h>
-#include <signal.h>
 
-#include "main.h"
-#include "plugin.h"
-#include "pcnt.h"
-#include "menu.h"
+#include "../frontend/main.h"
+#include "../frontend/menu.h"
+#include "../frontend/plugin.h"
+#include "../frontend/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;
-
-// sound plugin
-extern int iUseReverb;
-extern int iUseInterpolation;
-extern int iXAPitch;
-extern int iSPUIRQWait;
-extern int iUseTimer;
+#include "../libpcsxcore/cdriso.h"
+#include "../libpcsxcore/new_dynarec/new_dynarec.h"
+#include "../plugins/dfinput/main.h"
+#include "../plugins/dfsound/spu_config.h"
+#include "maemo_common.h"
+
+extern int in_enable_vibration;
+extern int cycle_multiplier;
+extern int in_type1, in_type2;
+
+accel_option accelOptions;
+int ready_to_go, g_emu_want_quit, g_emu_resetting;
+int g_menuscreen_w, g_menuscreen_h;
+int g_scaler, soft_filter;
+int g_opts = 0;
+int g_maemo_opts;
+int cornerActions[4] = {0,0,0,0};
+int bKeepDisplayOn = FALSE;
+int bAutosaveOnExit = FALSE;
+char file_name[MAXPATHLEN];
+char keys_config_file[MAXPATHLEN] = "/opt/psx4m/keys";
+
+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,62 +52,165 @@ static void ChangeWorkingDirectory(char *exe)
        }
 }
 
-int main(int argc, char *argv[])
+void PrintHelp()
+{
+       printf("PCSX-ReARMed version %s for Maemo\n\n", PACKAGE_VERSION);
+
+       printf("Usage:\n");
+       printf("  pcsx [options] -cdfile FILE\n\n");
+
+       printf("Options:\n");
+       printf("  -help          : This help\n");
+       printf("  -disc VALUE    : Disc number for multi discs images\n");
+       printf("  -fullscreen    : Run fullscreen\n");
+       printf("  -frameskip     : Frameskip\n");
+       printf("                   -1=Auto (Default)\n");
+       printf("                    0=Disabled\n");
+       printf("                    1=Set to 1\n");
+       printf("                    ...\n");
+       printf("  -autosave      : Enable auto save on exit\n");
+       printf("  -accel         : Enable accelerometer\n");
+       printf("  -analog        : Use analog pad for accel\n");
+       printf("  -vibration     : Activate vibration\n");
+       printf("  -sens VALUE    : Set accelerometer sens [0-1000]\n");
+    printf("                   (Default 150)\n");
+       printf("  -ydef VALUE    : Set accelerometer y zero [0-1000]\n");
+    printf("                   (Default 500)\n");
+       printf("  -max VALUE     : Set accelerometer max value[0-1000]\n");
+    printf("                   (Default 500)\n");
+       printf("  -nosound       : No sound output\n");
+       printf("  -bdir PATH     : Set the bios path\n");
+       printf("  -pdir PATH     : Set the plugins path\n");
+       printf("  -bios          : Set the bios\n");
+       printf("  -cdda          : Disable CD Audio for a performance boost\n");
+       printf("  -xa            : Disables XA sound, which can sometimes\n");
+       printf("                   improve performance\n");
+       printf("  -sio           : SIO IRQ Always Enabled\n");
+       printf("  -spuirq        : SPU IRQ Always Enabled\n");
+       printf("  -fps           : Show fps\n");
+       printf("  -cpu           : Show CPU load\n");
+       printf("  -spu           : Show SPU channels\n");
+       printf("  -nofl          : Disable Frame Limiter\n");
+       printf("  -mcd1 FILE     : Set memory card 1 file\n");
+       printf("  -mcd2 FILE     : Set memory card 2 file\n");
+       printf("  -region VALUE  : Set PSX region\n");
+       printf("                   -1=Auto (Default)\n");
+       printf("                    0=NTSC\n");
+       printf("                    1=PAL\n");
+       printf("  -cpuclock VALUE: PSX CPU clock %% [1-500]\n");
+    printf("                   (Default 50)\n");
+       printf("  -displayon     : Prevent display from blanking\n");
+    printf("                   (Default disabled)\n");
+       printf("  -keys FILE     : File with keys configuration\n");
+    printf("                   (Default /opt/psx4m/keys)\n");
+       printf("  -corners VALUE : Define actions for click on the\n");
+    printf("                   display corners\n");
+    printf("                   VALUE is a four digit number, each number\n");
+    printf("                   represent a corner (topleft, topright,\n");
+    printf("                   bottomright and bottomleft\n");
+    printf("                   Actions:\n");
+    printf("                   0=No action\n");
+    printf("                   1=Save\n");
+    printf("                   2=Load\n");
+    printf("                   3=Change slot (+1)\n");
+    printf("                   4=Change slot (-1)\n");
+    printf("                   5=Quit\n");
+       printf("  -guncon        : Set the controller to guncon\n");
+       printf("  -gunnotrigger  : Don't trigger (shoot) when touching screen\n");
+    printf("                   0=Auto (Default)\n");
+    printf("                   1=On\n");
+    printf("                   2=Off\n");
+
+
+       printf("\nGPU Options:\n");
+       printf("  -gles          : Use the GLES plugin (gpu_gles.so)\n");
+       printf("  -oldgpu        : Use the peops plugin (gpu_peops.so)\n");
+       printf("  -unai          : Use the unai plugin (gpu_unai.so)\n");
+
+       printf("\nSound Options:\n");
+       printf("  -spu_reverb VALUE        : Enable/disable reverb [0/1]\n");
+    printf("                             (Default disabled)\n");
+       printf("  -spu_interpolation VALUE : Set interpolation mode\n");
+       printf("                             0=None (Default)\n");
+    printf("                             1=Simple\n");
+       printf("                             2=Gaussian\n");
+       printf("                             3=Cubic\n");
+
+       printf("\nNeon Options (default GPU):\n");
+       printf("  -enhance       : Enable graphic enhancement\n");
+
+       printf("\nGles Options:\n");
+       printf("  -gles_dithering VALUE : Enable/disable dithering [0/1]\n");
+    printf("                          (Default disabled)\n");
+       printf("  -gles_mask VALUE      : Enable/disable mask detect [0/1]\n");
+    printf("                          (Default disabled)\n");
+       printf("  -gles_filtering VALUE : Texture Filtering\n");
+       printf("                          0=None (Default)\n");
+       printf("                          1=Standard\n");
+       printf("                          2=Extended\n");
+       printf("                          3=Standard-sprites\n");
+       printf("                          4=Extended-sprites\n");
+       printf("                          5=Standard+sprites\n");
+       printf("                          6=Extended+sprites\n");
+       printf("  -gles_fbtex VALUE     : Framebuffer Textures\n");
+       printf("                          0=Emulated VRam (Default)\n");
+       printf("                          1=Black\n");
+       printf("                          2=Card\n");
+       printf("                          3=Card+soft\n");
+       printf("  -gles_vram VALUE      : Texture RAM size in MB [4-128]\n");
+    printf("                          (Default 64)\n");
+    printf("  -gles_fastmdec VALUE  : Enable/disable Fast Mdec [0/1]\n");
+    printf("                          (Default disabled)\n");
+    printf("  -gles_advblend VALUE  : Enable/disable Adv. Blend [0/1]\n");
+    printf("                          (Default disabled)\n");
+    printf("  -gles_opaque VALUE    : Enable/disable Opaque Pass [0/1]\n");
+    printf("                          (Default disabled)\n");
+}
+
+int main(int argc, char **argv)
 {
+       if (argc == 1 || (argc == 2 && (!strcmp(argv[1], "--help") || !strcmp(argv[1], "-help") || !strcmp(argv[1], "-h")))) {
+               PrintHelp();
+               return 0;
+       }
+
+       emu_core_preinit();
        ChangeWorkingDirectory("c");
        char file[MAXPATHLEN] = "";
        char path[MAXPATHLEN];
        const char *cdfile = NULL;
        int loadst = 0;
-       void *tmp;
        int i;
+       int getst = -1;
+       int discNumber = 0;
 
-       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");
+       g_menuscreen_w = 800;
+       g_menuscreen_h = 480;
 
-       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.Gpu, "builtin_gpu");
+       strcpy(Config.Spu, "builtin_spu");
        strcpy(Config.BiosDir, "/home/user/MyDocs");
+       strcpy(Config.PluginsDir, "/opt/maemo/usr/games/plugins");
+       snprintf(Config.PatchesDir, sizeof(Config.PatchesDir), "/opt/maemo/usr/games" PATCHES_DIR);
+       Config.PsxAuto = 1;
+       pl_rearmed_cbs.frameskip = -1;
+       strcpy(Config.Bios, "HLE");
+       spu_config.iUseReverb = 1;
+       spu_config.iUseInterpolation = 1;
 
+       in_type1 = PSE_PAD_TYPE_STANDARD;
+       in_type2 = PSE_PAD_TYPE_STANDARD;
+
+       accelOptions.sens     = 150;
+       accelOptions.y_def        = 500;
+       accelOptions.maxValue = 500.0;
 
-       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] != '/') {
@@ -173,93 +222,106 @@ 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],"-frameskip")) {
+                       int tv_reg = atol(argv[++i]);
+                       if (tv_reg < -1)
+                               pl_rearmed_cbs.frameskip = -1;
+                       else
+                               pl_rearmed_cbs.frameskip = tv_reg;
                }
+               else if (!strcmp(argv[i],"-region")) {
+                       int psx_reg = atol(argv[++i]);
+                       if (psx_reg == 0 || psx_reg == 1){
+                               Config.PsxAuto = 0;
+                               Config.PsxType = psx_reg;
+                       }
                }
-               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],"-get_sstatename")) getst = atol(argv[++i]);
+
+               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], "-nosound"))                  strcpy(Config.Spu, "spunull.so");
+               else if (!strcmp(argv[i], "-bdir"))                     sprintf(Config.BiosDir, "%s", argv[++i]);
+               else if (!strcmp(argv[i], "-pdir"))                             sprintf(Config.PluginsDir, "%s", argv[++i]);
+               else if (!strcmp(argv[i], "-bios"))                     sprintf(Config.Bios, "%s", argv[++i]);
+               else if (!strcmp(argv[i], "-gles"))                             { strcpy(Config.Gpu, "gpu_gles.so"); g_maemo_opts |= 8 ;}
+               else if (!strcmp(argv[i], "-oldgpu"))                   strcpy(Config.Gpu, "gpu_peops.so");
+               else if (!strcmp(argv[i], "-unai"))                         strcpy(Config.Gpu, "gpu_unai.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;
+               else if (!strcmp(argv[i], "-fps"))                          g_opts |=OPT_SHOWFPS;
+               else if (!strcmp(argv[i], "-cpu"))                          g_opts |=OPT_SHOWCPU;
+               else if (!strcmp(argv[i], "-spu"))                          g_opts |=OPT_SHOWSPU;
+               else if (!strcmp(argv[i], "-nofl"))                     g_opts |=OPT_NO_FRAMELIM;
+               else if (!strcmp(argv[i], "-mcd1"))                 sprintf(Config.Mcd1, "%s", argv[++i]);
+               else if (!strcmp(argv[i], "-mcd2"))                 sprintf(Config.Mcd2, "%s", argv[++i]);
+
+               else if (!strcmp(argv[i], "-cpuclock"))                 cycle_multiplier = 10000 / atol(argv[++i]);
+               else if (!strcmp(argv[i], "-guncon"))               in_type1 = PSE_PAD_TYPE_GUNCON;
+               else if (!strcmp(argv[i], "-gunnotrigger"))             g_opts |= OPT_TSGUN_NOTRIGGER;
+               else if (!strcmp(argv[i], "-analog"))               in_type1 = PSE_PAD_TYPE_ANALOGPAD;
+               else if (!strcmp(argv[i], "-vibration"))                { in_type1 = PSE_PAD_TYPE_ANALOGPAD; in_enable_vibration = 1; }
+               else if (!strcmp(argv[i], "-sens"))                             accelOptions.sens = atol(argv[++i]);
+               else if (!strcmp(argv[i], "-ydef"))                             accelOptions.y_def = atol(argv[++i]);
+               else if (!strcmp(argv[i], "-max"))                                  accelOptions.maxValue = atol(argv[++i]);
+               else if (!strcmp(argv[i], "-displayon"))                    bKeepDisplayOn = TRUE;
+               else if (!strcmp(argv[i], "-keys"))                             sprintf(keys_config_file, "%s", argv[++i]);
+               else if (!strcmp(argv[i], "-autosave"))                     bAutosaveOnExit = TRUE;
+               else if (!strcmp(argv[i], "-disc"))                     discNumber = atol(argv[++i]);
+               else if (!strcmp(argv[i], "-corners")){
+                       int j = 0;
+                       i++;
+                       char num[2];
+                       for (j=0; j<strlen(argv[i]); j++){
+                               strncpy(num, argv[i] + j, 1);
+                               cornerActions[j] = atoi(num);
                        }
-               }
        }
 
+               else if (!strcmp(argv[i], "-spu_reverb"))               spu_config.iUseReverb = atol(argv[++i]);
+               else if (!strcmp(argv[i], "-spu_interpolation"))        spu_config.iUseInterpolation = atol(argv[++i]);
 
-       
-       
-       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);
+               else if (!strcmp(argv[i], "-enhance"))                  pl_rearmed_cbs.gpu_neon.enhancement_enable = 1;
+               else if (!strcmp(argv[i], "-enhancehack"))              pl_rearmed_cbs.gpu_neon.enhancement_no_main = 1;
 
-       if (SysInit() == -1)
-               return 1;
+               else if (!strcmp(argv[i], "-gles_dithering"))   pl_rearmed_cbs.gpu_peopsgl.bDrawDither = atol(argv[++i]);
+               else if (!strcmp(argv[i], "-gles_mask"))            pl_rearmed_cbs.gpu_peopsgl.iUseMask = atol(argv[++i]);
+               else if (!strcmp(argv[i], "-gles_filtering"))   pl_rearmed_cbs.gpu_peopsgl.iFilterType = atol(argv[++i]);
+               else if (!strcmp(argv[i], "-gles_fbtex"))           pl_rearmed_cbs.gpu_peopsgl.iFrameTexType = atol(argv[++i]);
+               else if (!strcmp(argv[i], "-gles_vram"))            pl_rearmed_cbs.gpu_peopsgl.iVRamSize = atol(argv[++i]);
+               else if (!strcmp(argv[i], "-gles_fastmdec"))    pl_rearmed_cbs.gpu_peopsgl.bUseFastMdec = atol(argv[++i]);
+        else if (!strcmp(argv[i], "-gles_advblend"))   pl_rearmed_cbs.gpu_peopsgl.bAdvancedBlend = atol(argv[++i]);
+        else if (!strcmp(argv[i], "-gles_opaque"))         pl_rearmed_cbs.gpu_peopsgl.bOpaquePass = atol(argv[++i]);
 
-       // frontend stuff
+               else {
+                       fprintf(stderr, "Unknown option: %s\n", argv[i]);
+                       return 1;
+               }
+       }
+       
+       pl_init();
+       if (emu_core_init() == -1)
+               return 1;
        
+       if (cdfile) {
+               set_cd_image(cdfile);
+               strcpy(file_name, strrchr(cdfile,'/'));
+       }
 
        if (LoadPlugins() == -1) {
                SysMessage("Failed loading plugins!");
                return 1;
        }
-       pcnt_hook_plugins();
+
+       if (discNumber > 0)
+               cdrIsoMultidiskSelect = discNumber - 1;
 
        if (OpenPlugins() == -1) {
                return 1;
@@ -267,6 +329,30 @@ int main(int argc, char *argv[])
        plugin_call_rearmed_cbs();
 
        CheckCdrom();
+
+       if (getst >= 0){
+               char fname[MAXPATHLEN];
+
+               get_state_filename(fname, sizeof(fname), getst);
+               printf("SAVESTATE: %s\n", fname);
+               if (cdrIsoMultidiskCount > 1){
+                       int i = 0;
+                       for (i=1; i<cdrIsoMultidiskCount; i++){
+                               cdrIsoMultidiskSelect = i;
+                               CdromId[0] = '\0';
+                               CdromLabel[0] = '\0';
+
+                               CDR_close();
+                               if (CDR_open() == 0){
+                                       CheckCdrom();
+                                       get_state_filename(fname, sizeof(fname), getst);
+                                       printf("SAVESTATE: %s\n", fname);
+                               }
+                       }
+               }
+               return 0;
+       }
+
        SysReset();
 
        if (file[0] != '\0') {
@@ -279,325 +365,54 @@ int main(int argc, char *argv[])
                                printf(_("Could not load CD-ROM!\n"));
                                return -1;
                        }
+                       emu_on_new_cd(0);
                        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;
+       if (!ready_to_go) {
+               printf ("something goes wrong, maybe you forgot -cdfile ? \n");
+               return 1;
        }
 
-       LoadMcds(Config.Mcd1, Config.Mcd2);     /* TODO Do we need to have this here, or in the calling main() function?? */
+       if (cdrIsoMultidiskCount > 1)
+               printf ("Loaded a multidisc image: %i discs.\n", cdrIsoMultidiskCount);
 
-       if (Config.Debug) {
-               StartDebugger();
+       // If a state has been specified, then load that
+       if (loadst) {
+               int ret = emu_load_state(loadst - 1);
+               printf("%s state %d\n", ret ? "Failed to load" : "Loaded", loadst);
+               state_slot = loadst - 1;
        }
 
-       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); \
-       }
+       if (maemo_init(&argc, &argv))
+               return 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;
-                       }
+       if (GPU_open != NULL) {
+               int ret = GPU_open(&gpuDisp, "PCSX", NULL);
+               if (ret){
+                       fprintf(stderr, "Warning: GPU_open returned %d\n", ret);
+                       gpuDisp=ret;
                }
-               NetOpened = TRUE;
-       } else if (Config.UseNet) {
-               NET_resume();
        }
 
-       return 0;
-}
-
-int OpenPlugins() {
-       int ret;
+       if (Config.HLE)
+               printf("Note: running without BIOS, expect compatibility problems\n");
 
-       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();
-       }
-}
+       dfinput_activate();
+       pl_timing_prepare(Config.PsxType);
 
-#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);
+       while (1)
+       {
+               stop = 0;
+               emu_action = SACTION_NONE;
 
-       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]);
+               psxCpu->Execute();
+               if (emu_action != SACTION_NONE)
+                       do_emu_action();
        }
 
-#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);
+       maemo_finish();
+       return 0;
 }