a8e3362eb97913b54a5eaa1b75b2f9d7ba73049a
[picodrive.git] / platform / win32 / GenaDrive / Main.cpp
1 \r
2 #include "app.h"\r
3 #include <crtdbg.h>\r
4 #include <commdlg.h>\r
5 \r
6 char *romname;\r
7 HWND FrameWnd=NULL;\r
8 \r
9 int MainWidth=720,MainHeight=480;\r
10 \r
11 char AppName[]="GenaDrive";\r
12 \r
13 #ifdef STARSCREAM\r
14   extern "C" int SekReset();\r
15 #endif\r
16 \r
17 // ------------------------------------ XBox Main ------------------------------------------\r
18 #ifdef _XBOX\r
19 \r
20 static int MainCode()\r
21 {\r
22   int ret=0;\r
23 \r
24   ret=LoopInit(); if (ret) { LoopExit(); return 1; }\r
25 \r
26   LoopQuit=0; LoopCode();\r
27   LoopExit();\r
28 \r
29   return 0;\r
30 }\r
31 \r
32 int __cdecl main()\r
33 {\r
34   LD_LAUNCH_DASHBOARD launch;\r
35 \r
36   MainCode();\r
37 \r
38   // Go back to dashboard:\r
39   memset(&launch,0,sizeof(launch));\r
40   launch.dwReason=XLD_LAUNCH_DASHBOARD_MAIN_MENU;\r
41   XLaunchNewImage(NULL,(LAUNCH_DATA *)&launch);\r
42 }\r
43 #endif\r
44 \r
45 // ----------------------------------- Windows Main ----------------------------------------\r
46 #ifndef _XBOX\r
47 // Window proc for the frame window:\r
48 static LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)\r
49 {\r
50   if (msg==WM_CLOSE) { PostQuitMessage(0); return 0; }\r
51   if (msg==WM_DESTROY) FrameWnd=NULL; // Blank handle\r
52 \r
53   return DefWindowProc(hwnd,msg,wparam,lparam);\r
54 }\r
55 \r
56 static int FrameInit()\r
57 {\r
58   WNDCLASS wc;\r
59   RECT rect={0,0,0,0};\r
60   int style=0;\r
61   int left=0,top=0,width=0,height=0;\r
62 \r
63   memset(&wc,0,sizeof(wc));\r
64 \r
65   // Register the window class:\r
66   wc.lpfnWndProc=WndProc;\r
67   wc.hInstance=GetModuleHandle(NULL);\r
68   wc.hCursor=LoadCursor(NULL,IDC_ARROW);\r
69   wc.hbrBackground=CreateSolidBrush(0);\r
70   wc.lpszClassName="MainFrame";\r
71   RegisterClass(&wc);\r
72 \r
73   rect.right =320;//MainWidth;\r
74   rect.bottom=224;//MainHeight;\r
75 \r
76   // Adjust size of windows based on borders:\r
77   style=WS_OVERLAPPEDWINDOW;\r
78   AdjustWindowRect(&rect,style,0);\r
79   width =rect.right-rect.left;\r
80   height=rect.bottom-rect.top;\r
81 \r
82   // Place window in the centre of the screen:\r
83   SystemParametersInfo(SPI_GETWORKAREA,0,&rect,0);\r
84   left=rect.left+rect.right;\r
85   top=rect.top+rect.bottom;\r
86 \r
87   left-=width; left>>=1;\r
88   top-=height; top>>=1;\r
89 \r
90   // Create the window:\r
91   FrameWnd=CreateWindow(wc.lpszClassName,AppName,style|WS_VISIBLE,\r
92     left,top,width,height,NULL,NULL,NULL,NULL);\r
93 \r
94   return 0;\r
95 }\r
96 \r
97 // --------------------\r
98 \r
99 static DWORD WINAPI ThreadCode(void *)\r
100 {\r
101   LoopCode();\r
102   return 0;\r
103 }\r
104 \r
105 // starscream needs this\r
106 unsigned char *rom_data = 0;\r
107 unsigned int rom_size = 0;\r
108 \r
109 int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR cmdline,int)\r
110 {\r
111   MSG msg;\r
112   int ret=0;\r
113   DWORD tid=0;\r
114   HANDLE thread=NULL;\r
115 \r
116   FrameInit();\r
117   ret=LoopInit(); if (ret) { LoopExit(); return 1; }\r
118 \r
119   // notaz: load rom\r
120   static char rompath[MAX_PATH]; rompath[0] = 0;\r
121   strcpy(rompath, cmdline + (cmdline[0] == '\"' ? 1 : 0));\r
122   if(rompath[strlen(rompath)-1] == '\"') rompath[strlen(rompath)-1] = 0;\r
123 \r
124   pm_file *rom = 0;\r
125   if(strlen(rompath) > 4) rom = pm_open(rompath);\r
126   if(!rom) {\r
127     OPENFILENAME of; ZeroMemory(&of, sizeof(OPENFILENAME));\r
128         of.lStructSize = sizeof(OPENFILENAME);\r
129         of.lpstrFilter = "ROMs\0*.smd;*.bin;*.gen\0";\r
130         of.lpstrFile = rompath; rompath[0] = 0;\r
131         of.nMaxFile = MAX_PATH;\r
132         of.Flags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;\r
133         if(!GetOpenFileName(&of)) return 1;\r
134         rom = pm_open(rompath);\r
135         if(!rom) return 1;\r
136   }\r
137   romname = rompath;\r
138 \r
139   if(PicoCartLoad(rom, &rom_data, &rom_size)) {\r
140         //RDebug::Print(_L("PicoCartLoad() failed."));\r
141         //goto cleanup;\r
142   }\r
143   pm_close(rom);\r
144 \r
145   PicoCartInsert(rom_data, rom_size);\r
146 \r
147   // only now we got the mode (pal/ntsc), so init sound now\r
148   DSoundInit();\r
149 \r
150   // Make another thread to run LoopCode():\r
151   LoopQuit=0;\r
152   thread=CreateThread(NULL,0,ThreadCode,NULL,0,&tid);\r
153 \r
154   // Main window loop:\r
155   for (;;)\r
156   {\r
157     GetMessage(&msg,NULL,0,0);\r
158     if (msg.message==WM_QUIT) break;\r
159 \r
160     TranslateMessage(&msg);\r
161     DispatchMessage(&msg);\r
162   }\r
163 \r
164   // Signal thread to quit and wait for it to exit:\r
165   LoopQuit=1; WaitForSingleObject(thread,5000);\r
166   CloseHandle(thread); thread=NULL;\r
167 \r
168   LoopExit();\r
169   DestroyWindow(FrameWnd);\r
170 \r
171   free(rom_data);\r
172 \r
173   _CrtDumpMemoryLeaks();\r
174   return 0;\r
175 }\r
176 \r
177 extern void error(char *text)\r
178 {\r
179   MessageBox(FrameWnd, text, "Error", 0);\r
180 }\r
181 #endif\r
182 \r