2 Skelton for retropc emulator
\r
4 Author : Takeda.Toshiya
\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
17 #include "res/resource.h"
\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
32 static HMENU hMenu = NULL;
\r
33 bool now_menuloop = false;
\r
35 void update_menu(HWND hWnd, HMENU hMenu, int pos);
\r
37 void show_menu_bar(HWND hWnd)
\r
39 if(!(hMenu != NULL && IsMenu(hMenu))) {
\r
40 hMenu = LoadMenu((HINSTANCE)GetModuleHandle(0), MAKEINTRESOURCE(IDR_MENU1));
\r
41 SetMenu(hWnd, hMenu);
\r
45 void hide_menu_bar(HWND hWnd)
\r
47 if(hMenu != NULL && IsMenu(hMenu)) {
\r
48 SetMenu(hWnd, NULL);
\r
56 void open_cart_dialog(HWND hWnd, int drv);
\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
64 void open_quickdisk_dialog(HWND hWnd, int drv);
\r
67 void open_tape_dialog(HWND hWnd, bool play);
\r
69 #ifdef USE_LASER_DISC
\r
70 void open_laser_disc_dialog(HWND hWnd);
\r
72 #ifdef USE_BINARY_FILE1
\r
73 void open_binary_dialog(HWND hWnd, int drv, bool load);
\r
76 #if defined(USE_CART1) || defined(USE_FD1) || defined(USE_TAPE) || defined(USE_BINARY_FILE1)
\r
77 #define SUPPORT_DRAG_DROP
\r
79 #ifdef SUPPORT_DRAG_DROP
\r
80 void open_any_file(_TCHAR* path);
\r
83 void get_long_full_path_name(_TCHAR* src, _TCHAR* dst, size_t dst_len)
\r
85 _TCHAR tmp[_MAX_PATH];
\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
94 _TCHAR* get_parent_dir(_TCHAR* file)
\r
96 static _TCHAR path[_MAX_PATH];
\r
99 GetFullPathName(file, _MAX_PATH, path, &ptr);
\r
104 _TCHAR* get_open_file_name(HWND hWnd, _TCHAR* filter, _TCHAR* title, _TCHAR* dir, size_t dir_len)
\r
106 static _TCHAR path[_MAX_PATH];
\r
107 _TCHAR tmp[_MAX_PATH] = _T("");
\r
108 OPENFILENAME OpenFileName;
\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
118 OpenFileName.lpstrInitialDir = dir;
\r
120 _TCHAR app[_MAX_PATH];
\r
121 GetModuleFileName(NULL, app, _MAX_PATH);
\r
122 OpenFileName.lpstrInitialDir = get_parent_dir(app);
\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
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
140 for(int i = no; i > 0; i--) { \
\r
141 _tcscpy_s(recent[i], _MAX_PATH, recent[i - 1]); \
\r
143 _tcscpy_s(recent[0], _MAX_PATH, path); \
\r
148 int desktop_height;
\r
150 int prev_window_mode = 0;
\r
151 bool now_fullscreen = false;
\r
153 #define MAX_WINDOW 8
\r
154 #define MAX_FULLSCREEN 32
\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
161 void set_window(HWND hWnd, int mode);
\r
164 #define MAX_SKIP_FRAMES 10
\r
168 static int accum = 0;
\r
169 accum += emu->frame_interval();
\r
170 int interval = accum >> 10;
\r
171 accum -= interval << 10;
\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
179 LRESULT CALLBACK ButtonWndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam);
\r
182 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLine, int iCmdShow)
\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
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
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
221 show_menu_bar(hWnd);
\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
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
240 for(int i = 0;; i++) {
\r
242 ZeroMemory(&dev, sizeof(dev));
\r
243 dev.dmSize = sizeof(dev);
\r
244 if(EnumDisplaySettings(NULL, i, &dev) == 0) {
\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
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
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
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
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
290 config.window_mode = 0;
\r
291 PostMessage(hWnd, WM_COMMAND, ID_SCREEN_WINDOW1, 0L);
\r
295 HACCEL hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));
\r
298 ImmAssociateContext(hWnd, 0);
\r
300 // initialize emulation core
\r
301 emu = new EMU(hWnd, hInstance);
\r
302 emu->set_display_size(WINDOW_WIDTH, WINDOW_HEIGHT, true);
\r
304 #ifdef SUPPORT_DRAG_DROP
\r
305 // open command line path
\r
307 if(szCmdLine[0] == _T('"')) {
\r
308 int len = _tcslen(szCmdLine);
\r
309 szCmdLine[len - 1] = _T('\0');
\r
312 _TCHAR path[_MAX_PATH];
\r
313 get_long_full_path_name(szCmdLine, path, _MAX_PATH);
\r
314 open_any_file(path);
\r
319 SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS);
\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
329 // check window message
\r
330 if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
\r
331 if(!GetMessage(&msg, NULL, 0, 0)) {
\r
333 _CrtDumpMemoryLeaks();
\r
335 ExitProcess(0); // trick
\r
338 if(!TranslateAccelerator(hWnd, hAccel, &msg)) {
\r
339 TranslateMessage(&msg);
\r
340 DispatchMessage(&msg);
\r
344 int run_frames = emu->run();
\r
345 total_frames += run_frames;
\r
348 int interval = 0, sleep_period = 0;
\r
349 // for(int i = 0; i < run_frames; i++) {
\r
350 interval += get_interval();
\r
352 bool now_skip = emu->now_skip() && !emu->now_rec_video;
\r
354 if((prev_skip && !now_skip) || next_time == 0) {
\r
355 next_time = timeGetTime();
\r
358 next_time += interval;
\r
360 prev_skip = now_skip;
\r
362 if(next_time > timeGetTime()) {
\r
363 // update window if enough time
\r
364 draw_frames += emu->draw_screen();
\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
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
376 next_time = timeGetTime();
\r
378 Sleep(sleep_period);
\r
381 DWORD current_time = timeGetTime();
\r
382 if(update_fps_time <= current_time && update_fps_time != 0) {
\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
389 _stprintf_s(buf, 256, _T("%s - %d fps (%d %%)"), _T(DEVICE_NAME), draw_frames, ratio);
\r
391 SetWindowText(hWnd, buf);
\r
393 update_fps_time += 1000;
\r
394 total_frames = draw_frames = 0;
\r
396 if(update_fps_time <= current_time) {
\r
397 update_fps_time = current_time + 1000;
\r
402 _CrtDumpMemoryLeaks();
\r
407 LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
\r
409 _TCHAR path[_MAX_PATH];
\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
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
443 SetWindowFont(hButton[i], hFont[buttons[i].font_size], TRUE);
\r
446 #ifdef SUPPORT_DRAG_DROP
\r
447 DragAcceptFiles(hWnd, TRUE);
\r
451 #ifdef USE_POWER_OFF
\r
452 // notify power off
\r
454 static int notified = 0;
\r
456 emu->notify_power_off();
\r
463 if(now_fullscreen) {
\r
464 ChangeDisplaySettings(NULL, 0);
\r
466 now_fullscreen = false;
\r
468 for(int i = 0; i < MAX_FONT_SIZE; i++) {
\r
470 DeleteObject(hFont[i]);
\r
474 if(hMenu != NULL && IsMenu(hMenu)) {
\r
475 DestroyMenu(hMenu);
\r
477 DestroyWindow(hWnd);
\r
478 // release emulation core
\r
486 PostQuitMessage(0);
\r
491 emu->reload_bitmap();
\r
497 emu->key_lost_focus();
\r
503 HDC hdc = BeginPaint(hWnd, &ps);
\r
504 emu->update_screen(hdc);
\r
505 EndPaint(hWnd, &ps);
\r
515 bool repeat = ((HIWORD(lParam) & 0x4000) != 0);
\r
516 emu->key_down(LOBYTE(wParam), repeat);
\r
521 emu->key_up(LOBYTE(wParam));
\r
524 case WM_SYSKEYDOWN:
\r
526 bool repeat = ((HIWORD(lParam) & 0x4000) != 0);
\r
527 emu->key_down(LOBYTE(wParam), repeat);
\r
529 #ifdef USE_ALT_F10_KEY
\r
530 return 0; // not activate menu when hit ALT/F10
\r
535 emu->key_up(LOBYTE(wParam));
\r
537 #ifdef USE_ALT_F10_KEY
\r
538 return 0; // not activate menu when hit ALT/F10
\r
542 #ifdef USE_ALT_F10_KEY
\r
543 return 0; // not activate menu when hit ALT/F10
\r
546 case WM_INITMENUPOPUP:
\r
550 update_menu(hWnd, (HMENU)wParam, LOWORD(lParam));
\r
552 case WM_ENTERMENULOOP:
\r
553 now_menuloop = true;
\r
555 case WM_EXITMENULOOP:
\r
556 if(now_fullscreen && now_menuloop) {
\r
557 hide_menu_bar(hWnd);
\r
559 now_menuloop = false;
\r
562 if(now_fullscreen && !now_menuloop) {
\r
563 POINTS p = MAKEPOINTS(lParam);
\r
565 show_menu_bar(hWnd);
\r
566 } else if(p.y > 32) {
\r
567 hide_menu_bar(hWnd);
\r
573 if(now_fullscreen) {
\r
574 emu->set_display_size(-1, -1, false);
\r
576 set_window(hWnd, config.window_mode);
\r
580 #ifdef SUPPORT_DRAG_DROP
\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
597 no = iMsg - WM_SOCKET0;
\r
601 if(WSAGETSELECTERROR(lParam) != 0) {
\r
602 emu->disconnect_socket(no);
\r
603 emu->socket_disconnected(no);
\r
606 if(emu->get_socket(no) != (int)wParam) {
\r
609 switch(WSAGETSELECTEVENT(lParam)) {
\r
611 emu->socket_connected(no);
\r
614 emu->socket_disconnected(no);
\r
617 emu->send_data(no);
\r
620 emu->recv_data(no);
\r
626 switch(LOWORD(wParam)) {
\r
632 #ifdef USE_SPECIAL_RESET
\r
633 case ID_SPECIAL_RESET:
\r
635 emu->special_reset();
\r
640 case ID_SAVE_STATE:
\r
645 case ID_LOAD_STATE:
\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
662 emu->update_config();
\r
666 #ifdef USE_CPU_TYPE
\r
675 config.cpu_type = LOWORD(wParam) - ID_CPU_TYPE0;
\r
676 // need to recreate vm class instance
\r
678 // emu->update_config();
\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
689 emu->update_config();
\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
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
740 #ifdef USE_AUTO_KEY
\r
741 case ID_AUTOKEY_START:
\r
743 emu->start_auto_key();
\r
746 case ID_AUTOKEY_STOP:
\r
748 emu->stop_auto_key();
\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
758 no = LOWORD(wParam) - ID_OPEN_DEBUGGER0;
\r
759 emu->open_debugger(no);
\r
762 case ID_CLOSE_DEBUGGER:
\r
764 emu->close_debugger();
\r
769 SendMessage(hWnd, WM_CLOSE, 0, 0L);
\r
772 #define CART_MENU_ITEMS(drv, ID_OPEN_CART, ID_CLOSE_CART, ID_RECENT_CART) \
\r
773 case ID_OPEN_CART: \
\r
775 open_cart_dialog(hWnd, drv); \
\r
778 case ID_CLOSE_CART: \
\r
780 emu->close_cart(drv); \
\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
796 _tcscpy_s(config.recent_cart_path[drv][0], _MAX_PATH, path); \
\r
798 emu->open_cart(drv, path); \
\r
801 CART_MENU_ITEMS(0, ID_OPEN_CART1, ID_CLOSE_CART1, ID_RECENT_CART1)
\r
804 CART_MENU_ITEMS(1, ID_OPEN_CART2, ID_CLOSE_CART2, ID_RECENT_CART2)
\r
807 #define FD_MENU_ITEMS(drv, ID_OPEN_FD, ID_CLOSE_FD, ID_RECENT_FD, ID_SELECT_D88_BANK) \
\r
810 open_disk_dialog(hWnd, drv); \
\r
813 case ID_CLOSE_FD: \
\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
831 _tcscpy_s(config.recent_disk_path[drv][0], _MAX_PATH, path); \
\r
833 open_disk(drv, path, 0); \
\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
906 FD_MENU_ITEMS(0, ID_OPEN_FD1, ID_CLOSE_FD1, ID_RECENT_FD1, ID_SELECT_D88_BANK1)
\r
909 FD_MENU_ITEMS(1, ID_OPEN_FD2, ID_CLOSE_FD2, ID_RECENT_FD2, ID_SELECT_D88_BANK2)
\r
912 FD_MENU_ITEMS(2, ID_OPEN_FD3, ID_CLOSE_FD3, ID_RECENT_FD3, ID_SELECT_D88_BANK3)
\r
915 FD_MENU_ITEMS(3, ID_OPEN_FD4, ID_CLOSE_FD4, ID_RECENT_FD4, ID_SELECT_D88_BANK4)
\r
918 FD_MENU_ITEMS(4, ID_OPEN_FD5, ID_CLOSE_FD5, ID_RECENT_FD5, ID_SELECT_D88_BANK5)
\r
921 FD_MENU_ITEMS(5, ID_OPEN_FD6, ID_CLOSE_FD6, ID_RECENT_FD6, ID_SELECT_D88_BANK6)
\r
924 FD_MENU_ITEMS(6, ID_OPEN_FD7, ID_CLOSE_FD7, ID_RECENT_FD7, ID_SELECT_D88_BANK7)
\r
927 FD_MENU_ITEMS(7, ID_OPEN_FD8, ID_CLOSE_FD8, ID_RECENT_FD8, ID_SELECT_D88_BANK8)
\r
930 #define QD_MENU_ITEMS(drv, ID_OPEN_QD, ID_CLOSE_QD, ID_RECENT_QD) \
\r
933 open_quickdisk_dialog(hWnd, drv); \
\r
936 case ID_CLOSE_QD: \
\r
938 emu->close_quickdisk(drv); \
\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
954 _tcscpy_s(config.recent_quickdisk_path[drv][0], _MAX_PATH, path); \
\r
956 emu->open_quickdisk(drv, path); \
\r
959 QD_MENU_ITEMS(0, ID_OPEN_QD1, ID_CLOSE_QD1, ID_RECENT_QD1)
\r
962 QD_MENU_ITEMS(1, ID_OPEN_QD2, ID_CLOSE_QD2, ID_RECENT_QD2)
\r
967 open_tape_dialog(hWnd, true);
\r
972 open_tape_dialog(hWnd, false);
\r
975 case ID_CLOSE_TAPE:
\r
980 case ID_USE_WAVE_SHAPER:
\r
981 config.wave_shaper = !config.wave_shaper;
\r
983 case ID_DIRECT_LOAD_MZT:
\r
984 config.direct_load_mzt = !config.direct_load_mzt;
\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
999 _tcscpy_s(config.recent_tape_path[0], _MAX_PATH, path);
\r
1001 emu->play_tape(path);
\r
1005 #ifdef USE_TAPE_BUTTON
\r
1006 case ID_PLAY_BUTTON:
\r
1011 case ID_STOP_BUTTON:
\r
1017 #ifdef USE_LASER_DISC
\r
1018 case ID_OPEN_LASER_DISC:
\r
1020 open_laser_disc_dialog(hWnd);
\r
1023 case ID_CLOSE_LASER_DISC:
\r
1025 emu->close_laser_disc();
\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
1041 _tcscpy_s(config.recent_laser_disc_path[0], _MAX_PATH, path);
\r
1043 emu->open_laser_disc(path);
\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
1051 open_binary_dialog(hWnd, drv, true); \
\r
1054 case ID_SAVE_BINARY: \
\r
1056 open_binary_dialog(hWnd, drv, false); \
\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
1072 _tcscpy_s(config.recent_binary_path[drv][0], _MAX_PATH, path); \
\r
1074 emu->load_binary(drv, path); \
\r
1077 BINARY_MENU_ITEMS(0, ID_LOAD_BINARY1, ID_SAVE_BINARY1, ID_RECENT_BINARY1)
\r
1079 #ifdef USE_BINARY_FILE2
\r
1080 BINARY_MENU_ITEMS(1, ID_LOAD_BINARY2, ID_SAVE_BINARY2, ID_RECENT_BINARY2)
\r
1082 case ID_SCREEN_REC60:
\r
1083 case ID_SCREEN_REC30:
\r
1084 case ID_SCREEN_REC15:
\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
1094 case ID_SCREEN_STOP:
\r
1096 emu->stop_rec_video();
\r
1097 emu->stop_rec_sound();
\r
1100 case ID_SCREEN_CAPTURE:
\r
1102 emu->capture_screen();
\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
1114 set_window(hWnd, LOWORD(wParam) - ID_SCREEN_WINDOW1);
\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
1153 case ID_SCREEN_USE_D3D9:
\r
1154 config.use_d3d9 = !config.use_d3d9;
\r
1156 emu->set_display_size(-1, -1, !now_fullscreen);
\r
1159 case ID_SCREEN_WAIT_VSYNC:
\r
1160 config.wait_vsync = !config.wait_vsync;
\r
1162 emu->set_display_size(-1, -1, !now_fullscreen);
\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
1170 emu->set_display_size(-1, -1, !now_fullscreen);
\r
1174 case ID_ACCEL_SCREEN:
\r
1177 set_window(hWnd, now_fullscreen ? prev_window_mode : -1);
\r
1180 case ID_ACCEL_MOUSE:
\r
1182 emu->toggle_mouse();
\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
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
1201 set_window(hWnd, prev_window_mode);
\r
1207 #ifdef USE_CRT_FILTER
\r
1208 case ID_SCREEN_CRT_FILTER:
\r
1209 config.crt_filter = !config.crt_filter;
\r
1212 #ifdef USE_SCANLINE
\r
1213 case ID_SCREEN_SCANLINE:
\r
1214 config.scan_line = !config.scan_line;
\r
1216 emu->update_config();
\r
1220 case ID_SOUND_REC:
\r
1222 emu->start_rec_sound();
\r
1225 case ID_SOUND_STOP:
\r
1227 emu->stop_rec_sound();
\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
1240 emu->update_config();
\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
1250 emu->update_config();
\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
1264 // emu->update_config();
\r
1268 #ifdef USE_VIDEO_CAPTURE
\r
1269 case ID_CAPTURE_FILTER:
\r
1271 emu->show_capture_dev_filter();
\r
1274 case ID_CAPTURE_PIN:
\r
1276 emu->show_capture_dev_pin();
\r
1279 case ID_CAPTURE_SOURCE:
\r
1281 emu->show_capture_dev_source();
\r
1284 case ID_CAPTURE_CLOSE:
\r
1286 emu->close_capture_dev();
\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
1299 emu->open_capture_dev(no, false);
\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
1337 emu->press_button(LOWORD(wParam) - ID_BUTTON);
\r
1344 return DefWindowProc(hWnd, iMsg, wParam, lParam) ;
\r
1348 LRESULT CALLBACK ButtonWndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
\r
1350 for(int i = 0; i < MAX_BUTTONS; i++) {
\r
1351 if(hWnd == hButton[i]) {
\r
1354 case WM_SYSKEYDOWN:
\r
1356 emu->key_down(LOBYTE(wParam), false);
\r
1362 emu->key_up(LOBYTE(wParam));
\r
1366 return CallWindowProc(buttonWndProc[i], hWnd, iMsg, wParam, lParam);
\r
1373 void update_menu(HWND hWnd, HMENU hMenu, int pos)
\r
1375 #ifdef MENU_POS_CONTROL
\r
1376 if(pos == MENU_POS_CONTROL) {
\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
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
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
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
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
1401 #ifdef USE_AUTO_KEY
\r
1403 bool now_paste = true, now_stop = true;
\r
1405 now_paste = emu->now_auto_key();
\r
1406 now_stop = !now_paste;
\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
1411 #ifdef USE_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
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
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
1435 AppendMenu(hMenu, MF_GRAYED | MF_STRING, ID_RECENT_CART, _T("None")); \
\r
1437 EnableMenuItem(hMenu, ID_CLOSE_CART, emu->cart_inserted(drv) ? MF_ENABLED : MF_GRAYED);
\r
1439 UPDATE_MENU_CART(0, ID_RECENT_CART1, ID_CLOSE_CART1)
\r
1442 #ifdef MENU_POS_CART2
\r
1443 else if(pos == MENU_POS_CART2) {
\r
1445 UPDATE_MENU_CART(1, ID_RECENT_CART2, ID_CLOSE_CART2)
\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
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
1460 AppendMenu(hMenu, MF_SEPARATOR, 0, NULL); \
\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
1469 AppendMenu(hMenu, MF_GRAYED | MF_STRING, ID_RECENT_FD, _T("None")); \
\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
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
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
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
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
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
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
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
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
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
1532 AppendMenu(hMenu, MF_GRAYED | MF_STRING, ID_RECENT_QD, _T("None")); \
\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
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
1545 #ifdef MENU_POS_TAPE
\r
1546 else if(pos == MENU_POS_TAPE) {
\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
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
1559 AppendMenu(hMenu, MF_GRAYED | MF_STRING, ID_RECENT_TAPE, _T("None"));
\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
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
1570 #ifdef MENU_POS_LASER_DISC
\r
1571 else if(pos == MENU_POS_LASER_DISC) {
\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
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
1584 AppendMenu(hMenu, MF_GRAYED | MF_STRING, ID_RECENT_LASER_DISC, _T("None"));
\r
1586 EnableMenuItem(hMenu, ID_CLOSE_LASER_DISC, emu->laser_disc_inserted() ? MF_ENABLED : MF_GRAYED);
\r
1589 #ifdef MENU_POS_BINARY1
\r
1590 else if(pos == MENU_POS_BINARY1) {
\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
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
1604 AppendMenu(hMenu, MF_GRAYED | MF_STRING, ID_RECENT_BINARY, _T("None")); \
\r
1606 UPDATE_MENU_BINARY(0, ID_RECENT_BINARY1)
\r
1609 #ifdef MENU_POS_BINARY2
\r
1610 else if(pos == MENU_POS_BINARY2) {
\r
1612 UPDATE_MENU_BINARY(1, ID_RECENT_BINARY2)
\r
1615 #ifdef MENU_POS_SCREEN
\r
1616 else if(pos == MENU_POS_SCREEN) {
\r
1618 bool now_rec = true, now_stop = true;
\r
1620 now_rec = emu->now_rec_video;
\r
1621 now_stop = !now_rec;
\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
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
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
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
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
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
1655 DeleteMenu(hMenu, ID_SCREEN_FULLSCREEN1 + i, MF_BYCOMMAND);
\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
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
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
1672 #ifdef USE_CRT_FILTER
\r
1673 CheckMenuItem(hMenu, ID_SCREEN_CRT_FILTER, config.crt_filter ? MF_CHECKED : MF_UNCHECKED);
\r
1675 #ifdef USE_SCANLINE
\r
1676 CheckMenuItem(hMenu, ID_SCREEN_SCANLINE, config.scan_line ? MF_CHECKED : MF_UNCHECKED);
\r
1680 #ifdef MENU_POS_SOUND
\r
1681 else if(pos == MENU_POS_SOUND) {
\r
1683 bool now_rec = false, now_stop = false;
\r
1685 now_rec = emu->now_rec_sound;
\r
1686 now_stop = !now_rec;
\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
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
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
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
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
1710 for(int i = 0; i < 8; i++) {
\r
1711 DeleteMenu(hMenu, ID_CAPTURE_DEVICE1 + i, MF_BYCOMMAND);
\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
1718 if(num_devs == 0) {
\r
1719 AppendMenu(hMenu, MF_GRAYED | MF_STRING, ID_CAPTURE_DEVICE1, _T("None"));
\r
1721 if(cur_index != -1) {
\r
1722 CheckMenuRadioItem(hMenu, ID_CAPTURE_DEVICE1, ID_CAPTURE_DEVICE1, ID_CAPTURE_DEVICE1 + cur_index, MF_BYCOMMAND);
\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
1730 DrawMenuBar(hWnd);
\r
1734 void open_cart_dialog(HWND hWnd, int drv)
\r
1736 _TCHAR* path = get_open_file_name(
\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
1751 _T("Supported Files (*.rom;*.bin)\0*.rom;*.bin\0All Files (*.*)\0*.*\0\0"),
\r
1752 _T("Game Cartridge"),
\r
1754 config.initial_cart_dir, _MAX_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
1765 void open_disk_dialog(HWND hWnd, int drv)
\r
1767 _TCHAR* path = get_open_file_name(
\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
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
1780 void open_disk(int drv, _TCHAR* path, int bank)
\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
1786 if(check_file_extension(path, _T(".d88")) || check_file_extension(path, _T(".d77"))) {
\r
1788 if(_tfopen_s(&fp, path, _T("rb")) == 0) {
\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
1797 fread(tmp, 17, 1, fp);
\r
1799 MultiByteToWideChar(CP_ACP, 0, tmp, -1, emu->d88_file[drv].bank[emu->d88_file[drv].bank_num].name, 18);
\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
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
1811 _tcscpy_s(emu->d88_file[drv].path, _MAX_PATH, path);
\r
1812 emu->d88_file[drv].cur_bank = bank;
\r
1815 emu->d88_file[drv].bank_num = 0;
\r
1819 emu->open_disk(drv, path, emu->d88_file[drv].bank[bank].offset);
\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
1827 void close_disk(int drv)
\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
1837 void open_quickdisk_dialog(HWND hWnd, int drv)
\r
1839 _TCHAR* path = get_open_file_name(
\r
1841 _T("Supported Files (*.mzt;*.q20;*.qdf)\0*.mzt;*.q20;*.qdf\0All Files (*.*)\0*.*\0\0"),
\r
1843 config.initial_quickdisk_dir, _MAX_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
1854 void open_tape_dialog(HWND hWnd, bool play)
\r
1856 _TCHAR* path = get_open_file_name(
\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
1875 _T("Supported Files (*.wav;*.cas)\0*.wav;*.cas\0All Files (*.*)\0*.*\0\0"),
\r
1877 play ? _T("Data Recorder Tape [Play]") : _T("Data Recorder Tape [Rec]"),
\r
1878 config.initial_tape_dir, _MAX_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
1884 emu->play_tape(path);
\r
1886 emu->rec_tape(path);
\r
1892 #ifdef USE_LASER_DISC
\r
1893 void open_laser_disc_dialog(HWND hWnd)
\r
1895 _TCHAR* path = get_open_file_name(
\r
1897 _T("Supported Files (*.avi;*.mpg;*.mpeg;*.wmv;*.ogv)\0*.avi;*.mpg;*.mpeg;*.wmv;*.ogv\0All Files (*.*)\0*.*\0\0"),
\r
1899 config.initial_laser_disc_dir, _MAX_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
1909 #ifdef USE_BINARY_FILE1
\r
1910 void open_binary_dialog(HWND hWnd, int drv, bool load)
\r
1912 _TCHAR* path = get_open_file_name(
\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
1918 _T("Memory Dump"),
\r
1920 config.initial_binary_dir, _MAX_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
1926 emu->load_binary(drv, path);
\r
1928 emu->save_binary(drv, path);
\r
1934 #ifdef SUPPORT_DRAG_DROP
\r
1935 void open_any_file(_TCHAR* path)
\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
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
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
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
2000 void set_window(HWND hWnd, int mode)
\r
2002 static LONG style = WS_VISIBLE;
\r
2003 WINDOWPLACEMENT place;
\r
2004 place.length = sizeof(WINDOWPLACEMENT);
\r
2006 if(mode >= 0 && mode < MAX_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
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
2024 show_menu_bar(hWnd);
\r
2026 SetWindowPos(hWnd, NULL, dest_x, dest_y, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER);
\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
2037 config.window_mode = prev_window_mode = mode;
\r
2039 // set screen size to emu class
\r
2040 emu->set_display_size(width, height, true);
\r
2041 } else if(!now_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
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
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
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
2070 config.window_mode = mode;
\r
2073 hide_menu_bar(hWnd);
\r
2075 // set screen size to emu class
\r
2076 emu->set_display_size(width, height, false);
\r