refactoring for Wiz port; random cleanups
[libpicofe.git] / gp2x / main.c
index 23d6241..2eed35b 100644 (file)
@@ -4,13 +4,17 @@
 // For commercial use, separate licencing terms must be obtained.\r
 \r
 #include <stdio.h>\r
+#include <stdlib.h>\r
 #include <string.h>\r
 #include <unistd.h>\r
 #include <strings.h>\r
 #include <linux/limits.h>\r
 \r
-#include "gp2x.h"\r
-#include "menu.h"\r
+#include "../common/menu.h"\r
+#include "../common/emu.h"\r
+#include "../common/config.h"\r
+#include "../common/input.h"\r
+#include "../common/plat.h"\r
 #include "emu.h"\r
 #include "940ctl.h"\r
 #include "version.h"\r
@@ -19,9 +23,8 @@
 #include "cpuctrl.h"\r
 \r
 \r
-extern char *ext_menu, *ext_state;\r
-extern int select_exits;\r
 extern char *PicoConfigFile;\r
+static int load_state_slot = -1;\r
 int mmuhack_status = 0;\r
 char **g_argv;\r
 \r
@@ -29,21 +32,15 @@ void parse_cmd_line(int argc, char *argv[])
 {\r
        int x, unrecognized = 0;\r
 \r
-       for(x = 1; x < argc; x++)\r
+       for (x = 1; x < argc; x++)\r
        {\r
-               if(argv[x][0] == '-')\r
+               if (argv[x][0] == '-')\r
                {\r
-                       if(strcasecmp(argv[x], "-menu") == 0) {\r
-                               if(x+1 < argc) { ++x; ext_menu = argv[x]; } /* External Frontend: Program Name */\r
+                       if (strcasecmp(argv[x], "-config") == 0) {\r
+                               if (x+1 < argc) { ++x; PicoConfigFile = argv[x]; }\r
                        }\r
-                       else if(strcasecmp(argv[x], "-state") == 0) {\r
-                               if(x+1 < argc) { ++x; ext_state = argv[x]; } /* External Frontend: Arguments */\r
-                       }\r
-                       else if(strcasecmp(argv[x], "-config") == 0) {\r
-                               if(x+1 < argc) { ++x; PicoConfigFile = argv[x]; }\r
-                       }\r
-                       else if(strcasecmp(argv[x], "-selectexit") == 0) {\r
-                               select_exits = 1;\r
+                       else if (strcasecmp(argv[x], "-loadstate") == 0) {\r
+                               if (x+1 < argc) { ++x; load_state_slot = atoi(argv[x]); }\r
                        }\r
                        else {\r
                                unrecognized = 1;\r
@@ -52,9 +49,9 @@ void parse_cmd_line(int argc, char *argv[])
                } else {\r
                        /* External Frontend: ROM Name */\r
                        FILE *f;\r
-                       strncpy(romFileName, argv[x], PATH_MAX);\r
-                       romFileName[PATH_MAX-1] = 0;\r
-                       f = fopen(romFileName, "rb");\r
+                       strncpy(rom_fname_reload, argv[x], sizeof(rom_fname_reload));\r
+                       rom_fname_reload[sizeof(rom_fname_reload) - 1] = 0;\r
+                       f = fopen(rom_fname_reload, "rb");\r
                        if (f) fclose(f);\r
                        else unrecognized = 1;\r
                        engineState = PGS_ReloadRom;\r
@@ -63,14 +60,11 @@ void parse_cmd_line(int argc, char *argv[])
        }\r
 \r
        if (unrecognized) {\r
-               printf("\n\n\nPicoDrive v" VERSION " (c) notaz, 2006\n");\r
+               printf("\n\n\nPicoDrive v" VERSION " (c) notaz, 2006-2009\n");\r
                printf("usage: %s [options] [romfile]\n", argv[0]);\r
-               printf( "options:\n"\r
-                               "-menu <menu_path> launch a custom program on exit instead of default gp2xmenu\n"\r
-                               "-state <param>    pass '-state param' to the menu program\n"\r
-                               "-config <file>    use specified config file instead of default 'picoconfig.bin'\n"\r
-                               "                  see currentConfig_t structure in emu.h for the file format\n"\r
-                               "-selectexit       pressing SELECT will exit the emu and start 'menu_path'\n");\r
+               printf("options:\n"\r
+                       " -config <file>    use specified config file instead of default 'config.cfg'\n"\r
+                       " -loadstate <num>  if ROM is specified, try loading slot <num>\n");\r
        }\r
 }\r
 \r
@@ -79,16 +73,22 @@ int main(int argc, char *argv[])
 {\r
        g_argv = argv;\r
 \r
-       emu_ReadConfig(0);\r
-       gp2x_init();\r
+       /* in_init() must go before config, config accesses in_ fwk */\r
+       in_init();\r
+       emu_prepareDefaultConfig();\r
+       emu_ReadConfig(0, 0);\r
+       config_readlrom(PicoConfigFile);\r
+\r
+       plat_init();\r
+       in_probe();\r
+       in_debug_dump();\r
+\r
        if (currentConfig.EmuOpt&0x10) {\r
                int ret = mmuhack();\r
                printf("squidge hack code finished and returned %i\n", ret); fflush(stdout);\r
                mmuhack_status = ret;\r
        }\r
        cpuctrl_init();\r
-       // Reset940(1);\r
-       // Pause940(1);\r
        if (currentConfig.EmuOpt&0x100) {\r
                printf("setting RAM timings.. "); fflush(stdout);\r
                // craigix: --trc 6 --tras 4 --twr 1 --tmrd 1 --trfc 1 --trp 2 --trcd 2\r
@@ -97,12 +97,24 @@ int main(int argc, char *argv[])
        }\r
        sharedmem_init();\r
        emu_Init();\r
+       menu_init();\r
 \r
        engineState = PGS_Menu;\r
 \r
        if (argc > 1)\r
                parse_cmd_line(argc, argv);\r
 \r
+       if (engineState == PGS_ReloadRom)\r
+       {\r
+               if (emu_ReloadRom(rom_fname_reload)) {\r
+                       engineState = PGS_Running;\r
+                       if (load_state_slot >= 0) {\r
+                               state_slot = load_state_slot;\r
+                               emu_SaveLoadGame(1, 0);\r
+                       }\r
+               }\r
+       }\r
+\r
        for (;;)\r
        {\r
                switch (engineState)\r
@@ -112,7 +124,7 @@ int main(int argc, char *argv[])
                                break;\r
 \r
                        case PGS_ReloadRom:\r
-                               if (emu_ReloadRom())\r
+                               if (emu_ReloadRom(rom_fname_reload))\r
                                        engineState = PGS_Running;\r
                                else {\r
                                        printf("PGS_ReloadRom == 0\n");\r
@@ -120,6 +132,9 @@ int main(int argc, char *argv[])
                                }\r
                                break;\r
 \r
+                       case PGS_RestartRun:\r
+                               engineState = PGS_Running;\r
+\r
                        case PGS_Running:\r
                                emu_Loop();\r
                                break;\r
@@ -138,8 +153,8 @@ int main(int argc, char *argv[])
        emu_Deinit();\r
        sharedmem_deinit();\r
        cpuctrl_deinit();\r
-       gp2x_deinit();\r
-       if(mmuhack_status)\r
+       plat_finish();\r
+       if (mmuhack_status)\r
                mmuunhack();\r
 \r
        return 0;\r