#include "app.h" #include "version.h" #include #include char *romname; HWND FrameWnd=NULL; RECT FrameRectMy; int MainWidth=720,MainHeight=480; // Window proc for the frame window: static LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam) { switch (msg) { case WM_CLOSE: PostQuitMessage(0); return 0; case WM_DESTROY: FrameWnd=NULL; break; // Blank handle case WM_SIZE: case WM_MOVE: case WM_SIZING: GetWindowRect(hwnd, &FrameRectMy); break; } return DefWindowProc(hwnd,msg,wparam,lparam); } static int FrameInit() { WNDCLASS wc; RECT rect={0,0,0,0}; int style=0; int left=0,top=0,width=0,height=0; memset(&wc,0,sizeof(wc)); // Register the window class: wc.lpfnWndProc=WndProc; wc.hInstance=GetModuleHandle(NULL); wc.hCursor=LoadCursor(NULL,IDC_ARROW); wc.hbrBackground=CreateSolidBrush(0); wc.lpszClassName="MainFrame"; RegisterClass(&wc); rect.right =320;//MainWidth; rect.bottom=224;//MainHeight; // Adjust size of windows based on borders: style=WS_OVERLAPPEDWINDOW; AdjustWindowRect(&rect,style,0); width =rect.right-rect.left; height=rect.bottom-rect.top; // Place window in the centre of the screen: SystemParametersInfo(SPI_GETWORKAREA,0,&rect,0); left=rect.left+rect.right; top=rect.top+rect.bottom; left-=width; left>>=1; top-=height; top>>=1; // Create the window: FrameWnd=CreateWindow(wc.lpszClassName,"PicoDrive " VERSION,style|WS_VISIBLE, left,top,width,height,NULL,NULL,NULL,NULL); ShowWindow(FrameWnd, SW_NORMAL); UpdateWindow(FrameWnd); GetWindowRect(FrameWnd, &FrameRectMy); return 0; } // -------------------- static DWORD WINAPI ThreadCode(void *) { LoopCode(); return 0; } int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR cmdline,int) { MSG msg; int ret=0; DWORD tid=0; HANDLE thread=NULL; unsigned char *rom_data = 0; unsigned int rom_size = 0; static char rompath[MAX_PATH] = { 0, }; pm_file *rom = NULL; FrameInit(); ret=LoopInit(); if (ret) goto end0; // notaz: load rom strcpy(rompath, cmdline + (cmdline[0] == '\"' ? 1 : 0)); if(rompath[strlen(rompath)-1] == '\"') rompath[strlen(rompath)-1] = 0; if(strlen(rompath) > 4) rom = pm_open(rompath); if(!rom) { OPENFILENAME of; ZeroMemory(&of, sizeof(OPENFILENAME)); of.lStructSize = sizeof(OPENFILENAME); of.lpstrFilter = "ROMs\0*.smd;*.bin;*.gen;*.zip\0"; of.lpstrFile = rompath; rompath[0] = 0; of.nMaxFile = MAX_PATH; of.Flags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY; if(!GetOpenFileName(&of)) goto end0; rom = pm_open(rompath); if(!rom) goto end0; } romname = rompath; ret=PicoCartLoad(rom, &rom_data, &rom_size); pm_close(rom); if (ret) { error("failed to load ROM"); goto end0; } PicoCartInsert(rom_data, rom_size); // only now we got the mode (pal/ntsc), so init sound now ret=DSoundInit(); if (ret) error("Failed to init DirectSound"); // warning // Make another thread to run LoopCode(): LoopQuit=0; thread=CreateThread(NULL,0,ThreadCode,NULL,0,&tid); // Main window loop: for (;;) { GetMessage(&msg,NULL,0,0); if (msg.message==WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); } // Signal thread to quit and wait for it to exit: LoopQuit=1; WaitForSingleObject(thread,5000); CloseHandle(thread); thread=NULL; end0: LoopExit(); DestroyWindow(FrameWnd); free(rom_data); _CrtDumpMemoryLeaks(); return 0; } extern void error(char *text) { MessageBox(FrameWnd, text, "Error", 0); }