pandora: fix readme and pxml version
[picodrive.git] / platform / common / main.c
... / ...
CommitLineData
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
8\r
9#include <stdio.h>\r
10#include <stdlib.h>\r
11#include <string.h>\r
12#include <strings.h>\r
13#ifdef USE_SDL\r
14#include <SDL.h>\r
15#endif\r
16\r
17#include "../libpicofe/input.h"\r
18#include "../libpicofe/plat.h"\r
19#include "menu_pico.h"\r
20#include "emu.h"\r
21#include "version.h"\r
22#include <cpu/debug.h>\r
23\r
24static int load_state_slot = -1;\r
25char **g_argv;\r
26\r
27void parse_cmd_line(int argc, char *argv[])\r
28{\r
29 int x, unrecognized = 0;\r
30\r
31 for (x = 1; x < argc && !unrecognized; x++)\r
32 {\r
33 if (argv[x][0] == '-')\r
34 {\r
35 if (strcasecmp(argv[x], "-config") == 0) {\r
36 if (x+1 < argc) { ++x; PicoConfigFile = argv[x]; }\r
37 }\r
38 else if (strcasecmp(argv[x], "-loadstate") == 0\r
39 || strcasecmp(argv[x], "-load") == 0)\r
40 {\r
41 if (x+1 < argc) { ++x; load_state_slot = atoi(argv[x]); }\r
42 }\r
43 else if (strcasecmp(argv[x], "-pdb") == 0) {\r
44 if (x+1 < argc) { ++x; pdb_command(argv[x]); }\r
45 }\r
46 else if (strcasecmp(argv[x], "-pdb_connect") == 0) {\r
47 if (x+2 < argc) { pdb_net_connect(argv[x+1], argv[x+2]); x += 2; }\r
48 }\r
49 else {\r
50 unrecognized = plat_parse_arg(argc, argv, &x);\r
51 }\r
52 } else {\r
53 FILE *f = fopen(argv[x], "rb");\r
54 if (f) {\r
55 fclose(f);\r
56 rom_fname_reload = argv[x];\r
57 }\r
58 else\r
59 unrecognized = 1;\r
60 break;\r
61 }\r
62 }\r
63\r
64 if (unrecognized) {\r
65 printf("\n\n\nPicoDrive v" VERSION " (c) notaz, 2006-2009,2013\n");\r
66 printf("usage: %s [options] [romfile]\n", argv[0]);\r
67 printf("options:\n"\r
68 " -config <file> use specified config file instead of default 'config.cfg'\n"\r
69 " -loadstate <num> if ROM is specified, try loading savestate slot <num>\n");\r
70 exit(1);\r
71 }\r
72}\r
73\r
74\r
75int main(int argc, char *argv[])\r
76{\r
77 g_argv = argv;\r
78\r
79 plat_early_init();\r
80\r
81 in_init();\r
82 //in_probe();\r
83\r
84 plat_target_init();\r
85 if (argc > 1)\r
86 parse_cmd_line(argc, argv);\r
87\r
88 plat_init();\r
89 menu_init();\r
90\r
91 emu_prep_defconfig(); // depends on input\r
92 emu_read_config(NULL, 0);\r
93\r
94 emu_init();\r
95\r
96 engineState = rom_fname_reload ? PGS_ReloadRom : PGS_Menu;\r
97 plat_video_menu_enter(0);\r
98\r
99 if (engineState == PGS_ReloadRom)\r
100 {\r
101 plat_video_menu_begin();\r
102 if (emu_reload_rom(rom_fname_reload)) {\r
103 engineState = PGS_Running;\r
104 if (load_state_slot >= 0) {\r
105 state_slot = load_state_slot;\r
106 emu_save_load_game(1, 0);\r
107 }\r
108 }\r
109 plat_video_menu_end();\r
110 }\r
111 plat_video_menu_leave();\r
112\r
113 for (;;)\r
114 {\r
115 switch (engineState)\r
116 {\r
117 case PGS_Menu:\r
118 menu_loop();\r
119 break;\r
120\r
121 case PGS_TrayMenu:\r
122 menu_loop_tray();\r
123 break;\r
124\r
125 case PGS_ReloadRom:\r
126 if (emu_reload_rom(rom_fname_reload))\r
127 engineState = PGS_Running;\r
128 else {\r
129 printf("PGS_ReloadRom == 0\n");\r
130 engineState = PGS_Menu;\r
131 }\r
132 break;\r
133\r
134 case PGS_RestartRun:\r
135 engineState = PGS_Running;\r
136 /* vvv fallthrough */\r
137\r
138 case PGS_Running:\r
139#ifdef GPERF\r
140 ProfilerStart("gperf.out");\r
141#endif\r
142 emu_loop();\r
143#ifdef GPERF\r
144 ProfilerStop();\r
145#endif\r
146 break;\r
147\r
148 case PGS_Quit:\r
149 goto endloop;\r
150\r
151 default:\r
152 printf("engine got into unknown state (%i), exitting\n", engineState);\r
153 goto endloop;\r
154 }\r
155 }\r
156\r
157 endloop:\r
158\r
159 emu_finish();\r
160 plat_finish();\r
161 plat_target_finish();\r
162\r
163 return 0;\r
164}\r