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