OSDN Git Service

[General] Tracking to upstream, rev 2015-01-14.
[csp-qt/common_source_project-fm7.git] / source / src / winmain.cpp
1 /*\r
2         Skelton for retropc emulator\r
3 \r
4         Author : Takeda.Toshiya\r
5         Date   : 2006.08.18 -\r
6 \r
7         [ win32 main ]\r
8 */\r
9 \r
10 #include <windows.h>\r
11 #include <windowsx.h>\r
12 #include <winsock.h>\r
13 #include <commdlg.h>\r
14 #include <commctrl.h>\r
15 #include <mmsystem.h>\r
16 #include <stdio.h>\r
17 #include "res/resource.h"\r
18 #include "emu.h"\r
19 \r
20 // emulation core\r
21 EMU* emu;\r
22 \r
23 // buttons\r
24 #ifdef USE_BUTTON\r
25 #define MAX_FONT_SIZE 32\r
26 HFONT hFont[MAX_FONT_SIZE];\r
27 HWND hButton[MAX_BUTTONS];\r
28 WNDPROC buttonWndProc[MAX_BUTTONS];\r
29 #endif\r
30 \r
31 // menu\r
32 static HMENU hMenu = NULL;\r
33 bool now_menuloop = false;\r
34 \r
35 void update_menu(HWND hWnd, HMENU hMenu, int pos);\r
36 \r
37 void show_menu_bar(HWND hWnd)\r
38 {\r
39         if(!(hMenu != NULL && IsMenu(hMenu))) {\r
40                 hMenu = LoadMenu((HINSTANCE)GetModuleHandle(0), MAKEINTRESOURCE(IDR_MENU1));\r
41                 SetMenu(hWnd, hMenu);\r
42         }\r
43 }\r
44 \r
45 void hide_menu_bar(HWND hWnd)\r
46 {\r
47         if(hMenu != NULL && IsMenu(hMenu)) {\r
48                 SetMenu(hWnd, NULL);\r
49                 DestroyMenu(hMenu);\r
50                 hMenu = NULL;\r
51         }\r
52 }\r
53 \r
54 // dialog\r
55 #ifdef USE_CART1\r
56 void open_cart_dialog(HWND hWnd, int drv);\r
57 #endif\r
58 #ifdef USE_FD1\r
59 void open_disk_dialog(HWND hWnd, int drv);\r
60 void open_disk(int drv, _TCHAR* path, int bank);\r
61 void close_disk(int drv);\r
62 #endif\r
63 #ifdef USE_QD1\r
64 void open_quickdisk_dialog(HWND hWnd, int drv);\r
65 #endif\r
66 #ifdef USE_TAPE\r
67 void open_tape_dialog(HWND hWnd, bool play);\r
68 #endif\r
69 #ifdef USE_LASER_DISC\r
70 void open_laser_disc_dialog(HWND hWnd);\r
71 #endif\r
72 #ifdef USE_BINARY_FILE1\r
73 void open_binary_dialog(HWND hWnd, int drv, bool load);\r
74 #endif\r
75 \r
76 #if defined(USE_CART1) || defined(USE_FD1) || defined(USE_TAPE) || defined(USE_BINARY_FILE1)\r
77 #define SUPPORT_DRAG_DROP\r
78 #endif\r
79 #ifdef SUPPORT_DRAG_DROP\r
80 void open_any_file(_TCHAR* path);\r
81 #endif\r
82 \r
83 void get_long_full_path_name(_TCHAR* src, _TCHAR* dst, size_t dst_len)\r
84 {\r
85         _TCHAR tmp[_MAX_PATH];\r
86         \r
87         if(GetFullPathName(src, _MAX_PATH, tmp, NULL) == 0) {\r
88                 _tcscpy_s(dst, dst_len, src);\r
89         } else if(GetLongPathName(tmp, dst, _MAX_PATH) == 0) {\r
90                 _tcscpy_s(dst, dst_len, tmp);\r
91         }\r
92 }\r
93 \r
94 _TCHAR* get_parent_dir(_TCHAR* file)\r
95 {\r
96         static _TCHAR path[_MAX_PATH];\r
97         _TCHAR *ptr;\r
98         \r
99         GetFullPathName(file, _MAX_PATH, path, &ptr);\r
100         *ptr = _T('\0');\r
101         return path;\r
102 }\r
103 \r
104 _TCHAR* get_open_file_name(HWND hWnd, _TCHAR* filter, _TCHAR* title, _TCHAR* dir, size_t dir_len)\r
105 {\r
106         static _TCHAR path[_MAX_PATH];\r
107         _TCHAR tmp[_MAX_PATH] = _T("");\r
108         OPENFILENAME OpenFileName;\r
109         \r
110         memset(&OpenFileName, 0, sizeof(OpenFileName));\r
111         OpenFileName.lStructSize = sizeof(OPENFILENAME);\r
112         OpenFileName.hwndOwner = hWnd;\r
113         OpenFileName.lpstrFilter = filter;\r
114         OpenFileName.lpstrFile = tmp;\r
115         OpenFileName.nMaxFile = _MAX_PATH;\r
116         OpenFileName.lpstrTitle = title;\r
117         if(dir[0]) {\r
118                 OpenFileName.lpstrInitialDir = dir;\r
119         } else {\r
120                 _TCHAR app[_MAX_PATH];\r
121                 GetModuleFileName(NULL, app, _MAX_PATH);\r
122                 OpenFileName.lpstrInitialDir = get_parent_dir(app);\r
123         }\r
124         if(GetOpenFileName(&OpenFileName)) {\r
125                 get_long_full_path_name(OpenFileName.lpstrFile, path, _MAX_PATH);\r
126                 _tcscpy_s(dir, dir_len, get_parent_dir(path));\r
127                 return path;\r
128         }\r
129         return NULL;\r
130 }\r
131 \r
132 #define UPDATE_HISTORY(path, recent) { \\r
133         int no = MAX_HISTORY - 1; \\r
134         for(int i = 0; i < MAX_HISTORY; i++) { \\r
135                 if(_tcsicmp(recent[i], path) == 0) { \\r
136                         no = i; \\r
137                         break; \\r
138                 } \\r
139         } \\r
140         for(int i = no; i > 0; i--) { \\r
141                 _tcscpy_s(recent[i], _MAX_PATH, recent[i - 1]); \\r
142         } \\r
143         _tcscpy_s(recent[0], _MAX_PATH, path); \\r
144 }\r
145 \r
146 // screen\r
147 int desktop_width;\r
148 int desktop_height;\r
149 int desktop_bpp;\r
150 int prev_window_mode = 0;\r
151 bool now_fullscreen = false;\r
152 \r
153 #define MAX_WINDOW      8\r
154 #define MAX_FULLSCREEN  32\r
155 \r
156 int window_mode_count;\r
157 int screen_mode_count;\r
158 int screen_mode_width[MAX_FULLSCREEN];\r
159 int screen_mode_height[MAX_FULLSCREEN];\r
160 \r
161 void set_window(HWND hWnd, int mode);\r
162 \r
163 // timing control\r
164 #define MAX_SKIP_FRAMES 10\r
165 \r
166 int get_interval()\r
167 {\r
168         static int accum = 0;\r
169         accum += emu->frame_interval();\r
170         int interval = accum >> 10;\r
171         accum -= interval << 10;\r
172         return interval;\r
173 }\r
174 \r
175 // windows main\r
176 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLine, int iCmdShow);\r
177 LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam);\r
178 #ifdef USE_BUTTON\r
179 LRESULT CALLBACK ButtonWndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam);\r
180 #endif\r
181 \r
182 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLine, int iCmdShow)\r
183 {\r
184         // load config\r
185         load_config();\r
186         \r
187         // create window\r
188         WNDCLASS wndclass;\r
189         wndclass.style = CS_HREDRAW | CS_VREDRAW;\r
190         wndclass.lpfnWndProc = (WNDPROC)WndProc;\r
191         wndclass.cbClsExtra = 0;\r
192         wndclass.cbWndExtra = 0;\r
193         wndclass.hInstance = hInstance;\r
194         wndclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));\r
195         wndclass.hCursor = 0;\r
196         wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);\r
197         wndclass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);\r
198         wndclass.lpszClassName = _T("CWINDOW");\r
199         RegisterClass(&wndclass);\r
200         \r
201         // get window position\r
202         RECT rect = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT};\r
203         AdjustWindowRect(&rect, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE, TRUE);\r
204         HDC hdcScr = GetDC(NULL);\r
205         desktop_width = GetDeviceCaps(hdcScr, HORZRES);\r
206         desktop_height = GetDeviceCaps(hdcScr, VERTRES);\r
207         desktop_bpp = GetDeviceCaps(hdcScr, BITSPIXEL);\r
208         ReleaseDC(NULL, hdcScr);\r
209         int dest_x = (int)((desktop_width - (rect.right - rect.left)) / 2);\r
210         int dest_y = (int)((desktop_height - (rect.bottom - rect.top)) / 2);\r
211         //dest_x = (dest_x < 0) ? 0 : dest_x;\r
212         dest_y = (dest_y < 0) ? 0 : dest_y;\r
213         \r
214         // show window\r
215         HWND hWnd = CreateWindow(_T("CWINDOW"), _T(DEVICE_NAME), WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE,\r
216                                  dest_x, dest_y, rect.right - rect.left, rect.bottom - rect.top, NULL, NULL, hInstance, NULL);\r
217         ShowWindow(hWnd, iCmdShow);\r
218         UpdateWindow(hWnd);\r
219         \r
220         // show menu\r
221         show_menu_bar(hWnd);\r
222         \r
223         RECT rect_tmp;\r
224         GetClientRect(hWnd, &rect_tmp);\r
225         if(rect_tmp.bottom != WINDOW_HEIGHT) {\r
226                 rect.bottom += WINDOW_HEIGHT - rect_tmp.bottom;\r
227                 dest_y = (int)((desktop_height - (rect.bottom - rect.top)) / 2);\r
228                 dest_y = (dest_y < 0) ? 0 : dest_y;\r
229                 SetWindowPos(hWnd, NULL, dest_x, dest_y, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER);\r
230         }\r
231         \r
232         // enumerate screen mode\r
233         screen_mode_count = 0;\r
234         if(WINDOW_WIDTH <= 320 && WINDOW_HEIGHT <= 240) {\r
235                 // FIXME: need to check if your video card really supports 320x240 resolution\r
236                 screen_mode_width[0] = 320;\r
237                 screen_mode_height[0] = 240;\r
238                 screen_mode_count = 1;\r
239         }\r
240         for(int i = 0;; i++) {\r
241                 DEVMODE dev;\r
242                 ZeroMemory(&dev, sizeof(dev));\r
243                 dev.dmSize = sizeof(dev);\r
244                 if(EnumDisplaySettings(NULL, i, &dev) == 0) {\r
245                         break;\r
246                 }\r
247                 if(dev.dmPelsWidth >= WINDOW_WIDTH && dev.dmPelsHeight >= WINDOW_HEIGHT) {\r
248                         if(dev.dmPelsWidth >= 640 && dev.dmPelsHeight >= 480) {\r
249                                 bool found = false;\r
250                                 for(int j = 0; j < screen_mode_count; j++) {\r
251                                         if(screen_mode_width[j] == dev.dmPelsWidth && screen_mode_height[j] == dev.dmPelsHeight) {\r
252                                                 found = true;\r
253                                                 break;\r
254                                         }\r
255                                 }\r
256                                 if(!found) {\r
257                                         screen_mode_width[screen_mode_count] = dev.dmPelsWidth;\r
258                                         screen_mode_height[screen_mode_count] = dev.dmPelsHeight;\r
259                                         if(++screen_mode_count == MAX_FULLSCREEN) {\r
260                                                 break;\r
261                                         }\r
262                                 }\r
263                         }\r
264                 }\r
265         }\r
266         for(int i = 0; i < screen_mode_count - 1; i++) {\r
267                 for(int j = i + 1; j < screen_mode_count; j++) {\r
268                         if(screen_mode_width[i] > screen_mode_width[j] || (screen_mode_width[i] == screen_mode_width[j] && screen_mode_height[i] > screen_mode_height[j])) {\r
269                                 int width = screen_mode_width[i];\r
270                                 screen_mode_width[i] = screen_mode_width[j];\r
271                                 screen_mode_width[j] = width;\r
272                                 int height = screen_mode_height[i];\r
273                                 screen_mode_height[i] = screen_mode_height[j];\r
274                                 screen_mode_height[j] = height;\r
275                         }\r
276                 }\r
277         }\r
278         if(screen_mode_count == 0) {\r
279                 screen_mode_width[0] = desktop_width;\r
280                 screen_mode_height[0] = desktop_height;\r
281                 screen_mode_count = 1;\r
282         }\r
283         \r
284         // restore screen mode\r
285         if(config.window_mode >= 0 && config.window_mode < MAX_WINDOW) {\r
286                 PostMessage(hWnd, WM_COMMAND, ID_SCREEN_WINDOW1 + config.window_mode, 0L);\r
287         } else if(config.window_mode >= MAX_WINDOW && config.window_mode < screen_mode_count + MAX_WINDOW) {\r
288                 PostMessage(hWnd, WM_COMMAND, ID_SCREEN_FULLSCREEN1 + config.window_mode - MAX_WINDOW, 0L);\r
289         } else {\r
290                 config.window_mode = 0;\r
291                 PostMessage(hWnd, WM_COMMAND, ID_SCREEN_WINDOW1, 0L);\r
292         }\r
293         \r
294         // accelerator\r
295         HACCEL hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));\r
296         \r
297         // disenable ime\r
298         ImmAssociateContext(hWnd, 0);\r
299         \r
300         // initialize emulation core\r
301         emu = new EMU(hWnd, hInstance);\r
302         emu->set_display_size(WINDOW_WIDTH, WINDOW_HEIGHT, true);\r
303         \r
304 #ifdef SUPPORT_DRAG_DROP\r
305         // open command line path\r
306         if(szCmdLine[0]) {\r
307                 if(szCmdLine[0] == _T('"')) {\r
308                         int len = _tcslen(szCmdLine);\r
309                         szCmdLine[len - 1] = _T('\0');\r
310                         szCmdLine++;\r
311                 }\r
312                 _TCHAR path[_MAX_PATH];\r
313                 get_long_full_path_name(szCmdLine, path, _MAX_PATH);\r
314                 open_any_file(path);\r
315         }\r
316 #endif\r
317         \r
318         // set priority\r
319         SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS);\r
320         \r
321         // main loop\r
322         int total_frames = 0, draw_frames = 0, skip_frames = 0;\r
323         DWORD next_time = 0;\r
324         DWORD update_fps_time = 0;\r
325         bool prev_skip = false;\r
326         MSG msg;\r
327         \r
328         while(1) {\r
329                 // check window message\r
330                 if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {\r
331                         if(!GetMessage(&msg, NULL, 0, 0)) {\r
332 #ifdef _DEBUG\r
333                                 _CrtDumpMemoryLeaks();\r
334 #endif\r
335                                 ExitProcess(0); // trick\r
336                                 return msg.wParam;\r
337                         }\r
338                         if(!TranslateAccelerator(hWnd, hAccel, &msg)) {\r
339                                 TranslateMessage(&msg);\r
340                                 DispatchMessage(&msg);\r
341                         }\r
342                 } else if(emu) {\r
343                         // drive machine\r
344                         int run_frames = emu->run();\r
345                         total_frames += run_frames;\r
346                         \r
347                         // timing controls\r
348                         int interval = 0, sleep_period = 0;\r
349 //                      for(int i = 0; i < run_frames; i++) {\r
350                                 interval += get_interval();\r
351 //                      }\r
352                         bool now_skip = emu->now_skip() && !emu->now_rec_video;\r
353                         \r
354                         if((prev_skip && !now_skip) || next_time == 0) {\r
355                                 next_time = timeGetTime();\r
356                         }\r
357                         if(!now_skip) {\r
358                                 next_time += interval;\r
359                         }\r
360                         prev_skip = now_skip;\r
361                         \r
362                         if(next_time > timeGetTime()) {\r
363                                 // update window if enough time\r
364                                 draw_frames += emu->draw_screen();\r
365                                 skip_frames = 0;\r
366                                 \r
367                                 // sleep 1 frame priod if need\r
368                                 DWORD current_time = timeGetTime();\r
369                                 if((int)(next_time - current_time) >= 10) {\r
370                                         sleep_period = next_time - current_time;\r
371                                 }\r
372                         } else if(++skip_frames > MAX_SKIP_FRAMES) {\r
373                                 // update window at least once per 10 frames\r
374                                 draw_frames += emu->draw_screen();\r
375                                 skip_frames = 0;\r
376                                 next_time = timeGetTime();\r
377                         }\r
378                         Sleep(sleep_period);\r
379                         \r
380                         // calc frame rate\r
381                         DWORD current_time = timeGetTime();\r
382                         if(update_fps_time <= current_time && update_fps_time != 0) {\r
383                                 _TCHAR buf[256];\r
384                                 int ratio = (int)(100.0 * (double)draw_frames / (double)total_frames + 0.5);\r
385                                 if(emu->message_count > 0) {\r
386                                         _stprintf_s(buf, 256, _T("%s - %s"), _T(DEVICE_NAME), emu->message);\r
387                                         emu->message_count--;\r
388                                 } else {\r
389                                         _stprintf_s(buf, 256, _T("%s - %d fps (%d %%)"), _T(DEVICE_NAME), draw_frames, ratio);\r
390                                 }\r
391                                 SetWindowText(hWnd, buf);\r
392                                 \r
393                                 update_fps_time += 1000;\r
394                                 total_frames = draw_frames = 0;\r
395                         }\r
396                         if(update_fps_time <= current_time) {\r
397                                 update_fps_time = current_time + 1000;\r
398                         }\r
399                 }\r
400         }\r
401 #ifdef _DEBUG\r
402         _CrtDumpMemoryLeaks();\r
403 #endif\r
404         return 0;\r
405 }\r
406 \r
407 LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)\r
408 {\r
409         _TCHAR path[_MAX_PATH];\r
410         int no;\r
411         \r
412         switch(iMsg) {\r
413         case WM_CREATE:\r
414 #ifdef USE_BUTTON\r
415                 memset(hFont, 0, sizeof(hFont));\r
416                 for(int i = 0; i < MAX_BUTTONS; i++) {\r
417                         hButton[i] = CreateWindow(_T("BUTTON"), buttons[i].caption,\r
418                                                   WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_MULTILINE,\r
419                                                   buttons[i].x, buttons[i].y,\r
420                                                   buttons[i].width, buttons[i].height,\r
421                                                   hWnd, (HMENU)(ID_BUTTON + i), (HINSTANCE)GetModuleHandle(0), NULL);\r
422                         buttonWndProc[i] = (WNDPROC)(LONG_PTR)GetWindowLong(hButton[i], GWL_WNDPROC);\r
423                         SetWindowLong(hButton[i], GWL_WNDPROC, (LONG)(LONG_PTR)ButtonWndProc);\r
424                         //HFONT hFont = GetWindowFont(hButton[i]);\r
425                         if(!hFont[buttons[i].font_size]) {\r
426                                 LOGFONT logfont;\r
427                                 logfont.lfEscapement = 0;\r
428                                 logfont.lfOrientation = 0;\r
429                                 logfont.lfWeight = FW_NORMAL;\r
430                                 logfont.lfItalic = FALSE;\r
431                                 logfont.lfUnderline = FALSE;\r
432                                 logfont.lfStrikeOut = FALSE;\r
433                                 logfont.lfCharSet = DEFAULT_CHARSET;\r
434                                 logfont.lfOutPrecision = OUT_TT_PRECIS;\r
435                                 logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;\r
436                                 logfont.lfQuality = DEFAULT_QUALITY;\r
437                                 logfont.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;\r
438                                 _tcscpy_s(logfont.lfFaceName, LF_FACESIZE, _T("Arial"));\r
439                                 logfont.lfHeight = buttons[i].font_size;\r
440                                 logfont.lfWidth = buttons[i].font_size >> 1;\r
441                                 hFont[buttons[i].font_size] = CreateFontIndirect(&logfont);\r
442                         }\r
443                         SetWindowFont(hButton[i], hFont[buttons[i].font_size], TRUE);\r
444                 }\r
445 #endif\r
446 #ifdef SUPPORT_DRAG_DROP\r
447                 DragAcceptFiles(hWnd, TRUE);\r
448 #endif\r
449                 break;\r
450         case WM_CLOSE:\r
451 #ifdef USE_POWER_OFF\r
452                 // notify power off\r
453                 if(emu) {\r
454                         static int notified = 0;\r
455                         if(!notified) {\r
456                                 emu->notify_power_off();\r
457                                 notified = 1;\r
458                                 return 0;\r
459                         }\r
460                 }\r
461 #endif\r
462                 // release window\r
463                 if(now_fullscreen) {\r
464                         ChangeDisplaySettings(NULL, 0);\r
465                 }\r
466                 now_fullscreen = false;\r
467 #ifdef USE_BUTTON\r
468                 for(int i = 0; i < MAX_FONT_SIZE; i++) {\r
469                         if(hFont[i]) {\r
470                                 DeleteObject(hFont[i]);\r
471                         }\r
472                 }\r
473 #endif\r
474                 if(hMenu != NULL && IsMenu(hMenu)) {\r
475                         DestroyMenu(hMenu);\r
476                 }\r
477                 DestroyWindow(hWnd);\r
478                 // release emulation core\r
479                 if(emu) {\r
480                         delete emu;\r
481                         emu = NULL;\r
482                 }\r
483                 save_config();\r
484                 return 0;\r
485         case WM_DESTROY:\r
486                 PostQuitMessage(0);\r
487                 return 0;\r
488 #ifdef USE_BITMAP\r
489         case WM_SIZE:\r
490                 if(emu) {\r
491                         emu->reload_bitmap();\r
492                 }\r
493                 break;\r
494 #endif\r
495         case WM_KILLFOCUS:\r
496                 if(emu) {\r
497                         emu->key_lost_focus();\r
498                 }\r
499                 break;\r
500         case WM_PAINT:\r
501                 if(emu) {\r
502                         PAINTSTRUCT ps;\r
503                         HDC hdc = BeginPaint(hWnd, &ps);\r
504                         emu->update_screen(hdc);\r
505                         EndPaint(hWnd, &ps);\r
506                 }\r
507                 return 0;\r
508         case WM_MOVING:\r
509                 if(emu) {\r
510                         emu->suspend();\r
511                 }\r
512                 break;\r
513         case WM_KEYDOWN:\r
514                 if(emu) {\r
515                         bool repeat = ((HIWORD(lParam) & 0x4000) != 0);\r
516                         emu->key_down(LOBYTE(wParam), repeat);\r
517                 }\r
518                 break;\r
519         case WM_KEYUP:\r
520                 if(emu) {\r
521                         emu->key_up(LOBYTE(wParam));\r
522                 }\r
523                 break;\r
524         case WM_SYSKEYDOWN:\r
525                 if(emu) {\r
526                         bool repeat = ((HIWORD(lParam) & 0x4000) != 0);\r
527                         emu->key_down(LOBYTE(wParam), repeat);\r
528                 }\r
529 #ifdef USE_ALT_F10_KEY\r
530                 return 0;       // not activate menu when hit ALT/F10\r
531 #endif\r
532                 break;\r
533         case WM_SYSKEYUP:\r
534                 if(emu) {\r
535                         emu->key_up(LOBYTE(wParam));\r
536                 }\r
537 #ifdef USE_ALT_F10_KEY\r
538                 return 0;       // not activate menu when hit ALT/F10\r
539 #endif\r
540                 break;\r
541         case WM_SYSCHAR:\r
542 #ifdef USE_ALT_F10_KEY\r
543                 return 0;       // not activate menu when hit ALT/F10\r
544 #endif\r
545                 break;\r
546         case WM_INITMENUPOPUP:\r
547                 if(emu) {\r
548                         emu->suspend();\r
549                 }\r
550                 update_menu(hWnd, (HMENU)wParam, LOWORD(lParam));\r
551                 break;\r
552         case WM_ENTERMENULOOP:\r
553                 now_menuloop = true;\r
554                 break;\r
555         case WM_EXITMENULOOP:\r
556                 if(now_fullscreen && now_menuloop) {\r
557                         hide_menu_bar(hWnd);\r
558                 }\r
559                 now_menuloop = false;\r
560                 break;\r
561         case WM_MOUSEMOVE:\r
562                 if(now_fullscreen && !now_menuloop) {\r
563                         POINTS p = MAKEPOINTS(lParam);\r
564                         if(p.y == 0) {\r
565                                 show_menu_bar(hWnd);\r
566                         } else if(p.y > 32) {\r
567                                 hide_menu_bar(hWnd);\r
568                         }\r
569                 }\r
570                 break;\r
571         case WM_RESIZE:\r
572                 if(emu) {\r
573                         if(now_fullscreen) {\r
574                                 emu->set_display_size(-1, -1, false);\r
575                         } else {\r
576                                 set_window(hWnd, config.window_mode);\r
577                         }\r
578                 }\r
579                 break;\r
580 #ifdef SUPPORT_DRAG_DROP\r
581         case WM_DROPFILES:\r
582                 if(emu) {\r
583                         HDROP hDrop = (HDROP)wParam;\r
584                         if(DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL, 0) == 1) {\r
585                                 DragQueryFile(hDrop, 0, path, _MAX_PATH);\r
586                                 open_any_file(path);\r
587                         }\r
588                         DragFinish(hDrop);\r
589                 }\r
590                 break;\r
591 #endif\r
592 #ifdef USE_SOCKET\r
593         case WM_SOCKET0:\r
594         case WM_SOCKET1:\r
595         case WM_SOCKET2:\r
596         case WM_SOCKET3:\r
597                 no = iMsg - WM_SOCKET0;\r
598                 if(!emu) {\r
599                         break;\r
600                 }\r
601                 if(WSAGETSELECTERROR(lParam) != 0) {\r
602                         emu->disconnect_socket(no);\r
603                         emu->socket_disconnected(no);\r
604                         break;\r
605                 }\r
606                 if(emu->get_socket(no) != (int)wParam) {\r
607                         break;\r
608                 }\r
609                 switch(WSAGETSELECTEVENT(lParam)) {\r
610                 case FD_CONNECT:\r
611                         emu->socket_connected(no);\r
612                         break;\r
613                 case FD_CLOSE:\r
614                         emu->socket_disconnected(no);\r
615                         break;\r
616                 case FD_WRITE:\r
617                         emu->send_data(no);\r
618                         break;\r
619                 case FD_READ:\r
620                         emu->recv_data(no);\r
621                         break;\r
622                 }\r
623                 break;\r
624 #endif\r
625         case WM_COMMAND:\r
626                 switch(LOWORD(wParam)) {\r
627                 case ID_RESET:\r
628                         if(emu) {\r
629                                 emu->reset();\r
630                         }\r
631                         break;\r
632 #ifdef USE_SPECIAL_RESET\r
633                 case ID_SPECIAL_RESET:\r
634                         if(emu) {\r
635                                 emu->special_reset();\r
636                         }\r
637                         break;\r
638 #endif\r
639 #ifdef USE_STATE\r
640                 case ID_SAVE_STATE:\r
641                         if(emu) {\r
642                                 emu->save_state();\r
643                         }\r
644                         break;\r
645                 case ID_LOAD_STATE:\r
646                         if(emu) {\r
647                                 emu->load_state();\r
648                         }\r
649                         break;\r
650 #endif\r
651 #ifdef USE_BOOT_MODE\r
652                 case ID_BOOT_MODE0:\r
653                 case ID_BOOT_MODE1:\r
654                 case ID_BOOT_MODE2:\r
655                 case ID_BOOT_MODE3:\r
656                 case ID_BOOT_MODE4:\r
657                 case ID_BOOT_MODE5:\r
658                 case ID_BOOT_MODE6:\r
659                 case ID_BOOT_MODE7:\r
660                         config.boot_mode = LOWORD(wParam) - ID_BOOT_MODE0;\r
661                         if(emu) {\r
662                                 emu->update_config();\r
663                         }\r
664                         break;\r
665 #endif\r
666 #ifdef USE_CPU_TYPE\r
667                 case ID_CPU_TYPE0:\r
668                 case ID_CPU_TYPE1:\r
669                 case ID_CPU_TYPE2:\r
670                 case ID_CPU_TYPE3:\r
671                 case ID_CPU_TYPE4:\r
672                 case ID_CPU_TYPE5:\r
673                 case ID_CPU_TYPE6:\r
674                 case ID_CPU_TYPE7:\r
675                         config.cpu_type = LOWORD(wParam) - ID_CPU_TYPE0;\r
676                         // need to recreate vm class instance\r
677 //                      if(emu) {\r
678 //                              emu->update_config();\r
679 //                      }\r
680                         break;\r
681 #endif\r
682                 case ID_CPU_POWER0:\r
683                 case ID_CPU_POWER1:\r
684                 case ID_CPU_POWER2:\r
685                 case ID_CPU_POWER3:\r
686                 case ID_CPU_POWER4:\r
687                         config.cpu_power = LOWORD(wParam) - ID_CPU_POWER0;\r
688                         if(emu) {\r
689                                 emu->update_config();\r
690                         }\r
691                         break;\r
692 #ifdef USE_DIPSWITCH\r
693                 case ID_DIPSWITCH0:\r
694                 case ID_DIPSWITCH1:\r
695                 case ID_DIPSWITCH2:\r
696                 case ID_DIPSWITCH3:\r
697                 case ID_DIPSWITCH4:\r
698                 case ID_DIPSWITCH5:\r
699                 case ID_DIPSWITCH6:\r
700                 case ID_DIPSWITCH7:\r
701                 case ID_DIPSWITCH8:\r
702                 case ID_DIPSWITCH9:\r
703                 case ID_DIPSWITCH10:\r
704                 case ID_DIPSWITCH11:\r
705                 case ID_DIPSWITCH12:\r
706                 case ID_DIPSWITCH13:\r
707                 case ID_DIPSWITCH14:\r
708                 case ID_DIPSWITCH15:\r
709                 case ID_DIPSWITCH16:\r
710                 case ID_DIPSWITCH17:\r
711                 case ID_DIPSWITCH18:\r
712                 case ID_DIPSWITCH19:\r
713                 case ID_DIPSWITCH20:\r
714                 case ID_DIPSWITCH21:\r
715                 case ID_DIPSWITCH22:\r
716                 case ID_DIPSWITCH23:\r
717                 case ID_DIPSWITCH24:\r
718                 case ID_DIPSWITCH25:\r
719                 case ID_DIPSWITCH26:\r
720                 case ID_DIPSWITCH27:\r
721                 case ID_DIPSWITCH28:\r
722                 case ID_DIPSWITCH29:\r
723                 case ID_DIPSWITCH30:\r
724                 case ID_DIPSWITCH31:\r
725                         config.dipswitch ^= (1 << (LOWORD(wParam) - ID_DIPSWITCH0));\r
726                         break;\r
727 #endif\r
728 #ifdef USE_DEVICE_TYPE\r
729                 case ID_DEVICE_TYPE0:\r
730                 case ID_DEVICE_TYPE1:\r
731                 case ID_DEVICE_TYPE2:\r
732                 case ID_DEVICE_TYPE3:\r
733                 case ID_DEVICE_TYPE4:\r
734                 case ID_DEVICE_TYPE5:\r
735                 case ID_DEVICE_TYPE6:\r
736                 case ID_DEVICE_TYPE7:\r
737                         config.device_type = LOWORD(wParam) - ID_DEVICE_TYPE0;\r
738                         break;\r
739 #endif\r
740 #ifdef USE_AUTO_KEY\r
741                 case ID_AUTOKEY_START:\r
742                         if(emu) {\r
743                                 emu->start_auto_key();\r
744                         }\r
745                         break;\r
746                 case ID_AUTOKEY_STOP:\r
747                         if(emu) {\r
748                                 emu->stop_auto_key();\r
749                         }\r
750                         break;\r
751 #endif\r
752 #ifdef USE_DEBUGGER\r
753                 case ID_OPEN_DEBUGGER0:\r
754                 case ID_OPEN_DEBUGGER1:\r
755                 case ID_OPEN_DEBUGGER2:\r
756                 case ID_OPEN_DEBUGGER3:\r
757                         if(emu) {\r
758                                 no = LOWORD(wParam) - ID_OPEN_DEBUGGER0;\r
759                                 emu->open_debugger(no);\r
760                         }\r
761                         break;\r
762                 case ID_CLOSE_DEBUGGER:\r
763                         if(emu) {\r
764                                 emu->close_debugger();\r
765                         }\r
766                         break;\r
767 #endif\r
768                 case ID_EXIT:\r
769                         SendMessage(hWnd, WM_CLOSE, 0, 0L);\r
770                         break;\r
771 #ifdef USE_CART1\r
772                 #define CART_MENU_ITEMS(drv, ID_OPEN_CART, ID_CLOSE_CART, ID_RECENT_CART) \\r
773                 case ID_OPEN_CART: \\r
774                         if(emu) { \\r
775                                 open_cart_dialog(hWnd, drv); \\r
776                         } \\r
777                         break; \\r
778                 case ID_CLOSE_CART: \\r
779                         if(emu) { \\r
780                                 emu->close_cart(drv); \\r
781                         } \\r
782                         break; \\r
783                 case ID_RECENT_CART + 0: \\r
784                 case ID_RECENT_CART + 1: \\r
785                 case ID_RECENT_CART + 2: \\r
786                 case ID_RECENT_CART + 3: \\r
787                 case ID_RECENT_CART + 4: \\r
788                 case ID_RECENT_CART + 5: \\r
789                 case ID_RECENT_CART + 6: \\r
790                 case ID_RECENT_CART + 7: \\r
791                         no = LOWORD(wParam) - ID_RECENT_CART; \\r
792                         _tcscpy_s(path, _MAX_PATH, config.recent_cart_path[drv][no]); \\r
793                         for(int i = no; i > 0; i--) { \\r
794                                 _tcscpy_s(config.recent_cart_path[drv][i], _MAX_PATH, config.recent_cart_path[drv][i - 1]); \\r
795                         } \\r
796                         _tcscpy_s(config.recent_cart_path[drv][0], _MAX_PATH, path); \\r
797                         if(emu) { \\r
798                                 emu->open_cart(drv, path); \\r
799                         } \\r
800                         break;\r
801                 CART_MENU_ITEMS(0, ID_OPEN_CART1, ID_CLOSE_CART1, ID_RECENT_CART1)\r
802 #endif\r
803 #ifdef USE_CART2\r
804                 CART_MENU_ITEMS(1, ID_OPEN_CART2, ID_CLOSE_CART2, ID_RECENT_CART2)\r
805 #endif\r
806 #ifdef USE_FD1\r
807                 #define FD_MENU_ITEMS(drv, ID_OPEN_FD, ID_CLOSE_FD, ID_RECENT_FD, ID_SELECT_D88_BANK) \\r
808                 case ID_OPEN_FD: \\r
809                         if(emu) { \\r
810                                 open_disk_dialog(hWnd, drv); \\r
811                         } \\r
812                         break; \\r
813                 case ID_CLOSE_FD: \\r
814                         if(emu) { \\r
815                                 close_disk(drv); \\r
816                         } \\r
817                         break; \\r
818                 case ID_RECENT_FD + 0: \\r
819                 case ID_RECENT_FD + 1: \\r
820                 case ID_RECENT_FD + 2: \\r
821                 case ID_RECENT_FD + 3: \\r
822                 case ID_RECENT_FD + 4: \\r
823                 case ID_RECENT_FD + 5: \\r
824                 case ID_RECENT_FD + 6: \\r
825                 case ID_RECENT_FD + 7: \\r
826                         no = LOWORD(wParam) - ID_RECENT_FD; \\r
827                         _tcscpy_s(path, _MAX_PATH, config.recent_disk_path[drv][no]); \\r
828                         for(int i = no; i > 0; i--) { \\r
829                                 _tcscpy_s(config.recent_disk_path[drv][i], _MAX_PATH, config.recent_disk_path[drv][i - 1]); \\r
830                         } \\r
831                         _tcscpy_s(config.recent_disk_path[drv][0], _MAX_PATH, path); \\r
832                         if(emu) { \\r
833                                 open_disk(drv, path, 0); \\r
834                         } \\r
835                         break; \\r
836                 case ID_SELECT_D88_BANK +  0: \\r
837                 case ID_SELECT_D88_BANK +  1: \\r
838                 case ID_SELECT_D88_BANK +  2: \\r
839                 case ID_SELECT_D88_BANK +  3: \\r
840                 case ID_SELECT_D88_BANK +  4: \\r
841                 case ID_SELECT_D88_BANK +  5: \\r
842                 case ID_SELECT_D88_BANK +  6: \\r
843                 case ID_SELECT_D88_BANK +  7: \\r
844                 case ID_SELECT_D88_BANK +  8: \\r
845                 case ID_SELECT_D88_BANK +  9: \\r
846                 case ID_SELECT_D88_BANK + 10: \\r
847                 case ID_SELECT_D88_BANK + 11: \\r
848                 case ID_SELECT_D88_BANK + 12: \\r
849                 case ID_SELECT_D88_BANK + 13: \\r
850                 case ID_SELECT_D88_BANK + 14: \\r
851                 case ID_SELECT_D88_BANK + 15: \\r
852                 case ID_SELECT_D88_BANK + 16: \\r
853                 case ID_SELECT_D88_BANK + 17: \\r
854                 case ID_SELECT_D88_BANK + 18: \\r
855                 case ID_SELECT_D88_BANK + 19: \\r
856                 case ID_SELECT_D88_BANK + 20: \\r
857                 case ID_SELECT_D88_BANK + 21: \\r
858                 case ID_SELECT_D88_BANK + 22: \\r
859                 case ID_SELECT_D88_BANK + 23: \\r
860                 case ID_SELECT_D88_BANK + 24: \\r
861                 case ID_SELECT_D88_BANK + 25: \\r
862                 case ID_SELECT_D88_BANK + 26: \\r
863                 case ID_SELECT_D88_BANK + 27: \\r
864                 case ID_SELECT_D88_BANK + 28: \\r
865                 case ID_SELECT_D88_BANK + 29: \\r
866                 case ID_SELECT_D88_BANK + 30: \\r
867                 case ID_SELECT_D88_BANK + 31: \\r
868                 case ID_SELECT_D88_BANK + 32: \\r
869                 case ID_SELECT_D88_BANK + 33: \\r
870                 case ID_SELECT_D88_BANK + 34: \\r
871                 case ID_SELECT_D88_BANK + 35: \\r
872                 case ID_SELECT_D88_BANK + 36: \\r
873                 case ID_SELECT_D88_BANK + 37: \\r
874                 case ID_SELECT_D88_BANK + 38: \\r
875                 case ID_SELECT_D88_BANK + 39: \\r
876                 case ID_SELECT_D88_BANK + 40: \\r
877                 case ID_SELECT_D88_BANK + 41: \\r
878                 case ID_SELECT_D88_BANK + 42: \\r
879                 case ID_SELECT_D88_BANK + 43: \\r
880                 case ID_SELECT_D88_BANK + 44: \\r
881                 case ID_SELECT_D88_BANK + 45: \\r
882                 case ID_SELECT_D88_BANK + 46: \\r
883                 case ID_SELECT_D88_BANK + 47: \\r
884                 case ID_SELECT_D88_BANK + 48: \\r
885                 case ID_SELECT_D88_BANK + 49: \\r
886                 case ID_SELECT_D88_BANK + 50: \\r
887                 case ID_SELECT_D88_BANK + 51: \\r
888                 case ID_SELECT_D88_BANK + 52: \\r
889                 case ID_SELECT_D88_BANK + 53: \\r
890                 case ID_SELECT_D88_BANK + 54: \\r
891                 case ID_SELECT_D88_BANK + 55: \\r
892                 case ID_SELECT_D88_BANK + 56: \\r
893                 case ID_SELECT_D88_BANK + 57: \\r
894                 case ID_SELECT_D88_BANK + 58: \\r
895                 case ID_SELECT_D88_BANK + 59: \\r
896                 case ID_SELECT_D88_BANK + 60: \\r
897                 case ID_SELECT_D88_BANK + 61: \\r
898                 case ID_SELECT_D88_BANK + 62: \\r
899                 case ID_SELECT_D88_BANK + 63: \\r
900                         no = LOWORD(wParam) - ID_SELECT_D88_BANK; \\r
901                         if(emu && emu->d88_file[drv].cur_bank != no) { \\r
902                                 emu->open_disk(drv, emu->d88_file[drv].path, emu->d88_file[drv].bank[no].offset); \\r
903                                 emu->d88_file[drv].cur_bank = no; \\r
904                         } \\r
905                         break;\r
906                 FD_MENU_ITEMS(0, ID_OPEN_FD1, ID_CLOSE_FD1, ID_RECENT_FD1, ID_SELECT_D88_BANK1)\r
907 #endif\r
908 #ifdef USE_FD2\r
909                 FD_MENU_ITEMS(1, ID_OPEN_FD2, ID_CLOSE_FD2, ID_RECENT_FD2, ID_SELECT_D88_BANK2)\r
910 #endif\r
911 #ifdef USE_FD3\r
912                 FD_MENU_ITEMS(2, ID_OPEN_FD3, ID_CLOSE_FD3, ID_RECENT_FD3, ID_SELECT_D88_BANK3)\r
913 #endif\r
914 #ifdef USE_FD4\r
915                 FD_MENU_ITEMS(3, ID_OPEN_FD4, ID_CLOSE_FD4, ID_RECENT_FD4, ID_SELECT_D88_BANK4)\r
916 #endif\r
917 #ifdef USE_FD5\r
918                 FD_MENU_ITEMS(4, ID_OPEN_FD5, ID_CLOSE_FD5, ID_RECENT_FD5, ID_SELECT_D88_BANK5)\r
919 #endif\r
920 #ifdef USE_FD6\r
921                 FD_MENU_ITEMS(5, ID_OPEN_FD6, ID_CLOSE_FD6, ID_RECENT_FD6, ID_SELECT_D88_BANK6)\r
922 #endif\r
923 #ifdef USE_FD7\r
924                 FD_MENU_ITEMS(6, ID_OPEN_FD7, ID_CLOSE_FD7, ID_RECENT_FD7, ID_SELECT_D88_BANK7)\r
925 #endif\r
926 #ifdef USE_FD8\r
927                 FD_MENU_ITEMS(7, ID_OPEN_FD8, ID_CLOSE_FD8, ID_RECENT_FD8, ID_SELECT_D88_BANK8)\r
928 #endif\r
929 #ifdef USE_QD1\r
930                 #define QD_MENU_ITEMS(drv, ID_OPEN_QD, ID_CLOSE_QD, ID_RECENT_QD) \\r
931                 case ID_OPEN_QD: \\r
932                         if(emu) { \\r
933                                 open_quickdisk_dialog(hWnd, drv); \\r
934                         } \\r
935                         break; \\r
936                 case ID_CLOSE_QD: \\r
937                         if(emu) { \\r
938                                 emu->close_quickdisk(drv); \\r
939                         } \\r
940                         break; \\r
941                 case ID_RECENT_QD + 0: \\r
942                 case ID_RECENT_QD + 1: \\r
943                 case ID_RECENT_QD + 2: \\r
944                 case ID_RECENT_QD + 3: \\r
945                 case ID_RECENT_QD + 4: \\r
946                 case ID_RECENT_QD + 5: \\r
947                 case ID_RECENT_QD + 6: \\r
948                 case ID_RECENT_QD + 7: \\r
949                         no = LOWORD(wParam) - ID_RECENT_QD; \\r
950                         _tcscpy_s(path, _MAX_PATH, config.recent_quickdisk_path[drv][no]); \\r
951                         for(int i = no; i > 0; i--) { \\r
952                                 _tcscpy_s(config.recent_quickdisk_path[drv][i], _MAX_PATH, config.recent_quickdisk_path[drv][i - 1]); \\r
953                         } \\r
954                         _tcscpy_s(config.recent_quickdisk_path[drv][0], _MAX_PATH, path); \\r
955                         if(emu) { \\r
956                                 emu->open_quickdisk(drv, path); \\r
957                         } \\r
958                         break;\r
959                 QD_MENU_ITEMS(0, ID_OPEN_QD1, ID_CLOSE_QD1, ID_RECENT_QD1)\r
960 #endif\r
961 #ifdef USE_QD2\r
962                 QD_MENU_ITEMS(1, ID_OPEN_QD2, ID_CLOSE_QD2, ID_RECENT_QD2)\r
963 #endif\r
964 #ifdef USE_TAPE\r
965                 case ID_PLAY_TAPE:\r
966                         if(emu) {\r
967                                 open_tape_dialog(hWnd, true);\r
968                         }\r
969                         break;\r
970                 case ID_REC_TAPE:\r
971                         if(emu) {\r
972                                 open_tape_dialog(hWnd, false);\r
973                         }\r
974                         break;\r
975                 case ID_CLOSE_TAPE:\r
976                         if(emu) {\r
977                                 emu->close_tape();\r
978                         }\r
979                         break;\r
980                 case ID_USE_WAVE_SHAPER:\r
981                         config.wave_shaper = !config.wave_shaper;\r
982                         break;\r
983                 case ID_DIRECT_LOAD_MZT:\r
984                         config.direct_load_mzt = !config.direct_load_mzt;\r
985                         break;\r
986                 case ID_RECENT_TAPE + 0:\r
987                 case ID_RECENT_TAPE + 1:\r
988                 case ID_RECENT_TAPE + 2:\r
989                 case ID_RECENT_TAPE + 3:\r
990                 case ID_RECENT_TAPE + 4:\r
991                 case ID_RECENT_TAPE + 5:\r
992                 case ID_RECENT_TAPE + 6:\r
993                 case ID_RECENT_TAPE + 7:\r
994                         no = LOWORD(wParam) - ID_RECENT_TAPE;\r
995                         _tcscpy_s(path, _MAX_PATH, config.recent_tape_path[no]);\r
996                         for(int i = no; i > 0; i--) {\r
997                                 _tcscpy_s(config.recent_tape_path[i], _MAX_PATH, config.recent_tape_path[i - 1]);\r
998                         }\r
999                         _tcscpy_s(config.recent_tape_path[0], _MAX_PATH, path);\r
1000                         if(emu) {\r
1001                                 emu->play_tape(path);\r
1002                         }\r
1003                         break;\r
1004 #endif\r
1005 #ifdef USE_TAPE_BUTTON\r
1006                 case ID_PLAY_BUTTON:\r
1007                         if(emu) {\r
1008                                 emu->push_play();\r
1009                         }\r
1010                         break;\r
1011                 case ID_STOP_BUTTON:\r
1012                         if(emu) {\r
1013                                 emu->push_stop();\r
1014                         }\r
1015                         break;\r
1016 #endif\r
1017 #ifdef USE_LASER_DISC\r
1018                 case ID_OPEN_LASER_DISC:\r
1019                         if(emu) {\r
1020                                 open_laser_disc_dialog(hWnd);\r
1021                         }\r
1022                         break;\r
1023                 case ID_CLOSE_LASER_DISC:\r
1024                         if(emu) {\r
1025                                 emu->close_laser_disc();\r
1026                         }\r
1027                         break;\r
1028                 case ID_RECENT_LASER_DISC + 0:\r
1029                 case ID_RECENT_LASER_DISC + 1:\r
1030                 case ID_RECENT_LASER_DISC + 2:\r
1031                 case ID_RECENT_LASER_DISC + 3:\r
1032                 case ID_RECENT_LASER_DISC + 4:\r
1033                 case ID_RECENT_LASER_DISC + 5:\r
1034                 case ID_RECENT_LASER_DISC + 6:\r
1035                 case ID_RECENT_LASER_DISC + 7:\r
1036                         no = LOWORD(wParam) - ID_RECENT_LASER_DISC;\r
1037                         _tcscpy_s(path, _MAX_PATH, config.recent_laser_disc_path[no]);\r
1038                         for(int i = no; i > 0; i--) {\r
1039                                 _tcscpy_s(config.recent_laser_disc_path[i], _MAX_PATH, config.recent_laser_disc_path[i - 1]);\r
1040                         }\r
1041                         _tcscpy_s(config.recent_laser_disc_path[0], _MAX_PATH, path);\r
1042                         if(emu) {\r
1043                                 emu->open_laser_disc(path);\r
1044                         }\r
1045                         break;\r
1046 #endif\r
1047 #ifdef USE_BINARY_FILE1\r
1048                 #define BINARY_MENU_ITEMS(drv, ID_LOAD_BINARY, ID_SAVE_BINARY, ID_RECENT_BINARY) \\r
1049                 case ID_LOAD_BINARY: \\r
1050                         if(emu) { \\r
1051                                 open_binary_dialog(hWnd, drv, true); \\r
1052                         } \\r
1053                         break; \\r
1054                 case ID_SAVE_BINARY: \\r
1055                         if(emu) { \\r
1056                                 open_binary_dialog(hWnd, drv, false); \\r
1057                         } \\r
1058                         break; \\r
1059                 case ID_RECENT_BINARY + 0: \\r
1060                 case ID_RECENT_BINARY + 1: \\r
1061                 case ID_RECENT_BINARY + 2: \\r
1062                 case ID_RECENT_BINARY + 3: \\r
1063                 case ID_RECENT_BINARY + 4: \\r
1064                 case ID_RECENT_BINARY + 5: \\r
1065                 case ID_RECENT_BINARY + 6: \\r
1066                 case ID_RECENT_BINARY + 7: \\r
1067                         no = LOWORD(wParam) - ID_RECENT_BINARY; \\r
1068                         _tcscpy_s(path, _MAX_PATH, config.recent_binary_path[drv][no]); \\r
1069                         for(int i = no; i > 0; i--) { \\r
1070                                 _tcscpy_s(config.recent_binary_path[drv][i], _MAX_PATH, config.recent_binary_path[drv][i - 1]); \\r
1071                         } \\r
1072                         _tcscpy_s(config.recent_binary_path[drv][0], _MAX_PATH, path); \\r
1073                         if(emu) { \\r
1074                                 emu->load_binary(drv, path); \\r
1075                         } \\r
1076                         break;\r
1077                 BINARY_MENU_ITEMS(0, ID_LOAD_BINARY1, ID_SAVE_BINARY1, ID_RECENT_BINARY1)\r
1078 #endif\r
1079 #ifdef USE_BINARY_FILE2\r
1080                 BINARY_MENU_ITEMS(1, ID_LOAD_BINARY2, ID_SAVE_BINARY2, ID_RECENT_BINARY2)\r
1081 #endif\r
1082                 case ID_SCREEN_REC60:\r
1083                 case ID_SCREEN_REC30:\r
1084                 case ID_SCREEN_REC15:\r
1085                         if(emu) {\r
1086                                 static const int fps[3] = {60, 30, 15};\r
1087                                 no = LOWORD(wParam) - ID_SCREEN_REC60;\r
1088                                 emu->start_rec_sound();\r
1089                                 if(!emu->start_rec_video(fps[no])) {\r
1090                                         emu->stop_rec_sound();\r
1091                                 }\r
1092                         }\r
1093                         break;\r
1094                 case ID_SCREEN_STOP:\r
1095                         if(emu) {\r
1096                                 emu->stop_rec_video();\r
1097                                 emu->stop_rec_sound();\r
1098                         }\r
1099                         break;\r
1100                 case ID_SCREEN_CAPTURE:\r
1101                         if(emu) {\r
1102                                 emu->capture_screen();\r
1103                         }\r
1104                         break;\r
1105                 case ID_SCREEN_WINDOW1:\r
1106                 case ID_SCREEN_WINDOW2:\r
1107                 case ID_SCREEN_WINDOW3:\r
1108                 case ID_SCREEN_WINDOW4:\r
1109                 case ID_SCREEN_WINDOW5:\r
1110                 case ID_SCREEN_WINDOW6:\r
1111                 case ID_SCREEN_WINDOW7:\r
1112                 case ID_SCREEN_WINDOW8:\r
1113                         if(emu) {\r
1114                                 set_window(hWnd, LOWORD(wParam) - ID_SCREEN_WINDOW1);\r
1115                         }\r
1116                         break;\r
1117                 case ID_SCREEN_FULLSCREEN1:\r
1118                 case ID_SCREEN_FULLSCREEN2:\r
1119                 case ID_SCREEN_FULLSCREEN3:\r
1120                 case ID_SCREEN_FULLSCREEN4:\r
1121                 case ID_SCREEN_FULLSCREEN5:\r
1122                 case ID_SCREEN_FULLSCREEN6:\r
1123                 case ID_SCREEN_FULLSCREEN7:\r
1124                 case ID_SCREEN_FULLSCREEN8:\r
1125                 case ID_SCREEN_FULLSCREEN9:\r
1126                 case ID_SCREEN_FULLSCREEN10:\r
1127                 case ID_SCREEN_FULLSCREEN11:\r
1128                 case ID_SCREEN_FULLSCREEN12:\r
1129                 case ID_SCREEN_FULLSCREEN13:\r
1130                 case ID_SCREEN_FULLSCREEN14:\r
1131                 case ID_SCREEN_FULLSCREEN15:\r
1132                 case ID_SCREEN_FULLSCREEN16:\r
1133                 case ID_SCREEN_FULLSCREEN17:\r
1134                 case ID_SCREEN_FULLSCREEN18:\r
1135                 case ID_SCREEN_FULLSCREEN19:\r
1136                 case ID_SCREEN_FULLSCREEN20:\r
1137                 case ID_SCREEN_FULLSCREEN21:\r
1138                 case ID_SCREEN_FULLSCREEN22:\r
1139                 case ID_SCREEN_FULLSCREEN23:\r
1140                 case ID_SCREEN_FULLSCREEN24:\r
1141                 case ID_SCREEN_FULLSCREEN25:\r
1142                 case ID_SCREEN_FULLSCREEN26:\r
1143                 case ID_SCREEN_FULLSCREEN27:\r
1144                 case ID_SCREEN_FULLSCREEN28:\r
1145                 case ID_SCREEN_FULLSCREEN29:\r
1146                 case ID_SCREEN_FULLSCREEN30:\r
1147                 case ID_SCREEN_FULLSCREEN31:\r
1148                 case ID_SCREEN_FULLSCREEN32:\r
1149                         if(emu && !now_fullscreen) {\r
1150                                 set_window(hWnd, LOWORD(wParam) - ID_SCREEN_FULLSCREEN1 + MAX_WINDOW);\r
1151                         }\r
1152                         break;\r
1153                 case ID_SCREEN_USE_D3D9:\r
1154                         config.use_d3d9 = !config.use_d3d9;\r
1155                         if(emu) {\r
1156                                 emu->set_display_size(-1, -1, !now_fullscreen);\r
1157                         }\r
1158                         break;\r
1159                 case ID_SCREEN_WAIT_VSYNC:\r
1160                         config.wait_vsync = !config.wait_vsync;\r
1161                         if(emu) {\r
1162                                 emu->set_display_size(-1, -1, !now_fullscreen);\r
1163                         }\r
1164                         break;\r
1165                 case ID_SCREEN_STRETCH_DOT:\r
1166                 case ID_SCREEN_STRETCH_ASPECT:\r
1167                 case ID_SCREEN_STRETCH_FILL:\r
1168                         config.stretch_type = LOWORD(wParam) - ID_SCREEN_STRETCH_DOT;\r
1169                         if(emu) {\r
1170                                 emu->set_display_size(-1, -1, !now_fullscreen);\r
1171                         }\r
1172                         break;\r
1173                 // accelerator\r
1174                 case ID_ACCEL_SCREEN:\r
1175                         if(emu) {\r
1176                                 emu->suspend();\r
1177                                 set_window(hWnd, now_fullscreen ? prev_window_mode : -1);\r
1178                         }\r
1179                         break;\r
1180                 case ID_ACCEL_MOUSE:\r
1181                         if(emu) {\r
1182                                 emu->toggle_mouse();\r
1183                         }\r
1184                         break;\r
1185 #ifdef USE_MONITOR_TYPE\r
1186                 case ID_SCREEN_MONITOR_TYPE0:\r
1187                 case ID_SCREEN_MONITOR_TYPE1:\r
1188                 case ID_SCREEN_MONITOR_TYPE2:\r
1189                 case ID_SCREEN_MONITOR_TYPE3:\r
1190                 case ID_SCREEN_MONITOR_TYPE4:\r
1191                 case ID_SCREEN_MONITOR_TYPE5:\r
1192                 case ID_SCREEN_MONITOR_TYPE6:\r
1193                 case ID_SCREEN_MONITOR_TYPE7:\r
1194                         config.monitor_type = LOWORD(wParam) - ID_SCREEN_MONITOR_TYPE0;\r
1195                         if(emu) {\r
1196                                 emu->update_config();\r
1197 #ifdef USE_SCREEN_ROTATE\r
1198                                 if(now_fullscreen) {\r
1199                                         emu->set_display_size(-1, -1, false);\r
1200                                 } else {\r
1201                                         set_window(hWnd, prev_window_mode);\r
1202                                 }\r
1203 #endif\r
1204                         }\r
1205                         break;\r
1206 #endif\r
1207 #ifdef USE_CRT_FILTER\r
1208                 case ID_SCREEN_CRT_FILTER:\r
1209                         config.crt_filter = !config.crt_filter;\r
1210                         break;\r
1211 #endif\r
1212 #ifdef USE_SCANLINE\r
1213                 case ID_SCREEN_SCANLINE:\r
1214                         config.scan_line = !config.scan_line;\r
1215                         if(emu) {\r
1216                                 emu->update_config();\r
1217                         }\r
1218                         break;\r
1219 #endif\r
1220                 case ID_SOUND_REC:\r
1221                         if(emu) {\r
1222                                 emu->start_rec_sound();\r
1223                         }\r
1224                         break;\r
1225                 case ID_SOUND_STOP:\r
1226                         if(emu) {\r
1227                                 emu->stop_rec_sound();\r
1228                         }\r
1229                         break;\r
1230                 case ID_SOUND_FREQ0:\r
1231                 case ID_SOUND_FREQ1:\r
1232                 case ID_SOUND_FREQ2:\r
1233                 case ID_SOUND_FREQ3:\r
1234                 case ID_SOUND_FREQ4:\r
1235                 case ID_SOUND_FREQ5:\r
1236                 case ID_SOUND_FREQ6:\r
1237                 case ID_SOUND_FREQ7:\r
1238                         config.sound_frequency = LOWORD(wParam) - ID_SOUND_FREQ0;\r
1239                         if(emu) {\r
1240                                 emu->update_config();\r
1241                         }\r
1242                         break;\r
1243                 case ID_SOUND_LATE0:\r
1244                 case ID_SOUND_LATE1:\r
1245                 case ID_SOUND_LATE2:\r
1246                 case ID_SOUND_LATE3:\r
1247                 case ID_SOUND_LATE4:\r
1248                         config.sound_latency = LOWORD(wParam) - ID_SOUND_LATE0;\r
1249                         if(emu) {\r
1250                                 emu->update_config();\r
1251                         }\r
1252                         break;\r
1253 #ifdef USE_SOUND_DEVICE_TYPE\r
1254                 case ID_SOUND_DEVICE_TYPE0:\r
1255                 case ID_SOUND_DEVICE_TYPE1:\r
1256                 case ID_SOUND_DEVICE_TYPE2:\r
1257                 case ID_SOUND_DEVICE_TYPE3:\r
1258                 case ID_SOUND_DEVICE_TYPE4:\r
1259                 case ID_SOUND_DEVICE_TYPE5:\r
1260                 case ID_SOUND_DEVICE_TYPE6:\r
1261                 case ID_SOUND_DEVICE_TYPE7:\r
1262                         config.sound_device_type = LOWORD(wParam) - ID_SOUND_DEVICE_TYPE0;\r
1263                         //if(emu) {\r
1264                         //      emu->update_config();\r
1265                         //}\r
1266                         break;\r
1267 #endif\r
1268 #ifdef USE_VIDEO_CAPTURE\r
1269                 case ID_CAPTURE_FILTER:\r
1270                         if(emu) {\r
1271                                 emu->show_capture_dev_filter();\r
1272                         }\r
1273                         break;\r
1274                 case ID_CAPTURE_PIN:\r
1275                         if(emu) {\r
1276                                 emu->show_capture_dev_pin();\r
1277                         }\r
1278                         break;\r
1279                 case ID_CAPTURE_SOURCE:\r
1280                         if(emu) {\r
1281                                 emu->show_capture_dev_source();\r
1282                         }\r
1283                         break;\r
1284                 case ID_CAPTURE_CLOSE:\r
1285                         if(emu) {\r
1286                                 emu->close_capture_dev();\r
1287                         }\r
1288                         break;\r
1289                 case ID_CAPTURE_DEVICE1:\r
1290                 case ID_CAPTURE_DEVICE2:\r
1291                 case ID_CAPTURE_DEVICE3:\r
1292                 case ID_CAPTURE_DEVICE4:\r
1293                 case ID_CAPTURE_DEVICE5:\r
1294                 case ID_CAPTURE_DEVICE6:\r
1295                 case ID_CAPTURE_DEVICE7:\r
1296                 case ID_CAPTURE_DEVICE8:\r
1297                         no = LOWORD(wParam) - ID_CAPTURE_DEVICE1;\r
1298                         if(emu) {\r
1299                                 emu->open_capture_dev(no, false);\r
1300                         }\r
1301                         break;\r
1302 #endif\r
1303 #ifdef USE_BUTTON\r
1304                 case ID_BUTTON +  0:\r
1305                 case ID_BUTTON +  1:\r
1306                 case ID_BUTTON +  2:\r
1307                 case ID_BUTTON +  3:\r
1308                 case ID_BUTTON +  4:\r
1309                 case ID_BUTTON +  5:\r
1310                 case ID_BUTTON +  6:\r
1311                 case ID_BUTTON +  7:\r
1312                 case ID_BUTTON +  8:\r
1313                 case ID_BUTTON +  9:\r
1314                 case ID_BUTTON + 10:\r
1315                 case ID_BUTTON + 11:\r
1316                 case ID_BUTTON + 12:\r
1317                 case ID_BUTTON + 13:\r
1318                 case ID_BUTTON + 14:\r
1319                 case ID_BUTTON + 15:\r
1320                 case ID_BUTTON + 16:\r
1321                 case ID_BUTTON + 17:\r
1322                 case ID_BUTTON + 18:\r
1323                 case ID_BUTTON + 19:\r
1324                 case ID_BUTTON + 20:\r
1325                 case ID_BUTTON + 21:\r
1326                 case ID_BUTTON + 22:\r
1327                 case ID_BUTTON + 23:\r
1328                 case ID_BUTTON + 24:\r
1329                 case ID_BUTTON + 25:\r
1330                 case ID_BUTTON + 26:\r
1331                 case ID_BUTTON + 27:\r
1332                 case ID_BUTTON + 28:\r
1333                 case ID_BUTTON + 29:\r
1334                 case ID_BUTTON + 30:\r
1335                 case ID_BUTTON + 31:\r
1336                         if(emu) {\r
1337                                 emu->press_button(LOWORD(wParam) - ID_BUTTON);\r
1338                         }\r
1339                         break;\r
1340 #endif\r
1341                 }\r
1342                 break;\r
1343         }\r
1344         return DefWindowProc(hWnd, iMsg, wParam, lParam) ;\r
1345 }\r
1346 \r
1347 #ifdef USE_BUTTON\r
1348 LRESULT CALLBACK ButtonWndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)\r
1349 {\r
1350         for(int i = 0; i < MAX_BUTTONS; i++) {\r
1351                 if(hWnd == hButton[i]) {\r
1352                         switch(iMsg) {\r
1353                         case WM_KEYDOWN:\r
1354                         case WM_SYSKEYDOWN:\r
1355                                 if(emu) {\r
1356                                         emu->key_down(LOBYTE(wParam), false);\r
1357                                 }\r
1358                                 return 0;\r
1359                         case WM_KEYUP:\r
1360                         case WM_SYSKEYUP:\r
1361                                 if(emu) {\r
1362                                         emu->key_up(LOBYTE(wParam));\r
1363                                 }\r
1364                                 return 0;\r
1365                         }\r
1366                         return CallWindowProc(buttonWndProc[i], hWnd, iMsg, wParam, lParam);\r
1367                 }\r
1368         }\r
1369         return 0;\r
1370 }\r
1371 #endif\r
1372 \r
1373 void update_menu(HWND hWnd, HMENU hMenu, int pos)\r
1374 {\r
1375 #ifdef MENU_POS_CONTROL\r
1376         if(pos == MENU_POS_CONTROL) {\r
1377                 // control menu\r
1378 #ifdef USE_BOOT_MODE\r
1379                 if(config.boot_mode >= 0 && config.boot_mode < USE_BOOT_MODE) {\r
1380                         CheckMenuRadioItem(hMenu, ID_BOOT_MODE0, ID_BOOT_MODE0 + USE_BOOT_MODE - 1, ID_BOOT_MODE0 + config.boot_mode, MF_BYCOMMAND);\r
1381                 }\r
1382 #endif\r
1383 #ifdef USE_CPU_TYPE\r
1384                 if(config.cpu_type >= 0 && config.cpu_type < USE_CPU_TYPE) {\r
1385                         CheckMenuRadioItem(hMenu, ID_CPU_TYPE0, ID_CPU_TYPE0 + USE_CPU_TYPE - 1, ID_CPU_TYPE0 + config.cpu_type, MF_BYCOMMAND);\r
1386                 }\r
1387 #endif\r
1388                 if(config.cpu_power >= 0 && config.cpu_power < 5) {\r
1389                         CheckMenuRadioItem(hMenu, ID_CPU_POWER0, ID_CPU_POWER4, ID_CPU_POWER0 + config.cpu_power, MF_BYCOMMAND);\r
1390                 }\r
1391 #ifdef USE_DIPSWITCH\r
1392                 for(int i = 0; i < 32; i++) {\r
1393                         CheckMenuItem(hMenu, ID_DIPSWITCH0 + i, (config.dipswitch & (1 << i)) ? MF_CHECKED : MF_UNCHECKED);\r
1394                 }\r
1395 #endif\r
1396 #ifdef USE_DEVICE_TYPE\r
1397                 if(config.device_type >= 0 && config.device_type < USE_DEVICE_TYPE) {\r
1398                         CheckMenuRadioItem(hMenu, ID_DEVICE_TYPE0, ID_DEVICE_TYPE0 + USE_DEVICE_TYPE - 1, ID_DEVICE_TYPE0 + config.device_type, MF_BYCOMMAND);\r
1399                 }\r
1400 #endif\r
1401 #ifdef USE_AUTO_KEY\r
1402                 // auto key\r
1403                 bool now_paste = true, now_stop = true;\r
1404                 if(emu) {\r
1405                         now_paste = emu->now_auto_key();\r
1406                         now_stop = !now_paste;\r
1407                 }\r
1408                 EnableMenuItem(hMenu, ID_AUTOKEY_START, now_paste ? MF_GRAYED : MF_ENABLED);\r
1409                 EnableMenuItem(hMenu, ID_AUTOKEY_STOP, now_stop ? MF_GRAYED : MF_ENABLED);\r
1410 #endif\r
1411 #ifdef USE_DEBUGGER\r
1412                 // debugger\r
1413                 EnableMenuItem(hMenu, ID_OPEN_DEBUGGER0, emu && !emu->now_debugging && emu->debugger_enabled(0) ? MF_ENABLED : MF_GRAYED);\r
1414                 EnableMenuItem(hMenu, ID_OPEN_DEBUGGER1, emu && !emu->now_debugging && emu->debugger_enabled(1) ? MF_ENABLED : MF_GRAYED);\r
1415                 EnableMenuItem(hMenu, ID_OPEN_DEBUGGER2, emu && !emu->now_debugging && emu->debugger_enabled(2) ? MF_ENABLED : MF_GRAYED);\r
1416                 EnableMenuItem(hMenu, ID_OPEN_DEBUGGER3, emu && !emu->now_debugging && emu->debugger_enabled(3) ? MF_ENABLED : MF_GRAYED);\r
1417                 EnableMenuItem(hMenu, ID_CLOSE_DEBUGGER, emu &&  emu->now_debugging                             ? MF_ENABLED : MF_GRAYED);\r
1418 #endif\r
1419         }\r
1420 #endif\r
1421 #ifdef MENU_POS_CART1\r
1422         else if(pos == MENU_POS_CART1) {\r
1423                 #define UPDATE_MENU_CART(drv, ID_RECENT_CART, ID_CLOSE_CART) \\r
1424                 bool flag = false; \\r
1425                 for(int i = 0; i < MAX_HISTORY; i++) { \\r
1426                         DeleteMenu(hMenu, ID_RECENT_CART + i, MF_BYCOMMAND); \\r
1427                 } \\r
1428                 for(int i = 0; i < MAX_HISTORY; i++) { \\r
1429                         if(_tcsicmp(config.recent_cart_path[drv][i], _T(""))) { \\r
1430                                 AppendMenu(hMenu, MF_STRING, ID_RECENT_CART + i, config.recent_cart_path[drv][i]); \\r
1431                                 flag = true; \\r
1432                         } \\r
1433                 } \\r
1434                 if(!flag) { \\r
1435                         AppendMenu(hMenu, MF_GRAYED | MF_STRING, ID_RECENT_CART, _T("None")); \\r
1436                 } \\r
1437                 EnableMenuItem(hMenu, ID_CLOSE_CART, emu->cart_inserted(drv) ? MF_ENABLED : MF_GRAYED);\r
1438                 // cart slot #1\r
1439                 UPDATE_MENU_CART(0, ID_RECENT_CART1, ID_CLOSE_CART1)\r
1440         }\r
1441 #endif\r
1442 #ifdef MENU_POS_CART2\r
1443         else if(pos == MENU_POS_CART2) {\r
1444                 // cart slot #2\r
1445                 UPDATE_MENU_CART(1, ID_RECENT_CART2, ID_CLOSE_CART2)\r
1446         }\r
1447 #endif\r
1448 #ifdef MENU_POS_FD1\r
1449         else if(pos == MENU_POS_FD1) {\r
1450                 #define UPDATE_MENU_FD(drv, ID_RECENT_FD, ID_D88_FILE_PATH, ID_SELECT_D88_BANK, ID_CLOSE_FD) \\r
1451                 bool flag = false; \\r
1452                 while(DeleteMenu(hMenu, 3, MF_BYPOSITION) != 0) {} \\r
1453                 if(emu->d88_file[drv].bank_num > 1) { \\r
1454                         AppendMenu(hMenu, MF_STRING | MF_DISABLED, ID_D88_FILE_PATH, emu->d88_file[drv].path); \\r
1455                         for(int i = 0; i < emu->d88_file[drv].bank_num; i++) { \\r
1456                                 _TCHAR tmp[32]; \\r
1457                                 _stprintf_s(tmp, 32, _T("%d: %s"), i + 1, emu->d88_file[drv].bank[i].name); \\r
1458                                 AppendMenu(hMenu, MF_STRING | (i == emu->d88_file[drv].cur_bank ? MF_CHECKED : 0), ID_SELECT_D88_BANK + i, tmp); \\r
1459                         } \\r
1460                         AppendMenu(hMenu, MF_SEPARATOR, 0, NULL); \\r
1461                 } \\r
1462                 for(int i = 0; i < MAX_HISTORY; i++) { \\r
1463                         if(_tcsicmp(config.recent_disk_path[drv][i], _T(""))) { \\r
1464                                 AppendMenu(hMenu, MF_STRING, ID_RECENT_FD + i, config.recent_disk_path[drv][i]); \\r
1465                                 flag = true; \\r
1466                         } \\r
1467                 } \\r
1468                 if(!flag) { \\r
1469                         AppendMenu(hMenu, MF_GRAYED | MF_STRING, ID_RECENT_FD, _T("None")); \\r
1470                 } \\r
1471                 EnableMenuItem(hMenu, ID_CLOSE_FD, emu->disk_inserted(drv) ? MF_ENABLED : MF_GRAYED);\r
1472                 // floppy drive #1\r
1473                 UPDATE_MENU_FD(0, ID_RECENT_FD1, ID_D88_FILE_PATH1, ID_SELECT_D88_BANK1, ID_CLOSE_FD1)\r
1474         }\r
1475 #endif\r
1476 #ifdef MENU_POS_FD2\r
1477         else if(pos == MENU_POS_FD2) {\r
1478                 // floppy drive #2\r
1479                 UPDATE_MENU_FD(1, ID_RECENT_FD2, ID_D88_FILE_PATH2, ID_SELECT_D88_BANK2, ID_CLOSE_FD2)\r
1480         }\r
1481 #endif\r
1482 #ifdef MENU_POS_FD3\r
1483         else if(pos == MENU_POS_FD3) {\r
1484                 // floppy drive #3\r
1485                 UPDATE_MENU_FD(2, ID_RECENT_FD3, ID_D88_FILE_PATH3, ID_SELECT_D88_BANK3, ID_CLOSE_FD3)\r
1486         }\r
1487 #endif\r
1488 #ifdef MENU_POS_FD4\r
1489         else if(pos == MENU_POS_FD4) {\r
1490                 // floppy drive #4\r
1491                 UPDATE_MENU_FD(3, ID_RECENT_FD4, ID_D88_FILE_PATH4, ID_SELECT_D88_BANK4, ID_CLOSE_FD4)\r
1492         }\r
1493 #endif\r
1494 #ifdef MENU_POS_FD5\r
1495         else if(pos == MENU_POS_FD5) {\r
1496                 // floppy drive #5\r
1497                 UPDATE_MENU_FD(4, ID_RECENT_FD5, ID_D88_FILE_PATH5, ID_SELECT_D88_BANK5, ID_CLOSE_FD5)\r
1498         }\r
1499 #endif\r
1500 #ifdef MENU_POS_FD6\r
1501         else if(pos == MENU_POS_FD6) {\r
1502                 // floppy drive #6\r
1503                 UPDATE_MENU_FD(5, ID_RECENT_FD6, ID_D88_FILE_PATH6, ID_SELECT_D88_BANK6, ID_CLOSE_FD6)\r
1504         }\r
1505 #endif\r
1506 #ifdef MENU_POS_FD7\r
1507         else if(pos == MENU_POS_FD7) {\r
1508                 // floppy drive #7\r
1509                 UPDATE_MENU_FD(6, ID_RECENT_FD7, ID_D88_FILE_PATH7, ID_SELECT_D88_BANK7, ID_CLOSE_FD7)\r
1510         }\r
1511 #endif\r
1512 #ifdef MENU_POS_FD8\r
1513         else if(pos == MENU_POS_FD8) {\r
1514                 // floppy drive #8\r
1515                 UPDATE_MENU_FD(7, ID_RECENT_FD8, ID_D88_FILE_PATH8, ID_SELECT_D88_BANK8, ID_CLOSE_FD8)\r
1516         }\r
1517 #endif\r
1518 #ifdef MENU_POS_QD1\r
1519         else if(pos == MENU_POS_QD1) {\r
1520                 #define UPDATE_MENU_QD(drv, ID_RECENT_QD, ID_CLOSE_QD) \\r
1521                 bool flag = false; \\r
1522                 for(int i = 0; i < MAX_HISTORY; i++) { \\r
1523                         DeleteMenu(hMenu, ID_RECENT_QD + i, MF_BYCOMMAND); \\r
1524                 } \\r
1525                 for(int i = 0; i < MAX_HISTORY; i++) { \\r
1526                         if(_tcsicmp(config.recent_quickdisk_path[drv][i], _T(""))) { \\r
1527                                 AppendMenu(hMenu, MF_STRING, ID_RECENT_QD + i, config.recent_quickdisk_path[drv][i]); \\r
1528                                 flag = true; \\r
1529                         } \\r
1530                 } \\r
1531                 if(!flag) { \\r
1532                         AppendMenu(hMenu, MF_GRAYED | MF_STRING, ID_RECENT_QD, _T("None")); \\r
1533                 } \\r
1534                 EnableMenuItem(hMenu, ID_CLOSE_QD, emu->quickdisk_inserted(drv) ? MF_ENABLED : MF_GRAYED);\r
1535                 // quick disk drive #1\r
1536                 UPDATE_MENU_QD(0, ID_RECENT_QD1, ID_CLOSE_QD1)\r
1537         }\r
1538 #endif\r
1539 #ifdef MENU_POS_QD2\r
1540         else if(pos == MENU_POS_QD2) {\r
1541                 // quick disk drive #2\r
1542                 UPDATE_MENU_QD(1, ID_RECENT_QD2, ID_CLOSE_QD2)\r
1543         }\r
1544 #endif\r
1545 #ifdef MENU_POS_TAPE\r
1546         else if(pos == MENU_POS_TAPE) {\r
1547                 // data recorder\r
1548                 bool flag = false;\r
1549                 for(int i = 0; i < MAX_HISTORY; i++) {\r
1550                         DeleteMenu(hMenu, ID_RECENT_TAPE + i, MF_BYCOMMAND);\r
1551                 }\r
1552                 for(int i = 0; i < MAX_HISTORY; i++) {\r
1553                         if(_tcsicmp(config.recent_tape_path[i], _T(""))) {\r
1554                                 AppendMenu(hMenu, MF_STRING, ID_RECENT_TAPE + i, config.recent_tape_path[i]);\r
1555                                 flag = true;\r
1556                         }\r
1557                 }\r
1558                 if(!flag) {\r
1559                         AppendMenu(hMenu, MF_GRAYED | MF_STRING, ID_RECENT_TAPE, _T("None"));\r
1560                 }\r
1561                 EnableMenuItem(hMenu, ID_CLOSE_TAPE, emu->tape_inserted() ? MF_ENABLED : MF_GRAYED);\r
1562 #ifdef USE_TAPE_BUTTON\r
1563                 EnableMenuItem(hMenu, ID_PLAY_BUTTON, emu->tape_inserted() ? MF_ENABLED : MF_GRAYED);\r
1564                 EnableMenuItem(hMenu, ID_STOP_BUTTON, emu->tape_inserted() ? MF_ENABLED : MF_GRAYED);\r
1565 #endif\r
1566                 CheckMenuItem(hMenu, ID_USE_WAVE_SHAPER, config.wave_shaper ? MF_CHECKED : MF_UNCHECKED);\r
1567                 CheckMenuItem(hMenu, ID_DIRECT_LOAD_MZT, config.direct_load_mzt ? MF_CHECKED : MF_UNCHECKED);\r
1568         }\r
1569 #endif\r
1570 #ifdef MENU_POS_LASER_DISC\r
1571         else if(pos == MENU_POS_LASER_DISC) {\r
1572                 // data recorder\r
1573                 bool flag = false;\r
1574                 for(int i = 0; i < MAX_HISTORY; i++) {\r
1575                         DeleteMenu(hMenu, ID_RECENT_LASER_DISC + i, MF_BYCOMMAND);\r
1576                 }\r
1577                 for(int i = 0; i < MAX_HISTORY; i++) {\r
1578                         if(_tcsicmp(config.recent_laser_disc_path[i], _T(""))) {\r
1579                                 AppendMenu(hMenu, MF_STRING, ID_RECENT_LASER_DISC + i, config.recent_laser_disc_path[i]);\r
1580                                 flag = true;\r
1581                         }\r
1582                 }\r
1583                 if(!flag) {\r
1584                         AppendMenu(hMenu, MF_GRAYED | MF_STRING, ID_RECENT_LASER_DISC, _T("None"));\r
1585                 }\r
1586                 EnableMenuItem(hMenu, ID_CLOSE_LASER_DISC, emu->laser_disc_inserted() ? MF_ENABLED : MF_GRAYED);\r
1587         }\r
1588 #endif\r
1589 #ifdef MENU_POS_BINARY1\r
1590         else if(pos == MENU_POS_BINARY1) {\r
1591                 // binary #1\r
1592                 #define UPDATE_MENU_BINARY(drv, ID_RECENT_BINARY) \\r
1593                 bool flag = false; \\r
1594                 for(int i = 0; i < MAX_HISTORY; i++) { \\r
1595                         DeleteMenu(hMenu, ID_RECENT_BINARY + i, MF_BYCOMMAND); \\r
1596                 } \\r
1597                 for(int i = 0; i < MAX_HISTORY; i++) { \\r
1598                         if(_tcsicmp(config.recent_binary_path[drv][i], _T(""))) { \\r
1599                                 AppendMenu(hMenu, MF_STRING, ID_RECENT_BINARY + i, config.recent_binary_path[drv][i]); \\r
1600                                 flag = true; \\r
1601                         } \\r
1602                 } \\r
1603                 if(!flag) { \\r
1604                         AppendMenu(hMenu, MF_GRAYED | MF_STRING, ID_RECENT_BINARY, _T("None")); \\r
1605                 }\r
1606                 UPDATE_MENU_BINARY(0, ID_RECENT_BINARY1)\r
1607         }\r
1608 #endif\r
1609 #ifdef MENU_POS_BINARY2\r
1610         else if(pos == MENU_POS_BINARY2) {\r
1611                 // binary #2\r
1612                 UPDATE_MENU_BINARY(1, ID_RECENT_BINARY2)\r
1613         }\r
1614 #endif\r
1615 #ifdef MENU_POS_SCREEN\r
1616         else if(pos == MENU_POS_SCREEN) {\r
1617                 // recording\r
1618                 bool now_rec = true, now_stop = true;\r
1619                 if(emu) {\r
1620                         now_rec = emu->now_rec_video;\r
1621                         now_stop = !now_rec;\r
1622                 }\r
1623                 EnableMenuItem(hMenu, ID_SCREEN_REC60, now_rec ? MF_GRAYED : MF_ENABLED);\r
1624                 EnableMenuItem(hMenu, ID_SCREEN_REC30, now_rec ? MF_GRAYED : MF_ENABLED);\r
1625                 EnableMenuItem(hMenu, ID_SCREEN_REC15, now_rec ? MF_GRAYED : MF_ENABLED);\r
1626                 EnableMenuItem(hMenu, ID_SCREEN_STOP, now_stop ? MF_GRAYED : MF_ENABLED);\r
1627                 \r
1628                 // screen mode\r
1629                 UINT last = ID_SCREEN_WINDOW1;\r
1630                 for(int i = 1; i < MAX_WINDOW; i++) {\r
1631                         DeleteMenu(hMenu, ID_SCREEN_WINDOW1 + i, MF_BYCOMMAND);\r
1632                 }\r
1633                 for(int i = 1; i < MAX_WINDOW; i++) {\r
1634                         if(emu && emu->get_window_width(i) <= desktop_width && emu->get_window_height(i) <= desktop_height) {\r
1635                                 _TCHAR buf[16];\r
1636                                 _stprintf_s(buf, 16, _T("Window x%d"), i + 1);\r
1637                                 InsertMenu(hMenu, ID_SCREEN_FULLSCREEN1, MF_BYCOMMAND | MF_STRING, ID_SCREEN_WINDOW1 + i, buf);\r
1638                                 last = ID_SCREEN_WINDOW1 + i;\r
1639                         }\r
1640                 }\r
1641                 for(int i = 0; i < MAX_FULLSCREEN; i++) {\r
1642                         if(i < screen_mode_count) {\r
1643                                 MENUITEMINFO info;\r
1644                                 ZeroMemory(&info, sizeof(info));\r
1645                                 info.cbSize = sizeof(info);\r
1646                                 _TCHAR buf[64];\r
1647                                 _stprintf_s(buf, 64, _T("Fullscreen %dx%d"), screen_mode_width[i], screen_mode_height[i]);\r
1648                                 info.fMask = MIIM_TYPE;\r
1649                                 info.fType = MFT_STRING;\r
1650                                 info.dwTypeData = buf;\r
1651                                 SetMenuItemInfo(hMenu, ID_SCREEN_FULLSCREEN1 + i, FALSE, &info);\r
1652                                 EnableMenuItem(hMenu, ID_SCREEN_FULLSCREEN1 + i, now_fullscreen ? MF_GRAYED : MF_ENABLED);\r
1653                                 last = ID_SCREEN_FULLSCREEN1 + i;\r
1654                         } else {\r
1655                                 DeleteMenu(hMenu, ID_SCREEN_FULLSCREEN1 + i, MF_BYCOMMAND);\r
1656                         }\r
1657                 }\r
1658                 if(config.window_mode >= 0 && config.window_mode < MAX_WINDOW) {\r
1659                         CheckMenuRadioItem(hMenu, ID_SCREEN_WINDOW1, last, ID_SCREEN_WINDOW1 + config.window_mode, MF_BYCOMMAND);\r
1660                 } else if(config.window_mode >= MAX_WINDOW && config.window_mode < screen_mode_count + MAX_WINDOW) {\r
1661                         CheckMenuRadioItem(hMenu, ID_SCREEN_WINDOW1, last, ID_SCREEN_FULLSCREEN1 + config.window_mode - MAX_WINDOW, MF_BYCOMMAND);\r
1662                 }\r
1663                 CheckMenuItem(hMenu, ID_SCREEN_USE_D3D9, config.use_d3d9 ? MF_CHECKED : MF_UNCHECKED);\r
1664                 CheckMenuItem(hMenu, ID_SCREEN_WAIT_VSYNC, config.wait_vsync ? MF_CHECKED : MF_UNCHECKED);\r
1665                 CheckMenuRadioItem(hMenu, ID_SCREEN_STRETCH_DOT, ID_SCREEN_STRETCH_FILL, ID_SCREEN_STRETCH_DOT + config.stretch_type, MF_BYCOMMAND);\r
1666                 \r
1667 #ifdef USE_MONITOR_TYPE\r
1668                 if(config.monitor_type >= 0 && config.monitor_type < USE_MONITOR_TYPE) {\r
1669                         CheckMenuRadioItem(hMenu, ID_SCREEN_MONITOR_TYPE0, ID_SCREEN_MONITOR_TYPE0 + USE_MONITOR_TYPE - 1, ID_SCREEN_MONITOR_TYPE0 + config.monitor_type, MF_BYCOMMAND);\r
1670                 }\r
1671 #endif\r
1672 #ifdef USE_CRT_FILTER\r
1673                 CheckMenuItem(hMenu, ID_SCREEN_CRT_FILTER, config.crt_filter ? MF_CHECKED : MF_UNCHECKED);\r
1674 #endif\r
1675 #ifdef USE_SCANLINE\r
1676                 CheckMenuItem(hMenu, ID_SCREEN_SCANLINE, config.scan_line ? MF_CHECKED : MF_UNCHECKED);\r
1677 #endif\r
1678         }\r
1679 #endif\r
1680 #ifdef MENU_POS_SOUND\r
1681         else if(pos == MENU_POS_SOUND) {\r
1682                 // sound menu\r
1683                 bool now_rec = false, now_stop = false;\r
1684                 if(emu) {\r
1685                         now_rec = emu->now_rec_sound;\r
1686                         now_stop = !now_rec;\r
1687                 }\r
1688                 EnableMenuItem(hMenu, ID_SOUND_REC, now_rec ? MF_GRAYED : MF_ENABLED);\r
1689                 EnableMenuItem(hMenu, ID_SOUND_STOP, now_stop ? MF_GRAYED : MF_ENABLED);\r
1690                 \r
1691                 if(config.sound_frequency >= 0 && config.sound_frequency < 8) {\r
1692                         CheckMenuRadioItem(hMenu, ID_SOUND_FREQ0, ID_SOUND_FREQ7, ID_SOUND_FREQ0 + config.sound_frequency, MF_BYCOMMAND);\r
1693                 }\r
1694                 if(config.sound_latency >= 0 && config.sound_latency < 5) {\r
1695                         CheckMenuRadioItem(hMenu, ID_SOUND_LATE0, ID_SOUND_LATE4, ID_SOUND_LATE0 + config.sound_latency, MF_BYCOMMAND);\r
1696                 }\r
1697 #ifdef USE_SOUND_DEVICE_TYPE\r
1698                 if(config.sound_device_type >= 0 && config.sound_device_type < USE_SOUND_DEVICE_TYPE) {\r
1699                         CheckMenuRadioItem(hMenu, ID_SOUND_DEVICE_TYPE0, ID_SOUND_DEVICE_TYPE0 + USE_SOUND_DEVICE_TYPE - 1, ID_SOUND_DEVICE_TYPE0 + config.sound_device_type, MF_BYCOMMAND);\r
1700                 }\r
1701 #endif\r
1702         }\r
1703 #endif\r
1704 #ifdef MENU_POS_CAPTURE\r
1705         else if(pos == MENU_POS_CAPTURE) {\r
1706                 // video capture menu\r
1707                 int num_devs = emu->get_num_capture_devs();\r
1708                 int cur_index = emu->get_cur_capture_dev_index();\r
1709                 \r
1710                 for(int i = 0; i < 8; i++) {\r
1711                         DeleteMenu(hMenu, ID_CAPTURE_DEVICE1 + i, MF_BYCOMMAND);\r
1712                 }\r
1713                 for(int i = 0; i < 8; i++) {\r
1714                         if(num_devs >= i + 1) {\r
1715                                 AppendMenu(hMenu, MF_STRING, ID_CAPTURE_DEVICE1 + i, emu->get_capture_dev_name(i));\r
1716                         }\r
1717                 }\r
1718                 if(num_devs == 0) {\r
1719                         AppendMenu(hMenu, MF_GRAYED | MF_STRING, ID_CAPTURE_DEVICE1, _T("None"));\r
1720                 }\r
1721                 if(cur_index != -1) {\r
1722                         CheckMenuRadioItem(hMenu, ID_CAPTURE_DEVICE1, ID_CAPTURE_DEVICE1, ID_CAPTURE_DEVICE1 + cur_index, MF_BYCOMMAND);\r
1723                 }\r
1724                 EnableMenuItem(hMenu, ID_CAPTURE_FILTER, (cur_index != -1) ? MF_ENABLED : MF_GRAYED);\r
1725                 EnableMenuItem(hMenu, ID_CAPTURE_PIN, (cur_index != -1) ? MF_ENABLED : MF_GRAYED);\r
1726                 EnableMenuItem(hMenu, ID_CAPTURE_SOURCE, (cur_index != -1) ? MF_ENABLED : MF_GRAYED);\r
1727                 EnableMenuItem(hMenu, ID_CAPTURE_CLOSE, (cur_index != -1) ? MF_ENABLED : MF_GRAYED);\r
1728         }\r
1729 #endif\r
1730         DrawMenuBar(hWnd);\r
1731 }\r
1732 \r
1733 #ifdef USE_CART1\r
1734 void open_cart_dialog(HWND hWnd, int drv)\r
1735 {\r
1736         _TCHAR* path = get_open_file_name(\r
1737                 hWnd,\r
1738 #if defined(_GAMEGEAR)\r
1739                 _T("Supported Files (*.rom;*.bin;*.gg;*.col)\0*.rom;*.bin;*.gg;*.col\0All Files (*.*)\0*.*\0\0"),\r
1740                 _T("Game Cartridge"),\r
1741 #elif defined(_MASTERSYSTEM)\r
1742                 _T("Supported Files (*.rom;*.bin;*.sms)\0*.rom;*.bin;*.sms\0All Files (*.*)\0*.*\0\0"),\r
1743                 _T("Game Cartridge"),\r
1744 #elif defined(_PC6001) || defined(_PC6001MK2) || defined(_PC6001MK2SR) || defined(_PC6601) || defined(_PC6601SR)\r
1745                 _T("Supported Files (*.rom;*.bin;*.60)\0*.rom;*.bin;*.60\0All Files (*.*)\0*.*\0\0"),\r
1746                 _T("Game Cartridge"),\r
1747 #elif defined(_PCENGINE) || defined(_X1TWIN)\r
1748                 _T("Supported Files (*.rom;*.bin;*.pce)\0*.rom;*.bin;*.pce\0All Files (*.*)\0*.*\0\0"),\r
1749                 _T("HuCARD"),\r
1750 #else\r
1751                 _T("Supported Files (*.rom;*.bin)\0*.rom;*.bin\0All Files (*.*)\0*.*\0\0"), \r
1752                 _T("Game Cartridge"),\r
1753 #endif\r
1754                 config.initial_cart_dir, _MAX_PATH\r
1755         );\r
1756         if(path) {\r
1757                 UPDATE_HISTORY(path, config.recent_cart_path[drv]);\r
1758                 _tcscpy_s(config.initial_cart_dir, _MAX_PATH, get_parent_dir(path));\r
1759                 emu->open_cart(drv, path);\r
1760         }\r
1761 }\r
1762 #endif\r
1763 \r
1764 #ifdef USE_FD1\r
1765 void open_disk_dialog(HWND hWnd, int drv)\r
1766 {\r
1767         _TCHAR* path = get_open_file_name(\r
1768                 hWnd,\r
1769                 _T("Supported Files (*.d88;*.d77;*.td0;*.imd;*.dsk;*.fdi;*.hdm;*.tfd;*.xdf;*.2d;*.sf7)\0*.d88;*.d77;*.td0;*.imd;*.dsk;*.fdi;*.hdm;*.tfd;*.xdf;*.2d;*.sf7\0All Files (*.*)\0*.*\0\0"),\r
1770                 _T("Floppy Disk"),\r
1771                 config.initial_disk_dir, _MAX_PATH\r
1772         );\r
1773         if(path) {\r
1774                 UPDATE_HISTORY(path, config.recent_disk_path[drv]);\r
1775                 _tcscpy_s(config.initial_disk_dir, _MAX_PATH, get_parent_dir(path));\r
1776                 open_disk(drv, path, 0);\r
1777         }\r
1778 }\r
1779 \r
1780 void open_disk(int drv, _TCHAR* path, int bank)\r
1781 {\r
1782         emu->d88_file[drv].bank_num = 0;\r
1783         emu->d88_file[drv].cur_bank = -1;\r
1784         emu->d88_file[drv].bank[0].offset = 0;\r
1785         \r
1786         if(check_file_extension(path, _T(".d88")) || check_file_extension(path, _T(".d77"))) {\r
1787                 FILE *fp = NULL;\r
1788                 if(_tfopen_s(&fp, path, _T("rb")) == 0) {\r
1789                         try {\r
1790                                 fseek(fp, 0, SEEK_END);\r
1791                                 int file_size = ftell(fp), file_offset = 0;\r
1792                                 while(file_offset + 0x2b0 <= file_size && emu->d88_file[drv].bank_num < MAX_D88_BANKS) {\r
1793                                         emu->d88_file[drv].bank[emu->d88_file[drv].bank_num].offset = file_offset;\r
1794                                         fseek(fp, file_offset, SEEK_SET);\r
1795 #ifdef _UNICODE\r
1796                                         char tmp[18];\r
1797                                         fread(tmp, 17, 1, fp);\r
1798                                         tmp[17] = 0;\r
1799                                         MultiByteToWideChar(CP_ACP, 0, tmp, -1, emu->d88_file[drv].bank[emu->d88_file[drv].bank_num].name, 18);\r
1800 #else\r
1801                                         fread(emu->d88_file[drv].bank[emu->d88_file[drv].bank_num].name, 17, 1, fp);\r
1802                                         emu->d88_file[drv].bank[emu->d88_file[drv].bank_num].name[17] = 0;\r
1803 #endif\r
1804                                         fseek(fp, file_offset + 0x1c, SEEK_SET);\r
1805                                         file_offset += fgetc(fp);\r
1806                                         file_offset += fgetc(fp) << 8;\r
1807                                         file_offset += fgetc(fp) << 16;\r
1808                                         file_offset += fgetc(fp) << 24;\r
1809                                         emu->d88_file[drv].bank_num++;\r
1810                                 }\r
1811                                 _tcscpy_s(emu->d88_file[drv].path, _MAX_PATH, path);\r
1812                                 emu->d88_file[drv].cur_bank = bank;\r
1813                         }\r
1814                         catch(...) {\r
1815                                 emu->d88_file[drv].bank_num = 0;\r
1816                         }\r
1817                 }\r
1818         }\r
1819         emu->open_disk(drv, path, emu->d88_file[drv].bank[bank].offset);\r
1820 #ifdef USE_FD2\r
1821         if((drv & 1) == 0 && drv + 1 < MAX_FD && bank + 1 < emu->d88_file[drv].bank_num) {\r
1822                 open_disk(drv + 1, path, bank + 1);\r
1823         }\r
1824 #endif\r
1825 }\r
1826 \r
1827 void close_disk(int drv)\r
1828 {\r
1829         emu->close_disk(drv);\r
1830         emu->d88_file[drv].bank_num = 0;\r
1831         emu->d88_file[drv].cur_bank = -1;\r
1832 \r
1833 }\r
1834 #endif\r
1835 \r
1836 #ifdef USE_QD1\r
1837 void open_quickdisk_dialog(HWND hWnd, int drv)\r
1838 {\r
1839         _TCHAR* path = get_open_file_name(\r
1840                 hWnd,\r
1841                 _T("Supported Files (*.mzt;*.q20;*.qdf)\0*.mzt;*.q20;*.qdf\0All Files (*.*)\0*.*\0\0"),\r
1842                 _T("Quick Disk"),\r
1843                 config.initial_quickdisk_dir, _MAX_PATH\r
1844         );\r
1845         if(path) {\r
1846                 UPDATE_HISTORY(path, config.recent_quickdisk_path[drv]);\r
1847                 _tcscpy_s(config.initial_quickdisk_dir, _MAX_PATH, get_parent_dir(path));\r
1848                 emu->open_quickdisk(drv, path);\r
1849         }\r
1850 }\r
1851 #endif\r
1852 \r
1853 #ifdef USE_TAPE\r
1854 void open_tape_dialog(HWND hWnd, bool play)\r
1855 {\r
1856         _TCHAR* path = get_open_file_name(\r
1857                 hWnd,\r
1858 #if defined(_PC6001) || defined(_PC6001MK2) || defined(_PC6001MK2SR) || defined(_PC6601) || defined(_PC6601SR)\r
1859                 _T("Supported Files (*.wav;*.p6;*.p6t;*.cas)\0*.wav;*.p6;*.p6t;*.cas\0All Files (*.*)\0*.*\0\0"),\r
1860 #elif defined(_PC8001SR) || defined(_PC8801MA) || defined(_PC98DO)\r
1861                 play ? _T("Supported Files (*.cas;*.cmt;*.n80;*.t88)\0*.cas;*.cmt;*.n80;*.t88\0All Files (*.*)\0*.*\0\0")\r
1862                      : _T("Supported Files (*.cas;*.cmt)\0*.cas;*.cmt\0All Files (*.*)\0*.*\0\0"),\r
1863 #elif defined(_MZ80A) || defined(_MZ80K) || defined(_MZ1200) || defined(_MZ700) || defined(_MZ800) || defined(_MZ1500)\r
1864                 play ? _T("Supported Files (*.wav;*.cas;*.mzt;*.m12)\0*.wav;*.cas;*.mzt;*.m12\0All Files (*.*)\0*.*\0\0")\r
1865                      : _T("Supported Files (*.wav;*.cas)\0*.wav;*.cas\0All Files (*.*)\0*.*\0\0"),\r
1866 #elif defined(_MZ80B) || defined(_MZ2000) || defined(_MZ2200)\r
1867                 play ? _T("Supported Files (*.wav;*.cas;*.mzt;*.mti;*.mtw;*.dat)\0*.wav;*.cas;*.mzt;*.mti;*.mtw;*.dat\0All Files (*.*)\0*.*\0\0")\r
1868                      : _T("Supported Files (*.wav;*.cas)\0*.wav;*.cas\0All Files (*.*)\0*.*\0\0"),\r
1869 #elif defined(_X1) || defined(_X1TWIN) || defined(_X1TURBO) || defined(_X1TURBOZ)\r
1870                 play ? _T("Supported Files (*.wav;*.cas;*.tap)\0*.wav;*.cas;*.tap\0All Files (*.*)\0*.*\0\0")\r
1871                      : _T("Supported Files (*.wav;*.cas)\0*.wav;*.cas\0All Files (*.*)\0*.*\0\0"),\r
1872 #elif defined(TAPE_BINARY_ONLY)\r
1873                 _T("Supported Files (*.cas;*.cmt)\0*.cas;*.cmt\0All Files (*.*)\0*.*\0\0"),\r
1874 #else\r
1875                 _T("Supported Files (*.wav;*.cas)\0*.wav;*.cas\0All Files (*.*)\0*.*\0\0"),\r
1876 #endif\r
1877                 play ? _T("Data Recorder Tape [Play]") : _T("Data Recorder Tape [Rec]"),\r
1878                 config.initial_tape_dir, _MAX_PATH\r
1879         );\r
1880         if(path) {\r
1881                 UPDATE_HISTORY(path, config.recent_tape_path);\r
1882                 _tcscpy_s(config.initial_tape_dir, _MAX_PATH, get_parent_dir(path));\r
1883                 if(play) {\r
1884                         emu->play_tape(path);\r
1885                 } else {\r
1886                         emu->rec_tape(path);\r
1887                 }\r
1888         }\r
1889 }\r
1890 #endif\r
1891 \r
1892 #ifdef USE_LASER_DISC\r
1893 void open_laser_disc_dialog(HWND hWnd)\r
1894 {\r
1895         _TCHAR* path = get_open_file_name(\r
1896                 hWnd,\r
1897                 _T("Supported Files (*.avi;*.mpg;*.mpeg;*.wmv;*.ogv)\0*.avi;*.mpg;*.mpeg;*.wmv;*.ogv\0All Files (*.*)\0*.*\0\0"),\r
1898                 _T("Laser Disc"),\r
1899                 config.initial_laser_disc_dir, _MAX_PATH\r
1900         );\r
1901         if(path) {\r
1902                 UPDATE_HISTORY(path, config.recent_laser_disc_path);\r
1903                 _tcscpy_s(config.initial_laser_disc_dir, _MAX_PATH, get_parent_dir(path));\r
1904                 emu->open_laser_disc(path);\r
1905         }\r
1906 }\r
1907 #endif\r
1908 \r
1909 #ifdef USE_BINARY_FILE1\r
1910 void open_binary_dialog(HWND hWnd, int drv, bool load)\r
1911 {\r
1912         _TCHAR* path = get_open_file_name(\r
1913                 hWnd,\r
1914                 _T("Supported Files (*.ram;*.bin)\0*.ram;*.bin\0All Files (*.*)\0*.*\0\0"),\r
1915 #if defined(_PASOPIA) || defined(_PASOPIA7)\r
1916                 _T("RAM Pack Cartridge"),\r
1917 #else\r
1918                 _T("Memory Dump"),\r
1919 #endif\r
1920                 config.initial_binary_dir, _MAX_PATH\r
1921         );\r
1922         if(path) {\r
1923                 UPDATE_HISTORY(path, config.recent_binary_path[drv]);\r
1924                 _tcscpy_s(config.initial_binary_dir, _MAX_PATH, get_parent_dir(path));\r
1925                 if(load) {\r
1926                         emu->load_binary(drv, path);\r
1927                 } else {\r
1928                         emu->save_binary(drv, path);\r
1929                 }\r
1930         }\r
1931 }\r
1932 #endif\r
1933 \r
1934 #ifdef SUPPORT_DRAG_DROP\r
1935 void open_any_file(_TCHAR* path)\r
1936 {\r
1937 #if defined(USE_CART1)\r
1938         if(check_file_extension(path, _T(".rom")) || \r
1939            check_file_extension(path, _T(".bin")) || \r
1940            check_file_extension(path, _T(".gg" )) || \r
1941            check_file_extension(path, _T(".col")) || \r
1942            check_file_extension(path, _T(".sms")) || \r
1943            check_file_extension(path, _T(".60" )) || \r
1944            check_file_extension(path, _T(".pce"))) {\r
1945                 UPDATE_HISTORY(path, config.recent_cart_path[0]);\r
1946                 _tcscpy_s(config.initial_cart_dir, _MAX_PATH, get_parent_dir(path));\r
1947                 emu->open_cart(0, path);\r
1948                 return;\r
1949         }\r
1950 #endif\r
1951 #if defined(USE_FD1)\r
1952         if(check_file_extension(path, _T(".d88")) || \r
1953            check_file_extension(path, _T(".d77")) || \r
1954            check_file_extension(path, _T(".td0")) || \r
1955            check_file_extension(path, _T(".imd")) || \r
1956            check_file_extension(path, _T(".dsk")) || \r
1957            check_file_extension(path, _T(".fdi")) || \r
1958            check_file_extension(path, _T(".hdm")) || \r
1959            check_file_extension(path, _T(".tfd")) || \r
1960            check_file_extension(path, _T(".xdf")) || \r
1961            check_file_extension(path, _T(".2d" )) || \r
1962            check_file_extension(path, _T(".sf7"))) {\r
1963                 UPDATE_HISTORY(path, config.recent_disk_path[0]);\r
1964                 _tcscpy_s(config.initial_disk_dir, _MAX_PATH, get_parent_dir(path));\r
1965                 open_disk(0, path, 0);\r
1966                 return;\r
1967         }\r
1968 #endif\r
1969 #if defined(USE_TAPE)\r
1970         if(check_file_extension(path, _T(".wav")) || \r
1971            check_file_extension(path, _T(".cas")) || \r
1972            check_file_extension(path, _T(".p6" )) || \r
1973            check_file_extension(path, _T(".p6t")) || \r
1974            check_file_extension(path, _T(".cmt")) || \r
1975            check_file_extension(path, _T(".n80")) || \r
1976            check_file_extension(path, _T(".t88")) || \r
1977            check_file_extension(path, _T(".mzt")) || \r
1978            check_file_extension(path, _T(".m12")) || \r
1979            check_file_extension(path, _T(".mti")) || \r
1980            check_file_extension(path, _T(".mtw")) || \r
1981            check_file_extension(path, _T(".tap"))) {\r
1982                 UPDATE_HISTORY(path, config.recent_tape_path);\r
1983                 _tcscpy_s(config.initial_tape_dir, _MAX_PATH, get_parent_dir(path));\r
1984                 emu->play_tape(path);\r
1985                 return;\r
1986         }\r
1987 #endif\r
1988 #if defined(USE_BINARY_FILE1)\r
1989         if(check_file_extension(path, _T(".ram")) || \r
1990            check_file_extension(path, _T(".bin"))) {\r
1991                 UPDATE_HISTORY(path, config.recent_binary_path[0]);\r
1992                 _tcscpy_s(config.initial_binary_dir, _MAX_PATH, get_parent_dir(path));\r
1993                 emu->load_binary(0, path);\r
1994                 return;\r
1995         }\r
1996 #endif\r
1997 }\r
1998 #endif\r
1999 \r
2000 void set_window(HWND hWnd, int mode)\r
2001 {\r
2002         static LONG style = WS_VISIBLE;\r
2003         WINDOWPLACEMENT place;\r
2004         place.length = sizeof(WINDOWPLACEMENT);\r
2005         \r
2006         if(mode >= 0 && mode < MAX_WINDOW) {\r
2007                 // window\r
2008                 int width = emu->get_window_width(mode);\r
2009                 int height = emu->get_window_height(mode);\r
2010                 RECT rect = {0, 0, width, height};\r
2011                 AdjustWindowRect(&rect, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE, TRUE);\r
2012                 int dest_x = (int)((desktop_width - (rect.right - rect.left)) / 2);\r
2013                 int dest_y = (int)((desktop_height - (rect.bottom - rect.top)) / 2);\r
2014                 //dest_x = (dest_x < 0) ? 0 : dest_x;\r
2015                 dest_y = (dest_y < 0) ? 0 : dest_y;\r
2016                 \r
2017                 if(now_fullscreen) {\r
2018                         ChangeDisplaySettings(NULL, 0);\r
2019                         SetWindowLong(hWnd, GWL_STYLE, style);\r
2020                         SetWindowPos(hWnd, HWND_TOP, dest_x, dest_y, rect.right - rect.left, rect.bottom - rect.top, SWP_SHOWWINDOW);\r
2021                         now_fullscreen = false;\r
2022                         \r
2023                         // show menu\r
2024                         show_menu_bar(hWnd);\r
2025                 } else {\r
2026                         SetWindowPos(hWnd, NULL, dest_x, dest_y, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER);\r
2027                 }\r
2028                 \r
2029                 RECT rect_tmp;\r
2030                 GetClientRect(hWnd, &rect_tmp);\r
2031                 if(rect_tmp.bottom != height) {\r
2032                         rect.bottom += height - rect_tmp.bottom;\r
2033                         dest_y = (int)((desktop_height - (rect.bottom - rect.top)) / 2);\r
2034                         dest_y = (dest_y < 0) ? 0 : dest_y;\r
2035                         SetWindowPos(hWnd, NULL, dest_x, dest_y, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER);\r
2036                 }\r
2037                 config.window_mode = prev_window_mode = mode;\r
2038                 \r
2039                 // set screen size to emu class\r
2040                 emu->set_display_size(width, height, true);\r
2041         } else if(!now_fullscreen) {\r
2042                 // fullscreen\r
2043                 int width = (mode == -1) ? desktop_width : screen_mode_width[mode - MAX_WINDOW];\r
2044                 int height = (mode == -1) ? desktop_height : screen_mode_height[mode - MAX_WINDOW];\r
2045                 \r
2046                 DEVMODE dev;\r
2047                 ZeroMemory(&dev, sizeof(dev));\r
2048                 dev.dmSize = sizeof(dev);\r
2049                 dev.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;\r
2050                 dev.dmBitsPerPel = desktop_bpp;\r
2051                 dev.dmPelsWidth = width;\r
2052                 dev.dmPelsHeight = height;\r
2053                 \r
2054                 if(ChangeDisplaySettings(&dev, CDS_TEST) == DISP_CHANGE_SUCCESSFUL) {\r
2055                         GetWindowPlacement(hWnd, &place);\r
2056                         ChangeDisplaySettings(&dev, CDS_FULLSCREEN);\r
2057                         style = GetWindowLong(hWnd, GWL_STYLE);\r
2058                         SetWindowLong(hWnd, GWL_STYLE, WS_VISIBLE);\r
2059                         SetWindowPos(hWnd, HWND_TOP, 0, 0, width, height, SWP_SHOWWINDOW);\r
2060                         SetCursorPos(width / 2, height / 2);\r
2061                         now_fullscreen = true;\r
2062                         if(mode == -1) {\r
2063                                 for(int i = 0; i < screen_mode_count; i++) {\r
2064                                         if(screen_mode_width[i] == desktop_width && screen_mode_height[i] == desktop_height) {\r
2065                                                 mode = i + MAX_WINDOW;\r
2066                                                 break;\r
2067                                         }\r
2068                                 }\r
2069                         }\r
2070                         config.window_mode = mode;\r
2071                         \r
2072                         // remove menu\r
2073                         hide_menu_bar(hWnd);\r
2074                         \r
2075                         // set screen size to emu class\r
2076                         emu->set_display_size(width, height, false);\r
2077                 }\r
2078         }\r
2079 }\r
2080 \r