--- np2/win9xc/np2.cpp 2003/10/18 10:00:29 1.2 +++ np2/win9xc/np2.cpp 2005/05/13 05:47:25 1.33 @@ -1,8 +1,11 @@ #include "compiler.h" #include +#ifndef __GNUC__ #include +#endif #include "resource.h" #include "strres.h" +#include "parts.h" #include "np2.h" #include "np2arg.h" #include "dosio.h" @@ -12,71 +15,83 @@ #include "scrnmng.h" #include "soundmng.h" #include "sysmng.h" - -#include "timing.h" - -#include "memory.h" +#include "winkbd.h" +#include "ini.h" +#include "menu.h" +#include "subwind.h" +#include "dialog.h" +#include "cpucore.h" #include "pccore.h" #include "iocore.h" +#include "pc9861k.h" +#include "mpu98ii.h" #include "bios.h" - #include "scrndraw.h" #include "sound.h" - -#include "ini.h" -#include "menu.h" -#include "dialog.h" -#include "mpu98ii.h" -#include "fddfile.h" -#include "diskdrv.h" +#include "beep.h" #include "s98.h" -#include "font.h" -#include "pc9861k.h" -#include "winkbd.h" +#include "diskdrv.h" +#include "fddfile.h" +#include "timing.h" +#include "keystat.h" #include "debugsub.h" -#include "beep.h" #ifdef BETA_RELEASE -#define OPENING_WAIT 1500 +#define OPENING_WAIT 1500 #endif -#define STATSAVEMAX 10 - -static char np2help[] = "np2.hlp"; -static char np2resume[] = "sav"; - -static const char szAppCaption[] = "Neko Project II - C version"; -static const char szClassName[] = "NP2-MainWindow"; - +#if defined(SUPPORT_PC9821) + const TCHAR szAppCaption[] = _T("Neko Project-21"); +#elif defined(CPUCORE_IA32) + const TCHAR szAppCaption[] = _T("Neko Project II (IA-32)"); +#else + const TCHAR szAppCaption[] = _T("Neko Project II (C Version)"); +#endif +static const TCHAR szClassName[] = _T("NP2-MainWindow"); + HWND hWndMain; + HINSTANCE hInst; + HINSTANCE hPrev; NP2OSCFG np2oscfg = { - CW_USEDEFAULT, CW_USEDEFAULT, 0, 2, + CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, KEY_UNKNOWN, 0, 0, 0, 0, {1, 2, 2, 1}, - 0}; + 0, 0, 0}; - HWND hWndMain; - HINSTANCE hInst; - HINSTANCE hPrev; - char modulefile[MAX_PATH]; - char fddfolder[MAX_PATH]; - char hddfolder[MAX_PATH]; - char bmpfilefolder[MAX_PATH]; + TCHAR modulefile[MAX_PATH]; + TCHAR fddfolder[MAX_PATH]; + TCHAR hddfolder[MAX_PATH]; + TCHAR bmpfilefolder[MAX_PATH]; -static UINT framecnt; -static UINT waitcnt; +static UINT framecnt = 0; +static UINT waitcnt = 0; static UINT framemax = 1; static int np2opening = 1; static int np2quitmsg = 0; +static UINT8 scrnmode; + +static const TCHAR np2help[] = _T("np2.chm"); +static const TCHAR np2flagext[] = _T("S%02d"); -static BYTE scrnmode; -static void changescreen(BYTE newmode) { +static void winuienter(void) { + + soundmng_disable(SNDPROC_MAIN); + scrnmng_topwinui(); +} + +static void winuileave(void) { - BYTE change; - BYTE renewal; + scrnmng_clearwinui(); + soundmng_enable(SNDPROC_MAIN); +} + +static void changescreen(UINT8 newmode) { + + UINT8 change; + UINT8 renewal; change = scrnmode ^ newmode; renewal = (change & SCRNMODE_FULLSCREEN); @@ -88,7 +103,7 @@ static void changescreen(BYTE newmode) { } if (renewal) { soundmng_stop(); - mouse_running(MOUSE_STOP); + mousemng_disable(MOUSEPROC_WINUI); scrnmng_destroy(); if (scrnmng_create(newmode) == SUCCESS) { scrnmode = newmode; @@ -100,7 +115,7 @@ static void changescreen(BYTE newmode) { } } scrndraw_redraw(); - mouse_running(MOUSE_CONT); + mousemng_enable(MOUSEPROC_WINUI); soundmng_play(); } else { @@ -109,485 +124,560 @@ static void changescreen(BYTE newmode) { } -// ---- proc +// ---- resume and statsave -static void winuienter(void) { +#define SUPPORT_RESUME - soundmng_stop(); - scrnmng_topwinui(); +#if defined(SUPPORT_RESUME) || defined(SUPPORT_STATSAVE) +static void getstatfilename(TCHAR *path, const TCHAR *ext, int size) { + + file_cpyname(path, modulefile, size); + file_cutext(path); + file_catname(path, str_dot, size); + file_catname(path, ext, size); } -static void winuileave(void) { +static int flagsave(const TCHAR *ext) { - scrnmng_clearwinui(); + int ret; + TCHAR path[MAX_PATH]; + + getstatfilename(path, ext, NELEMENTS(path)); + soundmng_stop(); + ret = statsave_save(path); + if (ret) { + file_delete(path); + } soundmng_play(); + return(ret); } -LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { +static void flagdelete(const TCHAR *ext) { - PAINTSTRUCT ps; - RECT rc; - HDC hdc; - UINT update; + TCHAR path[MAX_PATH]; - switch (msg) { - case WM_CREATE: - WINNLSEnableIME(hWnd, FALSE); -// DragAcceptFiles(hWnd, TRUE); - break; + getstatfilename(path, ext, NELEMENTS(path)); + file_delete(path); +} - case WM_SYSCOMMAND: - update = 0; - switch(wParam) { - case IDM_MEMORYDUMP: - debugsub_memorydump(); - break; +static int flagload(const TCHAR *ext, const TCHAR *title, BOOL force) { - default: - return(DefWindowProc(hWnd, msg, wParam, lParam)); - } - sysmng_update(update); - break; + int ret; + int id; + TCHAR path[MAX_PATH]; + TCHAR buf[1024]; + + getstatfilename(path, ext, NELEMENTS(path)); + winuienter(); + id = IDYES; + ret = statsave_check(path, buf, NELEMENTS(buf)); + if (ret & (~STATFLAG_DISKCHG)) { + MessageBox(hWndMain, _T("Couldn't restart"), title, + MB_OK | MB_ICONSTOP); + id = IDNO; + } + else if ((!force) && (ret & STATFLAG_DISKCHG)) { + TCHAR buf2[1024 + 256]; + wsprintf(buf2, _T("Conflict!\n\n%s\nContinue?"), buf); + id = MessageBox(hWndMain, buf2, title, + MB_YESNOCANCEL | MB_ICONQUESTION); + } + if (id == IDYES) { + statsave_load(path); + } + sysmng_workclockreset(); + sysmng_updatecaption(); + winuileave(); + return(id); +} +#endif - case WM_COMMAND: - update = 0; - switch(LOWORD(wParam)) { - case IDM_RESET: - pccore_cfgupdate(); - pccore_reset(); - break; - case IDM_CONFIG: - winuienter(); - DialogBox(hInst, MAKEINTRESOURCE(IDD_CONFIG), - hWnd, (DLGPROC)CfgDialogProc); - winuileave(); - break; +// ---- proc - case IDM_NEWDISK: - winuienter(); - dialog_newdisk(hWnd); - winuileave(); - break; +static void np2cmd(HWND hWnd, UINT16 cmd) { - case IDM_CHANGEFONT: - winuienter(); - dialog_font(hWnd); - winuileave(); - break; + UINT update; - case IDM_EXIT: - SendMessage(hWnd, WM_CLOSE, 0, 0L); - break; + update = 0; + switch(cmd) { + case IDM_RESET: + pccore_cfgupdate(); + pccore_reset(); + break; - case IDM_FDD1OPEN: - winuienter(); - dialog_changefdd(hWnd, 0); - winuileave(); - break; + case IDM_CONFIG: + winuienter(); + DialogBox(hInst, MAKEINTRESOURCE(IDD_CONFIG), + hWnd, (DLGPROC)CfgDialogProc); + winuileave(); + break; - case IDM_FDD1EJECT: - diskdrv_setfdd(0, NULL, 0); - break; + case IDM_NEWDISK: + winuienter(); + dialog_newdisk(hWnd); + winuileave(); + break; - case IDM_FDD2OPEN: - winuienter(); - dialog_changefdd(hWnd, 1); - winuileave(); - break; + case IDM_CHANGEFONT: + winuienter(); + dialog_font(hWnd); + winuileave(); + break; - case IDM_FDD2EJECT: - diskdrv_setfdd(1, NULL, 0); - break; + case IDM_EXIT: + SendMessage(hWnd, WM_CLOSE, 0, 0L); + break; - case IDM_SASI1OPEN: - winuienter(); - dialog_changehdd(hWnd, 0); - winuileave(); - break; + case IDM_FDD1OPEN: + winuienter(); + dialog_changefdd(hWnd, 0); + winuileave(); + break; - case IDM_SASI1EJECT: - diskdrv_sethdd(0, NULL); - break; + case IDM_FDD1EJECT: + diskdrv_setfdd(0, NULL, 0); + break; - case IDM_SASI2OPEN: - winuienter(); - dialog_changehdd(hWnd, 1); - winuileave(); - break; + case IDM_FDD2OPEN: + winuienter(); + dialog_changefdd(hWnd, 1); + winuileave(); + break; - case IDM_SASI2EJECT: - diskdrv_sethdd(1, NULL); - break; + case IDM_FDD2EJECT: + diskdrv_setfdd(1, NULL, 0); + break; - case IDM_WINDOW: - changescreen(scrnmode & (~SCRNMODE_FULLSCREEN)); - break; + case IDM_SASI1OPEN: + winuienter(); + dialog_changehdd(hWnd, 0); + winuileave(); + break; - case IDM_FULLSCREEN: - changescreen(scrnmode | SCRNMODE_FULLSCREEN); - break; + case IDM_SASI1EJECT: + diskdrv_sethdd(0, NULL); + break; - case IDM_ROLNORMAL: - xmenu_setroltate(0); - changescreen(scrnmode & (~SCRNMODE_ROTATEMASK)); - break; + case IDM_SASI2OPEN: + winuienter(); + dialog_changehdd(hWnd, 1); + winuileave(); + break; + + case IDM_SASI2EJECT: + diskdrv_sethdd(1, NULL); + break; + + case IDM_WINDOW: + changescreen(scrnmode & (~SCRNMODE_FULLSCREEN)); + break; + + case IDM_FULLSCREEN: + changescreen(scrnmode | SCRNMODE_FULLSCREEN); + break; - case IDM_ROLLEFT: - xmenu_setroltate(1); - changescreen((scrnmode & (~SCRNMODE_ROTATEMASK)) | + case IDM_ROLNORMAL: + xmenu_setroltate(0); + changescreen(scrnmode & (~SCRNMODE_ROTATEMASK)); + break; + + case IDM_ROLLEFT: + xmenu_setroltate(1); + changescreen((scrnmode & (~SCRNMODE_ROTATEMASK)) | SCRNMODE_ROTATELEFT); - break; + break; - case IDM_ROLRIGHT: - xmenu_setroltate(2); - changescreen((scrnmode & (~SCRNMODE_ROTATEMASK)) | + case IDM_ROLRIGHT: + xmenu_setroltate(2); + changescreen((scrnmode & (~SCRNMODE_ROTATEMASK)) | SCRNMODE_ROTATERIGHT); - break; + break; - case IDM_DISPSYNC: - xmenu_setdispmode(np2cfg.DISPSYNC ^ 1); - update |= SYS_UPDATECFG; - break; + case IDM_DISPSYNC: + xmenu_setdispmode(np2cfg.DISPSYNC ^ 1); + update |= SYS_UPDATECFG; + break; - case IDM_RASTER: - xmenu_setraster(np2cfg.RASTER ^ 1); - if (np2cfg.RASTER) { - changescreen(scrnmode | SCRNMODE_HIGHCOLOR); - } - else { - changescreen(scrnmode & (~SCRNMODE_HIGHCOLOR)); - } - update |= SYS_UPDATECFG; - break; + case IDM_RASTER: + xmenu_setraster(np2cfg.RASTER ^ 1); + if (np2cfg.RASTER) { + changescreen(scrnmode | SCRNMODE_HIGHCOLOR); + } + else { + changescreen(scrnmode & (~SCRNMODE_HIGHCOLOR)); + } + update |= SYS_UPDATECFG; + break; - case IDM_NOWAIT: - xmenu_setwaitflg(np2oscfg.NOWAIT ^ 1); - update |= SYS_UPDATECFG; - break; + case IDM_NOWAIT: + xmenu_setwaitflg(np2oscfg.NOWAIT ^ 1); + update |= SYS_UPDATECFG; + break; - case IDM_AUTOFPS: - xmenu_setframe(0); - update |= SYS_UPDATECFG; - break; + case IDM_AUTOFPS: + xmenu_setframe(0); + update |= SYS_UPDATECFG; + break; - case IDM_60FPS: - xmenu_setframe(1); - update |= SYS_UPDATECFG; - break; + case IDM_60FPS: + xmenu_setframe(1); + update |= SYS_UPDATECFG; + break; - case IDM_30FPS: - xmenu_setframe(2); - update |= SYS_UPDATECFG; - break; + case IDM_30FPS: + xmenu_setframe(2); + update |= SYS_UPDATECFG; + break; - case IDM_20FPS: - xmenu_setframe(3); - update |= SYS_UPDATECFG; - break; + case IDM_20FPS: + xmenu_setframe(3); + update |= SYS_UPDATECFG; + break; - case IDM_15FPS: - xmenu_setframe(4); - update |= SYS_UPDATECFG; - break; + case IDM_15FPS: + xmenu_setframe(4); + update |= SYS_UPDATECFG; + break; - case IDM_SCREENOPT: - winuienter(); - dialog_scropt(hWnd); - winuileave(); - break; + case IDM_SCREENOPT: + winuienter(); + dialog_scropt(hWnd); + winuileave(); + break; - case IDM_KEY: - xmenu_setkey(0); - break; + case IDM_KEY: + xmenu_setkey(0); + update |= SYS_UPDATECFG; + break; - case IDM_JOY1: - xmenu_setkey(1); - break; + case IDM_JOY1: + xmenu_setkey(1); + update |= SYS_UPDATECFG; + break; - case IDM_JOY2: - xmenu_setkey(2); - break; + case IDM_JOY2: + xmenu_setkey(2); + update |= SYS_UPDATECFG; + break; - case IDM_XSHIFT: - xmenu_setxshift(np2cfg.XSHIFT ^ 1); - keystat_forcerelease(0x70); - break; + case IDM_XSHIFT: + xmenu_setxshift(np2cfg.XSHIFT ^ 1); + keystat_forcerelease(0x70); + update |= SYS_UPDATECFG; + break; - case IDM_XCTRL: - xmenu_setxshift(np2cfg.XSHIFT ^ 2); - keystat_forcerelease(0x74); - break; + case IDM_XCTRL: + xmenu_setxshift(np2cfg.XSHIFT ^ 2); + keystat_forcerelease(0x74); + update |= SYS_UPDATECFG; + break; - case IDM_XGRPH: - xmenu_setxshift(np2cfg.XSHIFT ^ 4); - keystat_forcerelease(0x73); - break; + case IDM_XGRPH: + xmenu_setxshift(np2cfg.XSHIFT ^ 4); + keystat_forcerelease(0x73); + update |= SYS_UPDATECFG; + break; - case IDM_F12MOUSE: - xmenu_setf12copy(0); - keystat_resetcopyhelp(); - update |= SYS_UPDATECFG; - break; + case IDM_F12MOUSE: + xmenu_setf12copy(0); + winkbd_resetf12(); + update |= SYS_UPDATEOSCFG; + break; - case IDM_F12COPY: - xmenu_setf12copy(1); - keystat_resetcopyhelp(); - update |= SYS_UPDATECFG; - break; + case IDM_F12COPY: + xmenu_setf12copy(1); + winkbd_resetf12(); + update |= SYS_UPDATEOSCFG; + break; - case IDM_F12STOP: - xmenu_setf12copy(2); - keystat_resetcopyhelp(); - update |= SYS_UPDATECFG; - break; + case IDM_F12STOP: + xmenu_setf12copy(2); + winkbd_resetf12(); + update |= SYS_UPDATEOSCFG; + break; - case IDM_BEEPOFF: - xmenu_setbeepvol(0); - beep_setvol(0); - update |= SYS_UPDATECFG; - break; + case IDM_F12EQU: + xmenu_setf12copy(3); + winkbd_resetf12(); + update |= SYS_UPDATEOSCFG; + break; - case IDM_BEEPLOW: - xmenu_setbeepvol(1); - beep_setvol(1); - update |= SYS_UPDATECFG; - break; + case IDM_F12COMMA: + xmenu_setf12copy(4); + winkbd_resetf12(); + update |= SYS_UPDATEOSCFG; + break; - case IDM_BEEPMID: - xmenu_setbeepvol(2); - beep_setvol(2); - update |= SYS_UPDATECFG; - break; + case IDM_BEEPOFF: + xmenu_setbeepvol(0); + beep_setvol(0); + update |= SYS_UPDATECFG; + break; - case IDM_BEEPHIGH: - xmenu_setbeepvol(3); - beep_setvol(3); - update |= SYS_UPDATECFG; - break; + case IDM_BEEPLOW: + xmenu_setbeepvol(1); + beep_setvol(1); + update |= SYS_UPDATECFG; + break; - case IDM_NOSOUND: - xmenu_setsound(0); - update |= SYS_UPDATECFG; - break; + case IDM_BEEPMID: + xmenu_setbeepvol(2); + beep_setvol(2); + update |= SYS_UPDATECFG; + break; - case IDM_PC9801_14: - xmenu_setsound(1); - update |= SYS_UPDATECFG; - break; + case IDM_BEEPHIGH: + xmenu_setbeepvol(3); + beep_setvol(3); + update |= SYS_UPDATECFG; + break; - case IDM_PC9801_26K: - { - BYTE sw; - sw = np2cfg.SOUND_SW; - if (sw & 4) { - sw &= 6; - sw ^= 2; - } - else { - sw = 2; - } - xmenu_setsound(sw); - update |= SYS_UPDATECFG; - } - break; + case IDM_NOSOUND: + xmenu_setsound(0x00); + update |= SYS_UPDATECFG; + break; - case IDM_PC9801_86: - { - BYTE sw; - sw = np2cfg.SOUND_SW; - if (sw & 2) { - sw &= 6; - sw ^= 4; - } - else if (!(sw & 4)) { - sw = 4; - } - xmenu_setsound(sw); - update |= SYS_UPDATECFG; - } - break; + case IDM_PC9801_14: + xmenu_setsound(0x01); + update |= SYS_UPDATECFG; + break; - case IDM_PC9801_118: - xmenu_setsound(8); - update |= SYS_UPDATECFG; - break; + case IDM_PC9801_26K: + xmenu_setsound(0x02); + update |= SYS_UPDATECFG; + break; - case IDM_CHIBIOTO: - { - BYTE sw; - sw = np2cfg.SOUND_SW; - if (sw & 4) { - sw &= 0x14; - sw ^= 0x10; - } - else { - sw = 0x14; - } - xmenu_setsound(sw); - update |= SYS_UPDATECFG; - } - break; + case IDM_PC9801_86: + xmenu_setsound(0x04); + update |= SYS_UPDATECFG; + break; - case IDM_SPEAKBOARD: - xmenu_setsound(0x20); - update |= SYS_UPDATECFG; - break; + case IDM_PC9801_26_86: + xmenu_setsound(0x06); + update |= SYS_UPDATECFG; + break; - case IDM_SPARKBOARD: - xmenu_setsound(0x40); - update |= SYS_UPDATECFG; - break; + case IDM_PC9801_86_CB: + xmenu_setsound(0x14); + update |= SYS_UPDATECFG; + break; - case IDM_AMD98: - xmenu_setsound(0x80); - update |= SYS_UPDATECFG; - break; + case IDM_PC9801_118: + xmenu_setsound(0x08); + update |= SYS_UPDATECFG; + break; - case IDM_SNDOPT: - winuienter(); - dialog_sndopt(hWnd); - winuileave(); - break; + case IDM_SPEAKBOARD: + xmenu_setsound(0x20); + update |= SYS_UPDATECFG; + break; - case IDM_SEEKSND: - xmenu_setmotorflg(np2cfg.MOTOR ^ 1); - update |= SYS_UPDATECFG; - break; + case IDM_SPARKBOARD: + xmenu_setsound(0x40); + update |= SYS_UPDATECFG; + break; - case IDM_MEM640: - xmenu_setextmem(0); - update |= SYS_UPDATECFG; - break; + case IDM_AMD98: + xmenu_setsound(0x80); + update |= SYS_UPDATECFG; + break; - case IDM_MEM16: - xmenu_setextmem(1); - update |= SYS_UPDATECFG; - break; + case IDM_JASTSOUND: + xmenu_setjastsound(np2oscfg.jastsnd ^ 1); + update |= SYS_UPDATEOSCFG; + break; - case IDM_MEM36: - xmenu_setextmem(3); - update |= SYS_UPDATECFG; - break; + case IDM_SEEKSND: + xmenu_setmotorflg(np2cfg.MOTOR ^ 1); + update |= SYS_UPDATECFG; + break; - case IDM_MEM76: - xmenu_setextmem(7); - update |= SYS_UPDATECFG; - break; + case IDM_MEM640: + xmenu_setextmem(0); + update |= SYS_UPDATECFG; + break; - case IDM_MOUSE: - mouse_running(MOUSE_XOR); - xmenu_setmouse(np2oscfg.MOUSE_SW ^ 1); - update |= SYS_UPDATECFG; - break; + case IDM_MEM16: + xmenu_setextmem(1); + update |= SYS_UPDATECFG; + break; - case IDM_MPUPC98: - winuienter(); - DialogBox(hInst, MAKEINTRESOURCE(IDD_MPUPC98), - hWnd, (DLGPROC)MidiDialogProc); - winuileave(); - break; + case IDM_MEM36: + xmenu_setextmem(3); + update |= SYS_UPDATECFG; + break; - case IDM_MIDIPANIC: // ver0.29 - rs232c_midipanic(); - mpu98ii_midipanic(); - pc9861k_midipanic(); - break; + case IDM_MEM76: + xmenu_setextmem(7); + update |= SYS_UPDATECFG; + break; - case IDM_BMPSAVE: - winuienter(); - dialog_writebmp(hWnd); - winuileave(); - break; + case IDM_MEM116: + xmenu_setextmem(11); + update |= SYS_UPDATECFG; + break; - case IDM_S98LOGGING: - winuienter(); - dialog_s98(hWnd); - winuileave(); - break; + case IDM_MEM136: + xmenu_setextmem(13); + update |= SYS_UPDATECFG; + break; + + case IDM_MOUSE: + mousemng_toggle(MOUSEPROC_SYSTEM); + xmenu_setmouse(np2oscfg.MOUSE_SW ^ 1); + update |= SYS_UPDATECFG; + break; + + case IDM_MPUPC98: + winuienter(); + DialogBox(hInst, MAKEINTRESOURCE(IDD_MPUPC98), + hWnd, (DLGPROC)MidiDialogProc); + winuileave(); + break; + + case IDM_MIDIPANIC: // ver0.29 + rs232c_midipanic(); + mpu98ii_midipanic(); + pc9861k_midipanic(); + break; + + case IDM_SNDOPT: + winuienter(); + dialog_sndopt(hWnd); + winuileave(); + break; - case IDM_CALENDAR: - winuienter(); - DialogBox(hInst, MAKEINTRESOURCE(IDD_CALENDAR), + case IDM_BMPSAVE: + winuienter(); + dialog_writebmp(hWnd); + winuileave(); + break; +#if defined(SUPPPORT_S98) + case IDM_S98LOGGING: + winuienter(); + dialog_s98(hWnd); + winuileave(); + break; +#endif +#if defined(SUPPORT_WAVEREC) + case IDM_WAVEREC: + winuienter(); + dialog_waverec(hWnd); + winuileave(); + break; +#endif + case IDM_CALENDAR: + winuienter(); + DialogBox(hInst, MAKEINTRESOURCE(IDD_CALENDAR), hWnd, (DLGPROC)ClndDialogProc); - winuileave(); - break; + winuileave(); + break; - case IDM_JOYX: - xmenu_setbtnmode(np2cfg.BTN_MODE ^ 1); - update |= SYS_UPDATECFG; - break; + case IDM_JOYX: + xmenu_setbtnmode(np2cfg.BTN_MODE ^ 1); + update |= SYS_UPDATECFG; + break; - case IDM_RAPID: - xmenu_setbtnrapid(np2cfg.BTN_RAPID ^ 1); - update |= SYS_UPDATECFG; - break; + case IDM_RAPID: + xmenu_setbtnrapid(np2cfg.BTN_RAPID ^ 1); + update |= SYS_UPDATECFG; + break; - case IDM_MSRAPID: - xmenu_setmsrapid(np2cfg.MOUSERAPID ^ 1); - update |= SYS_UPDATECFG; - break; + case IDM_MSRAPID: + xmenu_setmsrapid(np2cfg.MOUSERAPID ^ 1); + update |= SYS_UPDATECFG; + break; - case IDM_I286SAVE: - debugsub_status(); - break; + case IDM_I286SAVE: + debugsub_status(); + break; - case IDM_HELP: - ShellExecute(hWnd, NULL, file_getcd(np2help), + case IDM_HELP: + ShellExecute(hWnd, NULL, file_getcd(np2help), NULL, NULL, SW_SHOWNORMAL); - break; + break; - case IDM_ABOUT: - winuienter(); - DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUT), + case IDM_ABOUT: + winuienter(); + DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUT), hWnd, (DLGPROC)AboutDialogProc); - winuileave(); + winuileave(); + break; + } + sysmng_update(update); +} + +LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { + + PAINTSTRUCT ps; + RECT rc; + HDC hdc; + UINT update; + + switch (msg) { + case WM_CREATE: +#ifndef __GNUC__ + WINNLSEnableIME(hWnd, FALSE); +#endif + break; + + case WM_SYSCOMMAND: + update = 0; + switch(wParam) { + case IDM_MEMORYDUMP: + debugsub_memorydump(); break; + + default: + return(DefWindowProc(hWnd, msg, wParam, lParam)); } sysmng_update(update); break; + case WM_COMMAND: + np2cmd(hWnd, LOWORD(wParam)); + break; + case WM_ACTIVATE: if (LOWORD(wParam) != WA_INACTIVE) { scrnmng_update(); - mouse_running(MOUSE_CONT_M); + keystat_allrelease(); + mousemng_enable(MOUSEPROC_BG); } else { - mouse_running(MOUSE_STOP_M); + mousemng_disable(MOUSEPROC_BG); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); if (np2opening) { - - HDC hmdc; + HINSTANCE hinst; + RECT rect; + int width; + int height; HBITMAP hbmp; BITMAP bmp; - HINSTANCE hinst; - int sx = 640; - int sy = 400; - + HDC hmdc; + HBRUSH hbrush; hinst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE); -#if 1 - hbmp = LoadBitmap(hinst, "NP2BMP"); - GetObject(hbmp, sizeof(BITMAP), &bmp); - hmdc = CreateCompatibleDC(hdc); - SelectObject(hmdc, hbmp); - BitBlt(hdc, (sx - 252) / 2, (sy - 28) / 2, + GetClientRect(hWnd, &rect); + width = rect.right - rect.left; + height = rect.bottom - rect.top; + hbmp = LoadBitmap(hinst, _T("NP2BMP")); + GetObject(hbmp, sizeof(BITMAP), &bmp); + hbrush = (HBRUSH)SelectObject(hdc, + GetStockObject(BLACK_BRUSH)); + PatBlt(hdc, 0, 0, width, height, PATCOPY); + SelectObject(hdc, hbrush); + hmdc = CreateCompatibleDC(hdc); + SelectObject(hmdc, hbmp); + BitBlt(hdc, (width - bmp.bmWidth) / 2, + (height - bmp.bmHeight) / 2, bmp.bmWidth, bmp.bmHeight, hmdc, 0, 0, SRCCOPY); - DeleteDC(hmdc); - DeleteObject(hbmp); -#else - hbmp = LoadBitmap(hinst, "NP2EXT"); - GetObject(hbmp, sizeof(BITMAP), &bmp); - hmdc = CreateCompatibleDC(hdc); - SelectObject(hmdc, hbmp); - BitBlt(hdc, (sx - 160) / 2, (sy - 140) / 2, - bmp.bmWidth, bmp.bmHeight, hmdc, 0, 0, SRCCOPY); - DeleteDC(hmdc); - DeleteObject(hbmp); -#endif + DeleteDC(hmdc); + DeleteObject(hbmp); } else { // scrnmng_update(); @@ -602,7 +692,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT case WM_MOVE: if ((!scrnmng_isfullscreen()) && - (!(GetWindowLong(hWndMain, GWL_STYLE) & + (!(GetWindowLong(hWnd, GWL_STYLE) & (WS_MAXIMIZE | WS_MINIMIZE)))) { GetWindowRect(hWnd, &rc); np2oscfg.winx = rc.left; @@ -611,6 +701,12 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT } break; + case WM_SIZE: + if (wParam == SIZE_RESTORED) { + scrnmng_restoresize(); + } + break; + case WM_ENTERMENULOOP: winuienter(); if (scrnmng_isfullscreen()) { @@ -623,13 +719,13 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT break; case WM_ENTERSIZEMOVE: - soundmng_stop(); - mouse_running(MOUSE_STOP); + soundmng_disable(SNDPROC_MAIN); + mousemng_disable(MOUSEPROC_WINUI); break; case WM_EXITSIZEMOVE: - mouse_running(MOUSE_CONT); - soundmng_play(); + mousemng_enable(MOUSEPROC_WINUI); + soundmng_enable(SNDPROC_MAIN); break; case WM_KEYDOWN: @@ -637,56 +733,58 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT return(DefWindowProc(hWnd, WM_SYSKEYDOWN, VK_F10, lParam)); } if ((wParam == VK_F12) && (!np2oscfg.F12COPY)) { - mouse_running(MOUSE_XOR); + mousemng_toggle(MOUSEPROC_SYSTEM); xmenu_setmouse(np2oscfg.MOUSE_SW ^ 1); sysmng_update(SYS_UPDATECFG); } else { - winkeydown106(wParam, lParam); + winkbd_keydown(wParam, lParam); } break; + case WM_KEYUP: if (wParam == VK_F11) { return(DefWindowProc(hWnd, WM_SYSKEYUP, VK_F10, lParam)); } if ((wParam != VK_F12) || (np2oscfg.F12COPY)) { - winkeyup106(wParam, lParam); + winkbd_keyup(wParam, lParam); } break; case WM_SYSKEYDOWN: - winkeydown106(wParam, lParam); + winkbd_keydown(wParam, lParam); break; case WM_SYSKEYUP: - winkeyup106(wParam, lParam); + winkbd_keyup(wParam, lParam); break; case WM_LBUTTONDOWN: - if (!mouse_btn(MOUSE_LEFTDOWN)) { + if (!mousemng_buttonevent(MOUSEMNG_LEFTDOWN)) { return(DefWindowProc(hWnd, msg, wParam, lParam)); } break; + case WM_LBUTTONUP: - if (!mouse_btn(MOUSE_LEFTUP)) { + if (!mousemng_buttonevent(MOUSEMNG_LEFTUP)) { return(DefWindowProc(hWnd, msg, wParam, lParam)); } break; case WM_MBUTTONDOWN: // ver0.26 - mouse_running(MOUSE_XOR); + mousemng_toggle(MOUSEPROC_SYSTEM); xmenu_setmouse(np2oscfg.MOUSE_SW ^ 1); sysmng_update(SYS_UPDATECFG); break; case WM_RBUTTONDOWN: - if (!mouse_btn(MOUSE_RIGHTDOWN)) { + if (!mousemng_buttonevent(MOUSEMNG_RIGHTDOWN)) { return(DefWindowProc(hWnd, msg, wParam, lParam)); } break; case WM_RBUTTONUP: - if (!mouse_btn(MOUSE_RIGHTUP)) { + if (!mousemng_buttonevent(MOUSEMNG_RIGHTUP)) { return(DefWindowProc(hWnd, msg, wParam, lParam)); } break; @@ -724,43 +822,52 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT return(0L); } +static void framereset(void) { + + framecnt = 0; + sysmng_updatecaption(); + memdbg_process(); + skbdwin_process(); +} -static void processwait(UINT waitcnt) { +static void processwait(UINT cnt) { - if (timing_getcount() >= waitcnt) { + if (timing_getcount() >= cnt) { timing_setcount(0); - framecnt = 0; + framereset(); } else { Sleep(1); } + soundmng_sync(); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, LPSTR lpszCmdLine, int nCmdShow) { - WNDCLASS np2; + WNDCLASS wc; MSG msg; - HMENU hMenu; - HWND hwndorg; + HWND hWnd; int i; #ifdef OPENING_WAIT UINT32 tick; #endif - GetModuleFileName(NULL, modulefile, sizeof(modulefile)); + _MEM_INIT(); + + GetModuleFileName(NULL, modulefile, NELEMENTS(modulefile)); dosio_init(); file_setcd(modulefile); - np2arg_analize(lpszCmdLine); // タイミング修正 // ver0.29 + np2arg_analize(); initload(); + memdbg_readini(); + skbdwin_readini(); - srand((unsigned)time(NULL)); - -// np2arg_analize(lpszCmdLine); + rand_setseed((unsigned)time(NULL)); - if ((hwndorg = FindWindow(szClassName, NULL)) != NULL) { - ShowWindow(hwndorg, SW_RESTORE); - SetForegroundWindow(hwndorg); + if ((hWnd = FindWindow(szClassName, NULL)) != NULL) { + ShowWindow(hWnd, SW_RESTORE); + SetForegroundWindow(hWnd); dosio_term(); return(FALSE); } @@ -781,68 +888,70 @@ int WINAPI WinMain(HINSTANCE hInstance, np2oscfg.KEYBOARD = KEY_KEY106; } } - keystat_reset(); + keystat_initialize(); if (!hPreInst) { - np2.style = CS_BYTEALIGNCLIENT | CS_HREDRAW | CS_VREDRAW; - np2.lpfnWndProc = WndProc; - np2.cbClsExtra = 0; - np2.cbWndExtra = 0; - np2.hInstance = hInstance; - np2.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); - np2.hCursor = LoadCursor(NULL, IDC_ARROW); - np2.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); - np2.lpszMenuName = MAKEINTRESOURCE(IDM_MAIN); - np2.lpszClassName = szClassName; - if (!RegisterClass(&np2)) { + wc.style = CS_BYTEALIGNCLIENT | CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = WndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hInstance; + wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); + wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAIN); + wc.lpszClassName = szClassName; + if (!RegisterClass(&wc)) { return(FALSE); } } + memdbg_initialize(hInstance); + skbdwin_initialize(hInstance); - hWndMain = CreateWindowEx(0, szClassName, szAppCaption, + mousemng_initialize(); + + hWnd = CreateWindowEx(0, szClassName, szAppCaption, WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX, np2oscfg.winx, np2oscfg.winy, 640, 400, NULL, NULL, hInstance, NULL); - + hWndMain = hWnd; scrnmng_initialize(); - xmenu_setsound(np2cfg.SOUND_SW); - xmenu_setbeepvol(np2cfg.BEEP_VOL); - xmenu_setkey(0); - xmenu_setbtnrapid(np2cfg.BTN_RAPID); - xmenu_setbtnmode(np2cfg.BTN_MODE); - xmenu_setmsrapid(np2cfg.MOUSERAPID); + xmenu_setroltate(0); + xmenu_setdispmode(np2cfg.DISPSYNC); + xmenu_setraster(np2cfg.RASTER); xmenu_setwaitflg(np2oscfg.NOWAIT); xmenu_setframe(np2oscfg.DRAW_SKIP); - xmenu_setdispmode(np2cfg.DISPSYNC); - xmenu_seti286save(np2oscfg.I286SAVE); - xmenu_setmotorflg(np2cfg.MOTOR); - xmenu_setroltate(0); + + xmenu_setkey(0); xmenu_setxshift(0); xmenu_setf12copy(np2oscfg.F12COPY); + xmenu_setbeepvol(np2cfg.BEEP_VOL); + xmenu_setsound(np2cfg.SOUND_SW); + xmenu_setjastsound(np2oscfg.jastsnd); + xmenu_setmotorflg(np2cfg.MOTOR); xmenu_setextmem(np2cfg.EXTMEM); - xmenu_setraster(np2cfg.RASTER); xmenu_setmouse(np2oscfg.MOUSE_SW); - ShowWindow(hWndMain, nCmdShow); - UpdateWindow(hWndMain); + xmenu_setbtnmode(np2cfg.BTN_MODE); + xmenu_setbtnrapid(np2cfg.BTN_RAPID); + xmenu_setmsrapid(np2cfg.MOUSERAPID); + + ShowWindow(hWnd, nCmdShow); + UpdateWindow(hWnd); #ifdef OPENING_WAIT tick = GetTickCount(); #endif - if (np2oscfg.I286SAVE) { - hMenu = GetSystemMenu(hWndMain, FALSE); - InsertMenu(hMenu, 0, MF_BYPOSITION | MF_STRING, IDM_MEMORYDUMP, - "&Memory Dump"); - InsertMenu(hMenu, 1, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); - } - DrawMenuBar(hWndMain); + sysmenu_initialize(); + xmenu_initialize(); + DrawMenuBar(hWnd); // ver0.30 if (file_attr_c(np2help) == (short)-1) { - EnableMenuItem(GetMenu(hWndMain), IDM_HELP, MF_GRAYED); + EnableMenuItem(GetMenu(hWnd), IDM_HELP, MF_GRAYED); } scrnmode = 0; @@ -855,15 +964,20 @@ int WINAPI WinMain(HINSTANCE hInstance, if (scrnmng_create(scrnmode) != SUCCESS) { scrnmode ^= SCRNMODE_FULLSCREEN; if (scrnmng_create(scrnmode) != SUCCESS) { - MessageBox(hWndMain, "Couldn't create DirectDraw Object", + MessageBox(hWnd, _T("Couldn't create DirectDraw Object"), szAppCaption, MB_OK | MB_ICONSTOP); return(FALSE); } } soundmng_initialize(); + if (np2oscfg.MOUSE_SW) { // ver0.30 + mousemng_enable(MOUSEPROC_SYSTEM); + } + commng_initialize(); sysmng_initialize(); + joy_init(); pccore_init(); S98_init(); @@ -872,22 +986,45 @@ int WINAPI WinMain(HINSTANCE hInstance, while((GetTickCount() - tick) < OPENING_WAIT); #endif - if (np2oscfg.MOUSE_SW) { // ver0.30 - mouse_running(MOUSE_ON); - } scrndraw_redraw(); + pccore_reset(); np2opening = 0; + // れじうむ +#if defined(SUPPORT_RESUME) + if (np2oscfg.resume) { + int id; + + id = flagload(str_sav, str_resume, FALSE); + if (id == IDYES) { + for (i=0; i<4; i++) np2arg.disk[i] = NULL; + } + else if (id == IDCANCEL) { + DestroyWindow(hWnd); + mousemng_disable(MOUSEPROC_WINUI); + S98_trash(); + pccore_term(); + soundmng_deinitialize(); + scrnmng_destroy(); + TRACETERM(); + dosio_term(); + return(0); + } + } +#endif + // リセットしてから… コマンドラインのディスク挿入。 // ver0.29 for (i=0; i<4; i++) { if (np2arg.disk[i]) { - milstr_ncpy(diskdrv_fname[i], np2arg.disk[i], MAX_PATH); - diskdrv_delay[i] = 1; + diskdrv_readyfdd((REG8)i, np2arg.disk[i], 0); } } + memdbg_create(); + skbdwin_create(); + while(1) { if (PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE)) { if (!GetMessage(&msg, NULL, 0, 0)) { @@ -902,7 +1039,7 @@ int WINAPI WinMain(HINSTANCE hInstance, else { if (np2oscfg.NOWAIT) { joy_flash(); - mouse_callback(); + mousemng_sync(); pccore_exec(framecnt == 0); if (np2oscfg.DRAW_SKIP) { // nowait frame skip framecnt++; @@ -920,7 +1057,7 @@ int WINAPI WinMain(HINSTANCE hInstance, else if (np2oscfg.DRAW_SKIP) { // frame skip if (framecnt < np2oscfg.DRAW_SKIP) { joy_flash(); - mouse_callback(); + mousemng_sync(); pccore_exec(framecnt == 0); framecnt++; } @@ -930,21 +1067,29 @@ int WINAPI WinMain(HINSTANCE hInstance, } else { // auto skip if (!waitcnt) { + UINT cnt; joy_flash(); - mouse_callback(); + mousemng_sync(); pccore_exec(framecnt == 0); framecnt++; - if (timing_getcount() < framecnt) { + cnt = timing_getcount(); + if (framecnt > cnt) { waitcnt = framecnt; if (framemax > 1) { framemax--; } } else if (framecnt >= framemax) { - waitcnt = framecnt; if (framemax < 12) { framemax++; } + if (cnt >= 12) { + timing_reset(); + } + else { + timing_setcount(cnt - framecnt); + } + framereset(); } } else { @@ -956,17 +1101,36 @@ int WINAPI WinMain(HINSTANCE hInstance, } pccore_cfgupdate(); - pccore_term(); + + mousemng_disable(MOUSEPROC_WINUI); S98_trash(); - mouse_running(MOUSE_OFF); +#if defined(SUPPORT_RESUME) + if (np2oscfg.resume) { + flagsave(str_sav); + } + else { + flagdelete(str_sav); + } +#endif + + pccore_term(); + memdbg_destroy(); + skbdwin_destroy(); + soundmng_deinitialize(); scrnmng_destroy(); if (sys_updates & (SYS_UPDATECFG | SYS_UPDATEOSCFG)) { initsave(); + memdbg_writeini(); + skbdwin_writeini(); } + + skbdwin_deinitialize(); + TRACETERM(); + _MEM_USED("report.txt"); dosio_term(); return(msg.wParam);