+ POINT pt;\r
+ RECT rc;\r
+ int i;\r
+ switch (msg)\r
+ {\r
+ case WM_CLOSE: PostQuitMessage(0); return 0;\r
+ case WM_DESTROY: FrameWnd=NULL; break; // Blank handle\r
+ case WM_SIZE:\r
+ case WM_MOVE:\r
+ case WM_SIZING: UpdateRect(); break;\r
+ case WM_COMMAND:\r
+ switch (LOWORD(wparam))\r
+ {\r
+ case 1000: LoadROM(NULL); break;\r
+ case 1001: PicoReset(); return 0;\r
+ case 1002: PostQuitMessage(0); return 0;\r
+ case 1100:\r
+ case 1101:\r
+ case 1102:\r
+ case 1103:\r
+ LoopWait=1; // another sync hack\r
+ for (i = 0; !LoopWaiting && i < 10; i++) Sleep(10);\r
+ FrameRectMy.right = FrameRectMy.left + rect_widths[wparam&3];\r
+ FrameRectMy.bottom = FrameRectMy.top + rect_heights[wparam&3];\r
+ AdjustWindowRect(&FrameRectMy, WS_OVERLAPPEDWINDOW, 1);\r
+ MoveWindow(hwnd, FrameRectMy.left, FrameRectMy.top,\r
+ FrameRectMy.right-FrameRectMy.left, FrameRectMy.bottom-FrameRectMy.top, 1);\r
+ UpdateRect();\r
+ if (HIWORD(wparam) == 0) { // locally sent\r
+ lock_to_1_1=0;\r
+ CheckMenuItem(mdisplay, 1104, MF_UNCHECKED);\r
+ }\r
+ if (rom_loaded) LoopWait=0;\r
+ return 0;\r
+ case 1104:\r
+ lock_to_1_1=!lock_to_1_1;\r
+ CheckMenuItem(mdisplay, 1104, lock_to_1_1 ? MF_CHECKED : MF_UNCHECKED);\r
+ return 0;\r
+ case 1210:\r
+ case 1211:\r
+ i = IsWindowVisible((LOWORD(wparam)&1) ? PicoPadWnd : PicoSwWnd);\r
+ i = !i;\r
+ ShowWindow((LOWORD(wparam)&1) ? PicoPadWnd : PicoSwWnd, i ? SW_SHOWNA : SW_HIDE);\r
+ CheckMenuItem(mpicohw, LOWORD(wparam), i ? MF_CHECKED : MF_UNCHECKED);\r
+ return 0;\r
+ case 1220:\r
+ case 1221:\r
+ case 1222:\r
+ case 1223:\r
+ case 1224:\r
+ case 1225:\r
+ case 1226:\r
+ PicoPicohw.page = LOWORD(wparam) % 10;\r
+ for (i = 0; i < 7; i++)\r
+ CheckMenuItem(mpicohw, 1220 + i, MF_UNCHECKED);\r
+ CheckMenuItem(mpicohw, 1220 + PicoPicohw.page, MF_CHECKED);\r
+ InvalidateRect(PicoSwWnd, NULL, 1);\r
+ return 0;\r
+ case 1300:\r
+ MessageBox(FrameWnd, "PicoDrive v" VERSION " (c) notaz, 2006-2008\n"\r
+ "SVP and Pico demo edition\n\n"\r
+ "Credits:\n"\r
+ "fDave: base code of PicoDrive, GenaDrive (the frontend)\n"\r
+ "Chui: Fame/C\n"\r
+ "NJ: CZ80\n"\r
+ "MAME devs: YM2612 and SN76496 cores\n"\r
+ "Stéphane Dallongeville: Gens code, base of Fame/C (C68K), CZ80\n"\r
+ "Tasco Deluxe: SVP RE work\n"\r
+ "Pierpaolo Prazzoli: info about SSP16 chips\n",\r
+ "About", 0);\r
+ return 0;\r
+ }\r
+ break;\r
+ case WM_TIMER:\r
+ GetCursorPos(&pt);\r
+ GetWindowRect(PicoSwWnd, &rc);\r
+ if (PtInRect(&rc, pt)) break;\r
+ GetWindowRect(PicoPadWnd, &rc);\r
+ if (PtInRect(&rc, pt)) break;\r
+ PicoPicohw.pen_pos[0] |= 0x8000;\r
+ PicoPicohw.pen_pos[1] |= 0x8000;\r
+ PicoPadAdd = 0;\r
+ break;\r
+ }\r
+\r
+ return DefWindowProc(hwnd,msg,wparam,lparam);\r
+}\r
+\r
+static void key_down(WPARAM key)\r
+{\r
+ switch (key) {\r
+ case VK_LEFT: PicoPadAdd |= 4; break;\r
+ case VK_RIGHT: PicoPadAdd |= 8; break;\r
+ case VK_UP: PicoPadAdd |= 1; break;\r
+ case VK_DOWN: PicoPadAdd |= 2; break;\r
+ case 'X': PicoPadAdd |= 0x10; break;\r
+ }\r
+}\r
+\r
+static void key_up(WPARAM key)\r
+{\r
+ switch (key) {\r
+ case VK_LEFT: PicoPadAdd &= ~0x04; break;\r
+ case VK_RIGHT: PicoPadAdd &= ~0x08; break;\r
+ case VK_UP: PicoPadAdd &= ~0x01; break;\r
+ case VK_DOWN: PicoPadAdd &= ~0x02; break;\r
+ case 'X': PicoPadAdd &= ~0x10; break;\r
+ }\r
+}\r
+\r
+static LRESULT CALLBACK PicoSwWndProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)\r
+{\r
+ PAINTSTRUCT ps;\r
+ HDC hdc, hdc2;\r
+\r
+ switch (msg)\r
+ {\r
+ case WM_DESTROY: PicoSwWnd=NULL; break;\r
+ case WM_LBUTTONDOWN: PicoPadAdd |= 0x20; return 0;\r
+ case WM_LBUTTONUP: PicoPadAdd &= ~0x20; return 0;\r
+ case WM_MOUSEMOVE:\r
+ if (HIWORD(lparam) < 0x20) break;\r
+ PicoPicohw.pen_pos[0] = 0x03c + LOWORD(lparam) * 2/3;\r
+ PicoPicohw.pen_pos[1] = 0x2f8 + HIWORD(lparam) - 0x20;\r
+ SetTimer(FrameWnd, 100, 1000, NULL);\r
+ break;\r
+ case WM_KEYDOWN: key_down(wparam); break;\r
+ case WM_KEYUP: key_up(wparam); break;\r
+ case WM_PAINT:\r
+ hdc = BeginPaint(hwnd, &ps);\r
+ if (ppage_bmps[PicoPicohw.page] == NULL)\r
+ {\r
+ SelectObject(hdc, GetStockObject(DEFAULT_GUI_FONT));\r
+ SetTextColor(hdc, RGB(255, 255, 255));\r
+ SetBkColor(hdc, RGB(0, 0, 0));\r
+ TextOut(hdc, 2, 2, "missing PNGs for", 16);\r
+ TextOut(hdc, 2, 18, rom_name, strlen(rom_name));\r
+ }\r
+ else\r
+ {\r
+ hdc2 = CreateCompatibleDC(GetDC(FrameWnd));\r
+ SelectObject(hdc2, ppage_bmps[PicoPicohw.page]);\r
+ BitBlt(hdc, 0, 0, 480, 240, hdc2, 0, 0, SRCCOPY);\r
+ DeleteDC(hdc2);\r
+ }\r
+ EndPaint(hwnd, &ps);\r
+ return 0;\r
+ }\r
+\r
+ return DefWindowProc(hwnd,msg,wparam,lparam);\r
+}\r
+\r
+static LRESULT CALLBACK PicoPadWndProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)\r
+{\r
+ PAINTSTRUCT ps;\r
+ HDC hdc, hdc2;\r
+\r
+ switch (msg)\r
+ {\r
+ case WM_DESTROY: PicoPadWnd=NULL; break;\r
+ case WM_LBUTTONDOWN: PicoPadAdd |= 0x20; return 0;\r
+ case WM_LBUTTONUP: PicoPadAdd &= ~0x20; return 0;\r
+ case WM_MOUSEMOVE:\r
+ PicoPicohw.pen_pos[0] = 0x03c + LOWORD(lparam);\r
+ PicoPicohw.pen_pos[1] = 0x1fc + HIWORD(lparam);\r
+ SetTimer(FrameWnd, 100, 1000, NULL);\r
+ break;\r
+ case WM_KEYDOWN: key_down(wparam); break;\r
+ case WM_KEYUP: key_up(wparam); break;\r
+ case WM_PAINT:\r
+ if (ppad_bmp == NULL) break;\r
+ hdc = BeginPaint(hwnd, &ps);\r
+ hdc2 = CreateCompatibleDC(GetDC(FrameWnd));\r
+ SelectObject(hdc2, ppad_bmp);\r
+ BitBlt(hdc, 0, 0, 320, 240, hdc2, 0, 0, SRCCOPY);\r
+ EndPaint(hwnd, &ps);\r
+ DeleteDC(hdc2);\r
+ return 0;\r
+ }\r