minor frontend fixes
[picodrive.git] / platform / common / main.c
CommitLineData
cff531af 1/*\r
2 * PicoDrive\r
3 * (C) notaz, 2006-2010\r
4 *\r
5 * This work is licensed under the terms of MAME license.\r
6 * See COPYING file in the top-level directory.\r
7 */\r
cc68a136 8\r
9#include <stdio.h>\r
e163b67f 10#include <stdlib.h>\r
cc68a136 11#include <string.h>\r
cc68a136 12#include <strings.h>\r
cc68a136 13\r
e743be20 14#include "../libpicofe/input.h"\r
15#include "../libpicofe/plat.h"\r
16#include "menu_pico.h"\r
cc68a136 17#include "emu.h"\r
c6f91b0e 18#include "version.h"\r
5686d931 19#include <cpu/debug.h>\r
cc68a136 20\r
cc68a136 21\r
cc68a136 22extern char *PicoConfigFile;\r
e163b67f 23static int load_state_slot = -1;\r
cc68a136 24char **g_argv;\r
25\r
26void parse_cmd_line(int argc, char *argv[])\r
27{\r
28 int x, unrecognized = 0;\r
29\r
42171343 30 for (x = 1; x < argc; x++)\r
cc68a136 31 {\r
42171343 32 if (argv[x][0] == '-')\r
cc68a136 33 {\r
42171343 34 if (strcasecmp(argv[x], "-config") == 0) {\r
35 if (x+1 < argc) { ++x; PicoConfigFile = argv[x]; }\r
cc68a136 36 }\r
d438a8dd 37 else if (strcasecmp(argv[x], "-loadstate") == 0\r
38 || strcasecmp(argv[x], "-load") == 0)\r
39 {\r
42171343 40 if (x+1 < argc) { ++x; load_state_slot = atoi(argv[x]); }\r
e163b67f 41 }\r
5686d931 42 else if (strcasecmp(argv[x], "-pdb") == 0) {\r
43 if (x+1 < argc) { ++x; pdb_command(argv[x]); }\r
44 }\r
45 else if (strcasecmp(argv[x], "-pdb_connect") == 0) {\r
46 if (x+2 < argc) { pdb_net_connect(argv[x+1], argv[x+2]); x += 2; }\r
47 }\r
cc68a136 48 else {\r
49 unrecognized = 1;\r
50 break;\r
51 }\r
52 } else {\r
636d5f25 53 FILE *f = fopen(argv[x], "rb");\r
54 if (f) {\r
55 fclose(f);\r
56 rom_fname_reload = argv[x];\r
57 engineState = PGS_ReloadRom;\r
58 }\r
59 else\r
60 unrecognized = 1;\r
cc68a136 61 break;\r
62 }\r
63 }\r
64\r
65 if (unrecognized) {\r
636d5f25 66 printf("\n\n\nPicoDrive v" VERSION " (c) notaz, 2006-2009,2013\n");\r
cc68a136 67 printf("usage: %s [options] [romfile]\n", argv[0]);\r
42171343 68 printf("options:\n"\r
69 " -config <file> use specified config file instead of default 'config.cfg'\n"\r
636d5f25 70 " -loadstate <num> if ROM is specified, try loading savestate slot <num>\n");\r
71 exit(1);\r
cc68a136 72 }\r
73}\r
74\r
75\r
76int main(int argc, char *argv[])\r
77{\r
78 g_argv = argv;\r
79\r
636d5f25 80 plat_early_init();\r
ee2a3bdf 81\r
7e4c661a 82 in_init();\r
636d5f25 83 //in_probe();\r
58c86d00 84\r
e743be20 85 plat_target_init();\r
636d5f25 86 plat_init();\r
45285368 87\r
88 emu_prep_defconfig(); // depends on input\r
89 emu_read_config(NULL, 0);\r
42171343 90\r
f2cf8472 91 emu_init();\r
a12e0116 92 menu_init();\r
cc68a136 93\r
94 engineState = PGS_Menu;\r
95\r
96 if (argc > 1)\r
97 parse_cmd_line(argc, argv);\r
98\r
e163b67f 99 if (engineState == PGS_ReloadRom)\r
100 {\r
a47dd663 101 if (emu_reload_rom(rom_fname_reload)) {\r
e163b67f 102 engineState = PGS_Running;\r
103 if (load_state_slot >= 0) {\r
104 state_slot = load_state_slot;\r
a47dd663 105 emu_save_load_game(1, 0);\r
e163b67f 106 }\r
107 }\r
108 }\r
109\r
cc68a136 110 for (;;)\r
111 {\r
112 switch (engineState)\r
113 {\r
114 case PGS_Menu:\r
115 menu_loop();\r
116 break;\r
117\r
d687ef50 118 case PGS_TrayMenu:\r
119 menu_loop_tray();\r
120 break;\r
121\r
cc68a136 122 case PGS_ReloadRom:\r
a47dd663 123 if (emu_reload_rom(rom_fname_reload))\r
cc68a136 124 engineState = PGS_Running;\r
125 else {\r
126 printf("PGS_ReloadRom == 0\n");\r
127 engineState = PGS_Menu;\r
128 }\r
129 break;\r
130\r
721cd396 131 case PGS_RestartRun:\r
132 engineState = PGS_Running;\r
d687ef50 133 /* vvv fallthrough */\r
721cd396 134\r
cc68a136 135 case PGS_Running:\r
b24e0f6c 136 emu_loop();\r
cc68a136 137 break;\r
138\r
139 case PGS_Quit:\r
140 goto endloop;\r
b837b69b 141\r
cc68a136 142 default:\r
143 printf("engine got into unknown state (%i), exitting\n", engineState);\r
144 goto endloop;\r
145 }\r
146 }\r
147\r
148 endloop:\r
149\r
f2cf8472 150 emu_finish();\r
636d5f25 151 plat_finish();\r
e743be20 152 plat_target_finish();\r
cc68a136 153\r
154 return 0;\r
155}\r