10 static HWND PicoSwWnd=NULL, PicoPadWnd=NULL;
\r
12 int MainWidth=720,MainHeight=480;
\r
14 static HMENU mdisplay = 0, mpicohw = 0;
\r
15 static int rom_loaded = 0;
\r
17 static void UpdateRect()
\r
20 memset(&wi, 0, sizeof(wi));
\r
21 wi.cbSize = sizeof(wi);
\r
22 GetWindowInfo(FrameWnd, &wi);
\r
23 FrameRectMy = wi.rcClient;
\r
26 static void LoadROM(const char *cmdpath)
\r
28 static char rompath[MAX_PATH] = { 0, };
\r
29 unsigned char *rom_data_new = NULL;
\r
30 unsigned int rom_size = 0;
\r
31 pm_file *rom = NULL;
\r
32 int oldwait=LoopWait;
\r
36 strcpy(rompath, cmdpath + (cmdpath[0] == '\"' ? 1 : 0));
\r
37 if (rompath[strlen(rompath)-1] == '\"') rompath[strlen(rompath)-1] = 0;
\r
38 if (strlen(rompath) > 4) rom = pm_open(rompath);
\r
42 OPENFILENAME of; ZeroMemory(&of, sizeof(OPENFILENAME));
\r
43 of.lStructSize = sizeof(OPENFILENAME);
\r
44 of.lpstrFilter = "ROMs\0*.smd;*.bin;*.gen;*.zip\0";
\r
45 of.lpstrFile = rompath; rompath[0] = 0;
\r
46 of.nMaxFile = MAX_PATH;
\r
47 of.Flags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;
\r
48 of.hwndOwner = FrameWnd;
\r
49 if (!GetOpenFileName(&of)) return;
\r
50 rom = pm_open(rompath);
\r
51 if (!rom) { error("failed to open ROM"); return; }
\r
54 ret=PicoCartLoad(rom, &rom_data_new, &rom_size);
\r
57 error("failed to load ROM");
\r
61 // halt the work thread..
\r
62 // just a hack, should've used proper sync. primitives here, but who will use this emu anyway..
\r
65 for (i = 0; LoopWaiting == 0 && i < 10; i++) Sleep(100);
\r
68 PicoCartInsert(rom_data_new, rom_size);
\r
75 static int rect_widths[4] = { 320, 256, 640, 512 };
\r
76 static int rect_heights[4] = { 224, 224, 448, 448 };
\r
78 // Window proc for the frame window:
\r
79 static LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
\r
84 case WM_CLOSE: PostQuitMessage(0); return 0;
\r
85 case WM_DESTROY: FrameWnd=NULL; break; // Blank handle
\r
88 case WM_SIZING: UpdateRect(); break;
\r
90 switch (LOWORD(wparam))
\r
92 case 1000: LoadROM(NULL); break;
\r
93 case 1001: PicoReset(); return 0;
\r
94 case 1002: PostQuitMessage(0); return 0;
\r
99 LoopWait=1; // another sync hack
\r
100 for (i = 0; !LoopWaiting && i < 10; i++) Sleep(10);
\r
101 FrameRectMy.right = FrameRectMy.left + rect_widths[wparam&3];
\r
102 FrameRectMy.bottom = FrameRectMy.top + rect_heights[wparam&3];
\r
103 AdjustWindowRect(&FrameRectMy, WS_OVERLAPPEDWINDOW, 1);
\r
104 MoveWindow(hwnd, FrameRectMy.left, FrameRectMy.top,
\r
105 FrameRectMy.right-FrameRectMy.left, FrameRectMy.bottom-FrameRectMy.top, 1);
\r
107 if (HIWORD(wparam) == 0) { // locally sent
\r
109 CheckMenuItem(mdisplay, 1104, MF_UNCHECKED);
\r
111 if (rom_loaded) LoopWait=0;
\r
114 lock_to_1_1=!lock_to_1_1;
\r
115 CheckMenuItem(mdisplay, 1104, lock_to_1_1 ? MF_CHECKED : MF_UNCHECKED);
\r
119 i = IsWindowVisible((LOWORD(wparam)&1) ? PicoPadWnd : PicoSwWnd);
\r
121 ShowWindow((LOWORD(wparam)&1) ? PicoPadWnd : PicoSwWnd, i ? SW_SHOWNA : SW_HIDE);
\r
122 CheckMenuItem(mpicohw, LOWORD(wparam), i ? MF_CHECKED : MF_UNCHECKED);
\r
131 PicoPicohw.page = LOWORD(wparam) % 10;
\r
132 for (i = 0; i < 7; i++)
\r
133 CheckMenuItem(mpicohw, 1220 + i, MF_UNCHECKED);
\r
134 CheckMenuItem(mpicohw, 1220 + PicoPicohw.page, MF_CHECKED);
\r
137 MessageBox(FrameWnd, "PicoDrive v" VERSION " (c) notaz, 2006-2008\n"
\r
138 "SVP and Pico demo edition\n\n"
\r
140 "fDave: base code of PicoDrive, GenaDrive (the frontend)\n"
\r
143 "MAME devs: YM2612 and SN76496 cores\n"
\r
144 "Stéphane Dallongeville: Gens code, base of Fame/C (C68K), CZ80\n"
\r
145 "Tasco Deluxe: SVP RE work\n"
\r
146 "Pierpaolo Prazzoli: info about SSP16 chips\n",
\r
153 return DefWindowProc(hwnd,msg,wparam,lparam);
\r
156 static LRESULT CALLBACK PicoSwWndProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
\r
160 case WM_CLOSE: return 0;
\r
161 case WM_DESTROY: PicoSwWnd=NULL; break;
\r
164 return DefWindowProc(hwnd,msg,wparam,lparam);
\r
167 static LRESULT CALLBACK PicoPadWndProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
\r
171 case WM_CLOSE: return 0;
\r
172 case WM_DESTROY: PicoPadWnd=NULL; break;
\r
175 return DefWindowProc(hwnd,msg,wparam,lparam);
\r
179 static int FrameInit()
\r
182 RECT rect={0,0,0,0};
\r
183 HMENU mmain, mfile;
\r
185 int left=0,top=0,width=0,height=0;
\r
187 memset(&wc,0,sizeof(wc));
\r
189 // Register the window class:
\r
190 wc.lpfnWndProc=WndProc;
\r
191 wc.hInstance=GetModuleHandle(NULL);
\r
192 wc.hCursor=LoadCursor(NULL,IDC_ARROW);
\r
193 wc.hbrBackground=CreateSolidBrush(0);
\r
194 wc.lpszClassName="PicoMainFrame";
\r
195 RegisterClass(&wc);
\r
197 wc.lpszClassName="PicoSwWnd";
\r
198 wc.lpfnWndProc=PicoSwWndProc;
\r
199 RegisterClass(&wc);
\r
201 wc.lpszClassName="PicoPadWnd";
\r
202 wc.lpfnWndProc=PicoPadWndProc;
\r
203 RegisterClass(&wc);
\r
205 rect.right =320;//MainWidth;
\r
206 rect.bottom=224;//MainHeight;
\r
208 // Adjust size of windows based on borders:
\r
209 style=WS_OVERLAPPEDWINDOW;
\r
210 AdjustWindowRect(&rect,style,1);
\r
211 width =rect.right-rect.left;
\r
212 height=rect.bottom-rect.top;
\r
214 // Place window in the centre of the screen:
\r
215 SystemParametersInfo(SPI_GETWORKAREA,0,&rect,0);
\r
216 left=rect.left+rect.right;
\r
217 top=rect.top+rect.bottom;
\r
219 left-=width; left>>=1;
\r
220 top-=height; top>>=1;
\r
223 mfile = CreateMenu();
\r
224 InsertMenu(mfile, -1, MF_BYPOSITION|MF_STRING, 1000, "&Load ROM");
\r
225 InsertMenu(mfile, -1, MF_BYPOSITION|MF_STRING, 1001, "&Reset");
\r
226 InsertMenu(mfile, -1, MF_BYPOSITION|MF_STRING, 1002, "E&xit");
\r
227 mdisplay = CreateMenu();
\r
228 InsertMenu(mdisplay, -1, MF_BYPOSITION|MF_STRING, 1100, "320x224");
\r
229 InsertMenu(mdisplay, -1, MF_BYPOSITION|MF_STRING, 1101, "256x224");
\r
230 InsertMenu(mdisplay, -1, MF_BYPOSITION|MF_STRING, 1102, "640x448");
\r
231 InsertMenu(mdisplay, -1, MF_BYPOSITION|MF_STRING, 1103, "512x448");
\r
232 InsertMenu(mdisplay, -1, MF_BYPOSITION|MF_STRING, 1104, "Lock to 1:1");
\r
233 mpicohw = CreateMenu();
\r
234 InsertMenu(mpicohw, -1, MF_BYPOSITION|MF_STRING, 1210, "Show &Storyware");
\r
235 InsertMenu(mpicohw, -1, MF_BYPOSITION|MF_STRING, 1211, "Show &Drawing pad");
\r
236 InsertMenu(mpicohw, -1, MF_BYPOSITION|MF_SEPARATOR, 0, NULL);
\r
237 InsertMenu(mpicohw, -1, MF_BYPOSITION|MF_STRING, 1220, "Title page (&0)");
\r
238 InsertMenu(mpicohw, -1, MF_BYPOSITION|MF_STRING, 1221, "Page &1");
\r
239 InsertMenu(mpicohw, -1, MF_BYPOSITION|MF_STRING, 1222, "Page &2");
\r
240 InsertMenu(mpicohw, -1, MF_BYPOSITION|MF_STRING, 1223, "Page &3");
\r
241 InsertMenu(mpicohw, -1, MF_BYPOSITION|MF_STRING, 1224, "Page &4");
\r
242 InsertMenu(mpicohw, -1, MF_BYPOSITION|MF_STRING, 1225, "Page &5");
\r
243 InsertMenu(mpicohw, -1, MF_BYPOSITION|MF_STRING, 1226, "Page &6");
\r
244 mmain = CreateMenu();
\r
245 InsertMenu(mmain, -1, MF_BYPOSITION|MF_STRING|MF_POPUP, (UINT_PTR) mfile, "&File");
\r
246 InsertMenu(mmain, -1, MF_BYPOSITION|MF_STRING|MF_POPUP, (UINT_PTR) mdisplay, "&Display");
\r
247 InsertMenu(mmain, -1, MF_BYPOSITION|MF_STRING|MF_POPUP, (UINT_PTR) mpicohw, "&Pico");
\r
248 // InsertMenu(mmain, -1, MF_BYPOSITION|MF_STRING|MF_POPUP, 1200, "&Config");
\r
249 InsertMenu(mmain, -1, MF_BYPOSITION|MF_STRING, 1300, "&About");
\r
251 // Create the window:
\r
252 FrameWnd=CreateWindow("PicoMainFrame","PicoDrive " VERSION,style|WS_VISIBLE,
\r
253 left,top,width,height,NULL,mmain,NULL,NULL);
\r
255 CheckMenuItem(mdisplay, 1104, lock_to_1_1 ? MF_CHECKED : MF_UNCHECKED);
\r
256 ShowWindow(FrameWnd, SW_NORMAL);
\r
257 UpdateWindow(FrameWnd);
\r
260 // create Pico windows
\r
261 style = WS_OVERLAPPED|WS_CAPTION|WS_BORDER;
\r
262 rect.left=rect.top=0;
\r
266 AdjustWindowRect(&rect,style,1);
\r
267 width =rect.right-rect.left;
\r
268 height=rect.bottom-rect.top;
\r
271 PicoSwWnd=CreateWindow("PicoSwWnd","Storyware",style,
\r
272 left,top,width,height,FrameWnd,NULL,NULL,NULL);
\r
275 PicoPadWnd=CreateWindow("PicoPadWnd","Drawing Pad",style,
\r
276 left,top,width,height,FrameWnd,NULL,NULL,NULL);
\r
281 // --------------------
\r
283 static DWORD WINAPI ThreadCode(void *)
\r
289 int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR cmdline,int)
\r
294 HANDLE thread=NULL;
\r
297 ret=LoopInit(); if (ret) goto end0;
\r
299 // Make another thread to run LoopCode():
\r
301 LoopWait=1; // wait for ROM to be loaded
\r
302 thread=CreateThread(NULL,0,ThreadCode,NULL,0,&tid);
\r
306 // Main window loop:
\r
309 GetMessage(&msg,NULL,0,0);
\r
310 if (msg.message==WM_QUIT) break;
\r
312 TranslateMessage(&msg);
\r
313 DispatchMessage(&msg);
\r
316 // Signal thread to quit and wait for it to exit:
\r
317 LoopQuit=1; WaitForSingleObject(thread,5000);
\r
318 CloseHandle(thread); thread=NULL;
\r
322 DestroyWindow(FrameWnd);
\r
324 _CrtDumpMemoryLeaks();
\r
328 extern void error(char *text)
\r
330 MessageBox(FrameWnd, text, "Error", 0);
\r