platform ps2, handle audio similar to psp
[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
1f49b750 13#ifdef USE_SDL\r
14#include <SDL.h>\r
15#endif\r
cc68a136 16\r
e743be20 17#include "../libpicofe/input.h"\r
18#include "../libpicofe/plat.h"\r
19#include "menu_pico.h"\r
cc68a136 20#include "emu.h"\r
c6f91b0e 21#include "version.h"\r
5686d931 22#include <cpu/debug.h>\r
cc68a136 23\r
e163b67f 24static int load_state_slot = -1;\r
cc68a136 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
58fc34b1 31 for (x = 1; x < argc && !unrecognized; x++)\r
cc68a136 32 {\r
42171343 33 if (argv[x][0] == '-')\r
cc68a136 34 {\r
42171343 35 if (strcasecmp(argv[x], "-config") == 0) {\r
36 if (x+1 < argc) { ++x; PicoConfigFile = argv[x]; }\r
cc68a136 37 }\r
d438a8dd 38 else if (strcasecmp(argv[x], "-loadstate") == 0\r
39 || strcasecmp(argv[x], "-load") == 0)\r
40 {\r
42171343 41 if (x+1 < argc) { ++x; load_state_slot = atoi(argv[x]); }\r
e163b67f 42 }\r
5686d931 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
cc68a136 49 else {\r
58fc34b1 50 unrecognized = plat_parse_arg(argc, argv, &x);\r
cc68a136 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
636d5f25 57 }\r
58 else\r
59 unrecognized = 1;\r
cc68a136 60 break;\r
61 }\r
62 }\r
63\r
64 if (unrecognized) {\r
636d5f25 65 printf("\n\n\nPicoDrive v" VERSION " (c) notaz, 2006-2009,2013\n");\r
cc68a136 66 printf("usage: %s [options] [romfile]\n", argv[0]);\r
42171343 67 printf("options:\n"\r
68 " -config <file> use specified config file instead of default 'config.cfg'\n"\r
636d5f25 69 " -loadstate <num> if ROM is specified, try loading savestate slot <num>\n");\r
70 exit(1);\r
cc68a136 71 }\r
72}\r
73\r
74\r
75int main(int argc, char *argv[])\r
76{\r
77 g_argv = argv;\r
78\r
636d5f25 79 plat_early_init();\r
ee2a3bdf 80\r
7e4c661a 81 in_init();\r
636d5f25 82 //in_probe();\r
58c86d00 83\r
e743be20 84 plat_target_init();\r
85174a6d 85 if (argc > 1)\r
86 parse_cmd_line(argc, argv);\r
87\r
f8aaa200 88 plat_init();\r
89 menu_init();\r
45285368 90\r
91 emu_prep_defconfig(); // depends on input\r
92 emu_read_config(NULL, 0);\r
42171343 93\r
f2cf8472 94 emu_init();\r
cc68a136 95\r
58fc34b1 96 engineState = rom_fname_reload ? PGS_ReloadRom : PGS_Menu;\r
f8aaa200 97 plat_video_menu_enter(0);\r
cc68a136 98\r
e163b67f 99 if (engineState == PGS_ReloadRom)\r
100 {\r
f8aaa200 101 plat_video_menu_begin();\r
a47dd663 102 if (emu_reload_rom(rom_fname_reload)) {\r
e163b67f 103 engineState = PGS_Running;\r
104 if (load_state_slot >= 0) {\r
105 state_slot = load_state_slot;\r
a47dd663 106 emu_save_load_game(1, 0);\r
e163b67f 107 }\r
108 }\r
f8aaa200 109 plat_video_menu_end();\r
e163b67f 110 }\r
f8aaa200 111 plat_video_menu_leave();\r
e163b67f 112\r
cc68a136 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
d687ef50 121 case PGS_TrayMenu:\r
122 menu_loop_tray();\r
123 break;\r
124\r
cc68a136 125 case PGS_ReloadRom:\r
a47dd663 126 if (emu_reload_rom(rom_fname_reload))\r
cc68a136 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
721cd396 134 case PGS_RestartRun:\r
135 engineState = PGS_Running;\r
d687ef50 136 /* vvv fallthrough */\r
721cd396 137\r
cc68a136 138 case PGS_Running:\r
f821bb70 139#ifdef GPERF\r
140 ProfilerStart("gperf.out");\r
141#endif\r
b24e0f6c 142 emu_loop();\r
f821bb70 143#ifdef GPERF\r
144 ProfilerStop();\r
145#endif\r
cc68a136 146 break;\r
147\r
148 case PGS_Quit:\r
149 goto endloop;\r
b837b69b 150\r
cc68a136 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
f2cf8472 159 emu_finish();\r
636d5f25 160 plat_finish();\r
e743be20 161 plat_target_finish();\r
cc68a136 162\r
163 return 0;\r
164}\r