mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 15:27:46 -04:00

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@341 be3aeb3a-fb24-0410-a615-afba39da0efa
158 lines
3.7 KiB
C++
158 lines
3.7 KiB
C++
#include "app.h"
|
|
#include "version.h"
|
|
#include <crtdbg.h>
|
|
#include <commdlg.h>
|
|
|
|
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);
|
|
}
|
|
|