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