initial import
[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   // notaz: load rom\r
117   static char rompath[MAX_PATH]; rompath[0] = 0;\r
118   strcpy(rompath, cmdline + (cmdline[0] == '\"' ? 1 : 0));\r
119   if(rompath[strlen(rompath)-1] == '\"') rompath[strlen(rompath)-1] = 0;\r
120 \r
121   FILE *rom = 0;\r
122   if(strlen(rompath) > 4) rom = fopen(rompath, "rb");\r
123   if(!rom) {\r
124     OPENFILENAME of; ZeroMemory(&of, sizeof(OPENFILENAME));\r
125         of.lStructSize = sizeof(OPENFILENAME);\r
126         of.lpstrFilter = "ROMs\0*.smd;*.bin;*.gen\0";\r
127         of.lpstrFile = rompath; rompath[0] = 0;\r
128         of.nMaxFile = MAX_PATH;\r
129         of.Flags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;\r
130         if(!GetOpenFileName(&of)) return 1;\r
131         rom = fopen(rompath, "rb");\r
132         if(!rom) return 1;\r
133   }\r
134   romname = rompath;\r
135 \r
136   if(PicoCartLoad(rom, &rom_data, &rom_size)) {\r
137         //RDebug::Print(_L("PicoCartLoad() failed."));\r
138         //goto cleanup;\r
139   }\r
140 \r
141   FrameInit();\r
142   ret=LoopInit(); if (ret) { LoopExit(); return 1; }\r
143 \r
144   PicoCartInsert(rom_data, rom_size);\r
145 \r
146   // only now we got the mode (pal/ntsc), so init sound now\r
147   DSoundInit();\r
148 \r
149   preLoopInit();\r
150 \r
151   // Make another thread to run LoopCode():\r
152   LoopQuit=0;\r
153   thread=CreateThread(NULL,0,ThreadCode,NULL,0,&tid);\r
154 \r
155   // Main window loop:\r
156   for (;;)\r
157   {\r
158     GetMessage(&msg,NULL,0,0);\r
159     if (msg.message==WM_QUIT) break;\r
160 \r
161     TranslateMessage(&msg);\r
162     DispatchMessage(&msg);\r
163   }\r
164 \r
165   // Signal thread to quit and wait for it to exit:\r
166   LoopQuit=1; WaitForSingleObject(thread,5000);\r
167   CloseHandle(thread); thread=NULL;\r
168 \r
169   LoopExit();\r
170   DestroyWindow(FrameWnd);\r
171 \r
172   free(rom_data);\r
173 \r
174   _CrtDumpMemoryLeaks();\r
175   return 0;\r
176 }\r
177 #endif\r
178 \r