Merge NP21/W rev.59

This commit is contained in:
AZO234 2019-03-24 09:37:01 +09:00
parent b3369a3290
commit fbb9a30934
19 changed files with 699 additions and 547 deletions

View File

@ -1270,7 +1270,9 @@ void atapi_deinitialize(void) {
if(atapi_thread_initialized){
atapi_thread_initialized = 0;
while(((int)ResumeThread(atapi_thread)) > 0);
WaitForSingleObject(atapi_thread, INFINITE);
if(WaitForSingleObject(atapi_thread, 5000) == WAIT_TIMEOUT){
TerminateThread(atapi_thread, 0);
}
CloseHandle(atapi_thread);
atapi_thread = NULL;
}

View File

@ -1803,8 +1803,12 @@ void ideio_deinitialize(void) {
ideio_thread_initialized = 0;
while(((int)ResumeThread(ideio_threadR))>0);
while(((int)ResumeThread(ideio_threadW))>0);
WaitForSingleObject(ideio_threadR, INFINITE);
WaitForSingleObject(ideio_threadW, INFINITE);
if(WaitForSingleObject(ideio_threadR, 5000) == WAIT_TIMEOUT){
TerminateThread(ideio_threadR, 0);
}
if(WaitForSingleObject(ideio_threadW, 1000) == WAIT_TIMEOUT){
TerminateThread(ideio_threadW, 0);
}
CloseHandle(ideio_threadR);
CloseHandle(ideio_threadW);
ideio_threadR = NULL;

View File

@ -306,6 +306,7 @@ BRESULT sxsi_devopen(REG8 drv, const OEMCHAR *fname) {
}
if ((fname == NULL) || (fname[0] == '\0')) {
int num = drv & 0x0f;
sxsi->close(sxsi);
ideio_notify(sxsi->drv, 0);
file_cpyname(sxsi->fname, _T("\0\0\0\0"), 1);
sxsi->flag = 0;
@ -316,6 +317,7 @@ BRESULT sxsi_devopen(REG8 drv, const OEMCHAR *fname) {
else {
if((sxsi->flag & SXSIFLAG_READY) && (_tcsnicmp(sxsi->fname, OEMTEXT("\\\\.\\"), 4)!=0 || _tcsicmp(sxsi->fname, np2cfg.idecd[drv & 0x0f])==0) ){
// いったん取り出す
sxsi->close(sxsi);
ideio_notify(sxsi->drv, 0);
sxsi->flag = 0;
cdchange_drv = drv;

View File

@ -123,8 +123,9 @@ static int doWriteTap(HANDLE hTap, const UINT8 *pSendBuf, UINT32 len)
if (!WriteFile(hTap, pSendBuf, len, &dwWriteLen, &np2net_write_ovl)) {
DWORD err = GetLastError();
if (err == ERROR_IO_PENDING) {
WaitForSingleObject(np2net_write_hEvent, INFINITE); // 完了待ち
GetOverlappedResult(hTap, &np2net_write_ovl, &dwWriteLen, FALSE);
if(WaitForSingleObject(np2net_write_hEvent, 3000)!=WAIT_TIMEOUT){ // 完了待ち
GetOverlappedResult(hTap, &np2net_write_ovl, &dwWriteLen, FALSE);
}
} else {
TRACEOUT(("LGY-98: WriteFile err=0x%08X\n", err));
return -1;
@ -250,13 +251,14 @@ static unsigned int __stdcall np2net_ThreadFuncR(LPVOID vdParam) {
DWORD err = GetLastError();
if (err == ERROR_IO_PENDING) {
// 読み取り待ち
WaitForSingleObject(hEvent, INFINITE); // 受信完了待ち
GetOverlappedResult(np2net_hTap, &ovl, &dwLen, FALSE);
if(dwLen>0){
//TRACEOUT(("LGY-98: recieve %u bytes\n", dwLen));
np2net.recieve_packet((UINT8*)np2net_Buf, dwLen); // 受信できたので通知する
np2net_highspeeddatacount += dwLen;
}
if(WaitForSingleObject(hEvent, 3000)!=WAIT_TIMEOUT){ // 受信完了待ち
GetOverlappedResult(np2net_hTap, &ovl, &dwLen, FALSE);
if(dwLen>0){
//TRACEOUT(("LGY-98: recieve %u bytes¥n", dwLen));
np2net.recieve_packet((UINT8*)np2net_Buf, dwLen); // 受信できたので通知する
np2net_highspeeddatacount += dwLen;
}
}
} else {
// 読み取りエラー
printf("TAP-Win32: ReadFile err=0x%08X\n", err);
@ -342,11 +344,18 @@ static void np2net_closeTAP(){
if (np2net_hTap != NULL) {
if(np2net_hThreadR){
np2net_hThreadexit = 1;
WaitForSingleObject(np2net_hThreadR, INFINITE);
WaitForSingleObject(np2net_hThreadW, INFINITE);
if(WaitForSingleObject(np2net_hThreadR, 5000) == WAIT_TIMEOUT){
TerminateThread(np2net_hThreadR, 0);
}
if(WaitForSingleObject(np2net_hThreadW, 1000) == WAIT_TIMEOUT){
TerminateThread(np2net_hThreadW, 0);
}
np2net_membuf_readpos = np2net_membuf_writepos;
np2net_hThreadexit = 0;
CloseHandle(np2net_hThreadR);
CloseHandle(np2net_hThreadW);
np2net_hThreadR = NULL;
np2net_hThreadW = NULL;
}
CloseHandle(np2net_hTap);
TRACEOUT(("LGY-98: TAP is closed"));

View File

@ -348,13 +348,22 @@ void pccore_exec(BOOL draw);
void pccore_postevent(UINT32 event);
#if !defined(__LIBRETRO__) && !defined(NP2_SDL2) && !defined(NP2_X11)
#ifdef SUPPORT_ASYNC_CPU
#if defined(__LIBRETRO__) || defined(NP2_SDL2) || defined(NP2_X11)
#if !defined(__MINGW32__) && !defined(_MSC_VER)
typedef union {
struct {
UINT32 LowPart;
SINT32 HighPart;
} u;
SINT64 QuadPart;
} LARGE_INTEGER;
#endif
#endif
extern LARGE_INTEGER asynccpu_lastclock;
extern LARGE_INTEGER asynccpu_clockpersec;
extern LARGE_INTEGER asynccpu_clockcount;
#endif
#endif
#ifdef __cplusplus
}

View File

@ -500,7 +500,7 @@ void np2wab_drawframe()
scrnmng_bltwab();
}
ga_screenupdated = 0;
ResumeThread(ga_hThread);
if(ga_hThread) ResumeThread(ga_hThread);
}
}
}
@ -612,10 +612,11 @@ void np2wab_reset(const NP2CFG *pConfig)
// マルチスレッドモードなら先にスレッド処理を終了させる
if(ga_threadmode && ga_hThread){
ga_exitThread = 1;
ResumeThread(ga_hThread);
while(((int)ResumeThread(ga_hThread))>0);
while(WaitForSingleObject(ga_hThread, 200)==WAIT_TIMEOUT){
ResumeThread(ga_hThread);
}
CloseHandle(ga_hThread);
ga_hThread = NULL;
ga_exitThread = 0;
}
@ -654,10 +655,11 @@ void np2wab_bind(void)
// マルチスレッドモードなら先にスレッド処理を終了させる
if(ga_threadmode && ga_hThread){
ga_exitThread = 1;
ResumeThread(ga_hThread);
while(((int)ResumeThread(ga_hThread))>0);
while(WaitForSingleObject(ga_hThread, 200)==WAIT_TIMEOUT){
ResumeThread(ga_hThread);
}
CloseHandle(ga_hThread);
ga_hThread = NULL;
ga_exitThread = 0;
}
@ -703,10 +705,14 @@ void np2wab_shutdown()
#else
// マルチスレッドモードなら先にスレッド処理を終了させる
ga_exitThread = 1;
ResumeThread(ga_hThread);
while(WaitForSingleObject(ga_hThread, 500)==WAIT_TIMEOUT){
while(((int)ResumeThread(ga_hThread))>0);
if(WaitForSingleObject(ga_hThread, 1000)==WAIT_TIMEOUT){
ResumeThread(ga_hThread);
}
if(WaitForSingleObject(ga_hThread, 4000)==WAIT_TIMEOUT){
TerminateThread(ga_hThread, 0); // 諦めて強制終了
}
CloseHandle(ga_hThread);
ga_hThread = NULL;
// いろいろ解放

View File

@ -1049,6 +1049,7 @@ void dialog_newdisk_ex(HWND hWnd, int mode)
{
_mt_cancel = 1;
WaitForSingleObject(newdisk_ThreadFunc, INFINITE);
CloseHandle(newdisk_ThreadFunc);
}
_mt_cancel = 1;
}

View File

@ -252,7 +252,8 @@ static void stop_hook_systemkey()
if(np2_hThreadKeyHook && np2_hThreadKeyHookhWnd){
np2_hThreadKeyHookexit = 1;
SendMessage(np2_hThreadKeyHookhWnd , WM_CLOSE , 0 , 0);
WaitForSingleObject(np2_hThreadKeyHook, INFINITE);
WaitForSingleObject(np2_hThreadKeyHook, INFINITE);
CloseHandle(np2_hThreadKeyHook);
np2_hThreadKeyHook = NULL;
np2_hThreadKeyHookexit = 0;
}
@ -2150,6 +2151,11 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
np2wab_setRelayState(np2wab.relay ? 0 : 1);
}
}
#endif
#ifdef HOOK_SYSKEY
else if ((wParam == VK_SNAPSHOT) && (np2oscfg.syskhook)) {
// nothing to do
}
#endif
else {
winkbd_keydown(wParam, lParam);
@ -3040,6 +3046,23 @@ void loadNP2INI(const OEMCHAR *fname){
return;
}
}
/*
// XXX: Direct3D絡みのエラー対策
{
MSG msg;
while(PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE))
{
if (!GetMessage(&msg, NULL, 0, 0)) {
break;
}
if ((msg.hwnd != hWnd) ||
((msg.message != WM_SYSKEYDOWN) &&
(msg.message != WM_SYSKEYUP))) {
TranslateMessage(&msg);
}
DispatchMessage(&msg);
}
}*/
CSoundMng::Initialize();
OpenSoundDevice(hWnd);
@ -3617,9 +3640,10 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,
#endif
pccore_term();
CSoundMng::GetInstance()->Close();
CSoundMng::Deinitialize();
scrnmng_shutdown();
scrnmng_destroy();
recvideo_close();

24
win9x/resources/1252/np2.rc Executable file → Normal file
View File

@ -1,6 +1,6 @@
//Microsoft Developer Studio generated resource script.
//
#include "..\\..\\resource.h"
#include "..\..\resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
@ -495,7 +495,7 @@ END
IDD_SNDFMGEN DIALOG 0, 0, 184, 124
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "fmgen"
FONT 9, " Pゴシック"
FONT 9, " Pゴシック"
BEGIN
CONTROL "Use fmgen",IDC_USEFMGEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,8,58,10
END
@ -542,7 +542,7 @@ CAPTION "General"
FONT 9, "MS Sans Serif", 0, 0, 0x0
BEGIN
LTEXT "TAP device name",IDC_STATIC,8,8,76,8
COMBOBOX IDC_NETTAP,8,18,168,12,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_NETTAP,8,18,168,12,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP | CBS_AUTOHSCROLL
CONTROL "Enable Power Management",IDC_NETPMM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,36,140,10
END
@ -620,7 +620,7 @@ FONT 9, "MS Sans Serif", 0, 0, 0x0
BEGIN
CONTROL "Enable",IDC_HOSTDRVENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,8,140,10
LTEXT "Shared Directory",IDC_STATIC,8,23,76,8
COMBOBOX IDC_HOSTDRVDIR,8,33,130,12, CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_HOSTDRVDIR,8,33,130,12, CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP | CBS_AUTOHSCROLL
PUSHBUTTON "Browse...",IDC_HOSTDRVBROWSE,140,32,44,14
LTEXT "Permission",IDC_STATIC,8,51,76,8
CONTROL "Read",IDC_HOSTDRVREAD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED,16,65,140,10
@ -861,19 +861,19 @@ END
1 TEXTINCLUDE
BEGIN
"..¥¥..¥¥resource.h¥0"
"..\\..\\resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""¥r¥n"
"¥0"
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"#include ""np2.rc2""¥r¥n"
"¥0"
"#include ""np2.rc2""\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
@ -1396,9 +1396,9 @@ BEGIN
IDS_APP_NAME2 "Neko Project II/W"
IDS_APP_NAME21 "Neko Project 21/W"
IDS_FILENAME_HELP "np2.chm"
IDS_FONTFACE " ゴシック"
IDS_FONTFACE " ゴシック"
IDS_PFONTFACE "MS Sans Serif"
IDS_FONTFACE_PRIMARY " ゴシック"
IDS_FONTFACE_PRIMARY " ゴシック"
IDS_PFONTFACE_PRIMARY "MS Sans Serif"
IDS_FONTFACE_SECONDARY "MS Gothic"
END
@ -1438,7 +1438,7 @@ END
STRINGTABLE
BEGIN
IDS_CONFIRM_RESUME "Conflict!¥n¥n%s¥nContinue?"
IDS_CONFIRM_RESUME "Conflict!\n\n%s\nContinue?"
IDS_ERROR_RESUME "Couldn't restart"
END

44
win9x/resources/1252/np2.rc2 Executable file → Normal file
View File

@ -6,15 +6,15 @@
#ifdef NEEDS_MANIFEST
#ifdef _WIN64
#ifdef SUPPORT_PC9821
IDR_MANIFEST IRT_MANIFEST MOVEABLE PURE "..¥¥np21x64.mnf"
IDR_MANIFEST IRT_MANIFEST MOVEABLE PURE "..\\np21x64.mnf"
#else
IDR_MANIFEST IRT_MANIFEST MOVEABLE PURE "..¥¥np2x64.mnf"
IDR_MANIFEST IRT_MANIFEST MOVEABLE PURE "..\\np2x64.mnf"
#endif
#else
#ifdef SUPPORT_PC9821
IDR_MANIFEST IRT_MANIFEST MOVEABLE PURE "..¥¥np21.mnf"
IDR_MANIFEST IRT_MANIFEST MOVEABLE PURE "..\\np21.mnf"
#else
IDR_MANIFEST IRT_MANIFEST MOVEABLE PURE "..¥¥np2.mnf"
IDR_MANIFEST IRT_MANIFEST MOVEABLE PURE "..\\np2.mnf"
#endif
#endif
#endif
@ -25,8 +25,8 @@ IDR_MANIFEST IRT_MANIFEST MOVEABLE PURE "..¥¥np2.mnf"
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 0,8,6,56
PRODUCTVERSION 0,8,6,56
FILEVERSION 0,8,6,59
PRODUCTVERSION 0,8,6,59
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@ -41,30 +41,30 @@ BEGIN
BEGIN
BLOCK "040904e4"
BEGIN
VALUE "CompanyName", "¥0"
VALUE "FileVersion", "0, 8, 6, 50"
VALUE "LegalCopyright", "Nekosan development team¥0"
VALUE "CompanyName", "\0"
VALUE "FileVersion", "0, 8, 6, 59\0"
VALUE "LegalCopyright", "Nekosan development team\0"
VALUE "ProductVersion", "0, 8, 6, 50"
VALUE "ProductVersion", "0, 8, 6, 59\0"
#ifdef _USRDLL
VALUE "FileDescription", "PC-98x1series emulator resource file¥0"
VALUE "ProductName", "Neko Project II resource file¥0"
VALUE "InternalName", "np2_1252¥0"
VALUE "OriginalFilename", "np2_1252.dll¥0"
VALUE "FileDescription", "PC-98x1series emulator resource file\0"
VALUE "ProductName", "Neko Project II resource file\0"
VALUE "InternalName", "np2_1252\0"
VALUE "OriginalFilename", "np2_1252.dll\0"
#else
#ifdef SUPPORT_PC9821
VALUE "FileDescription", "PC-9821series emulator¥0"
VALUE "ProductName", "Neko Project 21/W¥0"
VALUE "FileDescription", "PC-9821series emulator\0"
VALUE "ProductName", "Neko Project 21/W\0"
#else
VALUE "FileDescription", "PC-9801series emulator¥0"
VALUE "ProductName", "Neko Project II/W¥0"
VALUE "FileDescription", "PC-9801series emulator\0"
VALUE "ProductName", "Neko Project II/W\0"
#endif
#ifdef SUPPORT_PC9821
VALUE "InternalName", "np21¥0"
VALUE "OriginalFilename", "np21.exe¥0"
VALUE "InternalName", "np21\0"
VALUE "OriginalFilename", "np21.exe\0"
#else
VALUE "InternalName", "np2¥0"
VALUE "OriginalFilename", "np2.exe¥0"
VALUE "InternalName", "np2\0"
VALUE "OriginalFilename", "np2.exe\0"
#endif
#endif
END

6
win9x/resources/932/np2.rc Executable file → Normal file
View File

@ -1,6 +1,6 @@
// Microsoft Visual C++ generated resource script.
//
#include "..\\..\\resource.h"
#include "..\..\resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
@ -535,7 +535,7 @@ CAPTION "General"
FONT 9, "lr oƒSƒVƒbƒN", 0, 0, 0x0
BEGIN
LTEXT "TAP device name",IDC_STATIC,8,8,76,8
COMBOBOX IDC_NETTAP,8,18,168,12,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_NETTAP,8,18,168,12,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP | CBS_AUTOHSCROLL
CONTROL "Enable Power Management",IDC_NETPMM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,36,140,10
END
@ -613,7 +613,7 @@ FONT 9, "
BEGIN
CONTROL "Enable",IDC_HOSTDRVENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,8,140,10
LTEXT "Shared Directory",IDC_STATIC,8,23,76,8
COMBOBOX IDC_HOSTDRVDIR,8,33,130,12, CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
COMBOBOX IDC_HOSTDRVDIR,8,33,130,12, CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP | CBS_AUTOHSCROLL
PUSHBUTTON "Browse...",IDC_HOSTDRVBROWSE,140,32,44,14
LTEXT "Permission",IDC_STATIC,8,51,76,8
CONTROL "Read",IDC_HOSTDRVREAD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,65,140,10

44
win9x/resources/932/np2.rc2 Executable file → Normal file
View File

@ -6,15 +6,15 @@
#ifdef NEEDS_MANIFEST
#ifdef _WIN64
#ifdef SUPPORT_PC9821
IDR_MANIFEST IRT_MANIFEST MOVEABLE PURE "..¥¥np21x64.mnf"
IDR_MANIFEST IRT_MANIFEST MOVEABLE PURE "..\\np21x64.mnf"
#else
IDR_MANIFEST IRT_MANIFEST MOVEABLE PURE "..¥¥np2x64.mnf"
IDR_MANIFEST IRT_MANIFEST MOVEABLE PURE "..\\np2x64.mnf"
#endif
#else
#ifdef SUPPORT_PC9821
IDR_MANIFEST IRT_MANIFEST MOVEABLE PURE "..¥¥np21.mnf"
IDR_MANIFEST IRT_MANIFEST MOVEABLE PURE "..\\np21.mnf"
#else
IDR_MANIFEST IRT_MANIFEST MOVEABLE PURE "..¥¥np2.mnf"
IDR_MANIFEST IRT_MANIFEST MOVEABLE PURE "..\\np2.mnf"
#endif
#endif
#endif
@ -25,8 +25,8 @@ IDR_MANIFEST IRT_MANIFEST MOVEABLE PURE "..¥¥np2.mnf"
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 0,8,6,58
PRODUCTVERSION 0,8,6,58
FILEVERSION 0,8,6,59
PRODUCTVERSION 0,8,6,59
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@ -41,30 +41,30 @@ BEGIN
BEGIN
BLOCK "041103a4"
BEGIN
VALUE "CompanyName", "¥0"
VALUE "FileVersion", "0, 8, 6, 50"
VALUE "LegalCopyright", "ねこさん開発ちーむ¥0"
VALUE "CompanyName", "\0"
VALUE "FileVersion", "0, 8, 6, 59\0"
VALUE "LegalCopyright", "˱³ñŠJ”­¿<EFBFBD>[‚Þ\0"
VALUE "ProductVersion", "0, 8, 6, 50"
VALUE "ProductVersion", "0, 8, 6, 59\0"
#ifdef _USRDLL
VALUE "FileDescription", "PC-98x1series emulator resource file¥0"
VALUE "ProductName", "Neko Project II resource file¥0"
VALUE "InternalName", "np2_932¥0"
VALUE "OriginalFilename", "np2_932.dll¥0"
VALUE "FileDescription", "PC-98x1series emulator resource file\0"
VALUE "ProductName", "Neko Project II resource file\0"
VALUE "InternalName", "np2_932\0"
VALUE "OriginalFilename", "np2_932.dll\0"
#else
#ifdef SUPPORT_PC9821
VALUE "FileDescription", "PC-9821series emulator¥0"
VALUE "ProductName", "Neko Project 21/W¥0"
VALUE "FileDescription", "PC-9821series emulator\0"
VALUE "ProductName", "Neko Project 21/W\0"
#else
VALUE "FileDescription", "PC-9801series emulator¥0"
VALUE "ProductName", "Neko Project II/W¥0"
VALUE "FileDescription", "PC-9801series emulator\0"
VALUE "ProductName", "Neko Project II/W\0"
#endif
#ifdef SUPPORT_PC9821
VALUE "InternalName", "np21w¥0"
VALUE "OriginalFilename", "np21w.exe¥0"
VALUE "InternalName", "np21w\0"
VALUE "OriginalFilename", "np21w.exe\0"
#else
VALUE "InternalName", "np2w¥0"
VALUE "OriginalFilename", "np2w.exe¥0"
VALUE "InternalName", "np2w\0"
VALUE "OriginalFilename", "np2w.exe\0"
#endif
#endif
END

903
win9x/resources/932/np2jp.rc Executable file → Normal file

File diff suppressed because it is too large Load Diff

View File

@ -152,6 +152,14 @@ void scrnmng_destroy(void) {
scrnmng_current_drawtype = DRAWTYPE_INVALID;
}
void scrnmng_shutdown(void) {
#ifdef SUPPORT_SCRN_DIRECT3D
scrnmngD3D_shutdown();
#endif
scrnmngDD_shutdown();
}
void scrnmng_querypalette(void) {
#ifdef SUPPORT_SCRN_DIRECT3D
@ -440,4 +448,4 @@ void scrnmng_bltwab() {
{
scrnmngDD_bltwab();
}
}
}

View File

@ -88,6 +88,7 @@ void scrnmng_setwindowsize(HWND hWnd, int width, int height);
void scrnmng_initialize(void);
BRESULT scrnmng_create(UINT8 scrnmode);
void scrnmng_destroy(void);
void scrnmng_shutdown(void);
void scrnmng_setwidth(int posx, int width);
void scrnmng_setextend(int extend);

View File

@ -93,12 +93,15 @@ static int d3d_cs_initialized = 0;
static CRITICAL_SECTION d3d_cs;
static BOOL d3d_tryenter_criticalsection(void){
if(!d3d_cs_initialized) return TRUE;
return TryEnterCriticalSection(&d3d_cs);
}
static void d3d_enter_criticalsection(void){
if(!d3d_cs_initialized) return;
EnterCriticalSection(&d3d_cs);
}
static void d3d_leave_criticalsection(void){
if(!d3d_cs_initialized) return;
LeaveCriticalSection(&d3d_cs);
}
@ -1016,11 +1019,14 @@ void scrnmngD3D_destroy(void) {
}
ZeroMemory(&d3d, sizeof(d3d));
d3d_leave_criticalsection();
}
void scrnmngD3D_shutdown(void) {
//if(d3d_cs_initialized){
// DeleteCriticalSection(&d3d_cs);
// d3d_cs_initialized = 0;
//}
if(d3d_cs_initialized){
DeleteCriticalSection(&d3d_cs);
d3d_cs_initialized = 0;
}
}
void scrnmngD3D_querypalette(void) {

View File

@ -7,6 +7,7 @@ BRESULT scrnmngD3D_check(void);
BRESULT scrnmngD3D_create(UINT8 scrnmode);
void scrnmngD3D_destroy(void);
void scrnmngD3D_shutdown(void);
void scrnmngD3D_setwidth(int posx, int width);
void scrnmngD3D_setextend(int extend);

View File

@ -84,6 +84,22 @@ static int mt_wabdrawing = 0;
static int mt_wabpausedrawing = 0;
#endif
static int dd_cs_initialized = 0;
static CRITICAL_SECTION dd_cs;
static BOOL dd_tryenter_criticalsection(void){
if(!dd_cs_initialized) return TRUE;
return TryEnterCriticalSection(&dd_cs);
}
static void dd_enter_criticalsection(void){
if(!dd_cs_initialized) return;
EnterCriticalSection(&dd_cs);
}
static void dd_leave_criticalsection(void){
if(!dd_cs_initialized) return;
LeaveCriticalSection(&dd_cs);
}
// プライマリサーフェイスのDirectDraw DDBLT_COLORFILLで例外が出る環境があるようなので代替
//#define DDBLT_COLORFILL_FIX
@ -284,9 +300,12 @@ static void clearoutofrect(const RECT *target, const RECT *base) {
LPDIRECTDRAWSURFACE primsurf;
DDBLTFX ddbf;
RECT rect;
dd_enter_criticalsection();
primsurf = ddraw.primsurf;
if (primsurf == NULL) {
dd_leave_criticalsection();
return;
}
ZeroMemory(&ddbf, sizeof(ddbf));
@ -324,6 +343,8 @@ static void clearoutofrect(const RECT *target, const RECT *base) {
DDBlt_ColorFill(primsurf, &rect, &ddbf, ddraw.backsurf);
}
}
dd_leave_criticalsection();
}
static void clearoutscreen(void) {
@ -373,6 +394,7 @@ const RECT *scrn;
static void paletteinit()
{
HDC hdc = GetDC(g_hWndMain);
dd_enter_criticalsection();
GetSystemPaletteEntries(hdc, 0, 256, ddraw.pal);
ReleaseDC(g_hWndMain, hdc);
#if defined(SUPPORT_DCLOCK)
@ -391,10 +413,12 @@ static void paletteinit()
}
ddraw.ddraw2->CreatePalette(DDPCAPS_8BIT, ddraw.pal, &ddraw.palette, 0);
ddraw.primsurf->SetPalette(ddraw.palette);
dd_leave_criticalsection();
}
static void paletteset()
{
dd_enter_criticalsection();
if (ddraw.palette != NULL)
{
for (UINT i = 0; i < PALLETES_8BPP; i++)
@ -405,12 +429,14 @@ static void paletteset()
}
ddraw.palette->SetEntries(0, START_PAL, PALLETES_8BPP, &ddraw.pal[START_PAL]);
}
dd_leave_criticalsection();
}
static void make16mask(DWORD bmask, DWORD rmask, DWORD gmask) {
UINT8 sft;
dd_enter_criticalsection();
sft = 0;
while((!(bmask & 0x80)) && (sft < 32)) {
bmask <<= 1;
@ -434,15 +460,18 @@ static void make16mask(DWORD bmask, DWORD rmask, DWORD gmask) {
}
ddraw.pal16mask.p.g = (UINT8)gmask;
ddraw.l16g = sft;
dd_leave_criticalsection();
}
static void restoresurfaces() {
dd_enter_criticalsection();
ddraw.backsurf->Restore();
ddraw.primsurf->Restore();
#if defined(SUPPORT_WAB)
ddraw.wabsurf->Restore();
#endif
scrndraw_updateallline();
dd_leave_criticalsection();
}
@ -484,7 +513,14 @@ BRESULT scrnmngDD_create(UINT8 scrnmode) {
static UINT8 lastscrnmode = 0;
static WINDOWPLACEMENT wp = {sizeof(WINDOWPLACEMENT)};
if(!dd_cs_initialized){
memset(&dd_cs, 0, sizeof(dd_cs));
InitializeCriticalSection(&dd_cs);
dd_cs_initialized = 1;
}
dd_enter_criticalsection();
ZeroMemory(&scrnmng, sizeof(scrnmng));
winstyle = GetWindowLong(g_hWndMain, GWL_STYLE);
winstyleex = GetWindowLong(g_hWndMain, GWL_EXSTYLE);
@ -812,15 +848,18 @@ BRESULT scrnmngDD_create(UINT8 scrnmode) {
#if defined(SUPPORT_WAB)
mt_wabpausedrawing = 0; // MultiThread対策
#endif
dd_leave_criticalsection();
return(SUCCESS);
scre_err:
dd_leave_criticalsection();
scrnmngDD_destroy();
return(FAILURE);
}
void scrnmngDD_destroy(void) {
dd_enter_criticalsection();
if (scrnmng.flag & SCRNFLAG_FULLSCREEN) {
np2class_enablemenu(g_hWndMain, (!np2oscfg.wintype));
}
@ -867,13 +906,24 @@ void scrnmngDD_destroy(void) {
ddraw.ddraw1 = NULL;
}
ZeroMemory(&ddraw, sizeof(ddraw));
dd_leave_criticalsection();
}
void scrnmngDD_shutdown(void) {
if(dd_cs_initialized){
DeleteCriticalSection(&dd_cs);
dd_cs_initialized = 0;
}
}
void scrnmngDD_querypalette(void) {
dd_enter_criticalsection();
if (ddraw.palette) {
ddraw.primsurf->SetPalette(ddraw.palette);
}
dd_leave_criticalsection();
}
RGB16 scrnmngDD_makepal16(RGB32 pal32) {
@ -888,7 +938,8 @@ RGB16 scrnmngDD_makepal16(RGB32 pal32) {
void scrnmngDD_fullscrnmenu(int y) {
UINT8 menudisp;
dd_enter_criticalsection();
if (scrnmng.flag & SCRNFLAG_FULLSCREEN) {
menudisp = ((y >= 0) && (y < ddraw.menusize))?1:0;
if (ddraw.menudisp != menudisp) {
@ -902,11 +953,13 @@ void scrnmngDD_fullscrnmenu(int y) {
}
}
}
dd_leave_criticalsection();
}
void scrnmngDD_topwinui(void) {
mousemng_disable(MOUSEPROC_WINUI);
dd_enter_criticalsection();
if (!ddraw.cliping++) { // ver0.28
if (scrnmng.flag & SCRNFLAG_FULLSCREEN) {
ddraw.primsurf->SetClipper(ddraw.clipper);
@ -915,10 +968,12 @@ void scrnmngDD_topwinui(void) {
WINNLSEnableIME(g_hWndMain, TRUE);
#endif
}
dd_leave_criticalsection();
}
void scrnmngDD_clearwinui(void) {
dd_enter_criticalsection();
if ((ddraw.cliping > 0) && (!(--ddraw.cliping))) {
#ifndef __GNUC__
WINNLSEnableIME(g_hWndMain, FALSE);
@ -945,12 +1000,14 @@ void scrnmngDD_clearwinui(void) {
if (scrnmng_create(g_scrnmode) != SUCCESS) {
g_scrnmode &= ~SCRNMODE_FULLSCREEN;
if (scrnmng_create(g_scrnmode) != SUCCESS) {
dd_leave_criticalsection();
PostQuitMessage(0);
return;
}
}
scrnmng.forcereset = 0;
}
dd_leave_criticalsection();
}
void scrnmngDD_setwidth(int posx, int width) {
@ -989,14 +1046,17 @@ const SCRNSURF *scrnmngDD_surflock(void) {
if (ddraw.backsurf == NULL) {
return(NULL);
}
dd_enter_criticalsection();
r = ddraw.backsurf->Lock(NULL, &destscrn, DDLOCK_WAIT, NULL);
if (r == DDERR_SURFACELOST) {
restoresurfaces();
dd_leave_criticalsection();
return(NULL);
//r = ddraw.backsurf->Lock(NULL, &destscrn, DDLOCK_WAIT, NULL);
}
if (r != DD_OK) {
// TRACEOUT(("backsurf lock error: %d (%d)", r));
dd_leave_criticalsection();
return(NULL);
}
if (!(ddraw.scrnmode & SCRNMODE_ROTATE)) {
@ -1024,6 +1084,7 @@ void scrnmngDD_surfunlock(const SCRNSURF *surf) {
ddraw.backsurf->Unlock(NULL);
scrnmngDD_update();
recvideo_update();
dd_leave_criticalsection();
}
void scrnmngDD_update(void) {
@ -1033,7 +1094,8 @@ void scrnmngDD_update(void) {
RECT *rect;
RECT *scrn;
HRESULT r;
dd_enter_criticalsection();
if (scrnmng.palchanged) {
scrnmng.palchanged = FALSE;
paletteset();
@ -1056,6 +1118,7 @@ void scrnmngDD_update(void) {
DDBLT_WAIT, NULL);
if (r == DDERR_SURFACELOST) {
restoresurfaces();
dd_leave_criticalsection();
return;
//ddraw.primsurf->Blt(scrn, ddraw.backsurf, rect,
// DDBLT_WAIT, NULL);
@ -1077,12 +1140,14 @@ void scrnmngDD_update(void) {
DDBLT_WAIT, NULL);
if (r == DDERR_SURFACELOST) {
restoresurfaces();
dd_leave_criticalsection();
return;
//ddraw.primsurf->Blt(&dst, ddraw.backsurf, &ddraw.rect,
// DDBLT_WAIT, NULL);
}
}
}
dd_leave_criticalsection();
}
@ -1144,7 +1209,8 @@ void scrnmngDD_dispclock(void)
return;
}
DispClock::GetInstance()->Make();
dd_enter_criticalsection();
DDSURFACEDESC dest;
ZeroMemory(&dest, sizeof(dest));
dest.dwSize = sizeof(dest);
@ -1162,6 +1228,7 @@ void scrnmngDD_dispclock(void)
ddraw.clocksurf->Restore();
}
DispClock::GetInstance()->CountDown(np2oscfg.DRAW_SKIP);
dd_leave_criticalsection();
}
#endif
@ -1299,21 +1366,26 @@ void scrnmngDD_updatefsres(void) {
ddbf.dwFillColor = 0;
if((np2oscfg.fscrnmod & FSCRNMOD_SAMERES) && (g_scrnmode & SCRNMODE_FULLSCREEN)){
dd_enter_criticalsection();
ddraw.wabsurf->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &ddbf);
ddraw.backsurf->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &ddbf);
clearoutscreen();
np2wab.lastWidth = 0;
np2wab.lastHeight = 0;
dd_leave_criticalsection();
return;
}
if(scrnstat.width<100 || scrnstat.height<100){
dd_enter_criticalsection();
ddraw.wabsurf->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &ddbf);
ddraw.backsurf->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &ddbf);
clearoutscreen();
dd_leave_criticalsection();
return;
}
if(np2wab.lastWidth!=width || np2wab.lastHeight!=height){
dd_enter_criticalsection();
np2wab.lastWidth = width;
np2wab.lastHeight = height;
if((g_scrnmode & SCRNMODE_FULLSCREEN)!=0){
@ -1341,6 +1413,7 @@ void scrnmngDD_updatefsres(void) {
clearoutscreen();
ddraw.wabsurf->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &ddbf);
ddraw.backsurf->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &ddbf);
dd_leave_criticalsection();
}
#endif
}
@ -1356,6 +1429,7 @@ void scrnmngDD_blthdc(HDC hdc) {
if (np2wab.wndWidth < 32 || np2wab.wndHeight < 32) return;
if (mt_wabpausedrawing) return;
if (ddraw.wabsurf != NULL) {
dd_enter_criticalsection();
mt_wabdrawing = 1;
r = ddraw.wabsurf->GetDC(&hDCDD);
if (r == DD_OK){
@ -1363,6 +1437,7 @@ void scrnmngDD_blthdc(HDC hdc) {
ddraw.wabsurf->ReleaseDC(hDCDD);
}
mt_wabdrawing = 0;
dd_leave_criticalsection();
}
#endif
}
@ -1393,10 +1468,12 @@ void scrnmngDD_bltwab() {
dstmp = *dst;
dstmp.left += exmgn;
dstmp.right = dstmp.left + scrnstat.width;
dd_enter_criticalsection();
r = ddraw.backsurf->Blt(&dstmp, ddraw.wabsurf, &src, DDBLT_WAIT, NULL);
if (r == DDERR_SURFACELOST) {
restoresurfaces();
}
dd_leave_criticalsection();
}
#endif
}
}

View File

@ -5,6 +5,7 @@ extern "C" {
BRESULT scrnmngDD_create(UINT8 scrnmode);
void scrnmngDD_destroy(void);
void scrnmngDD_shutdown(void);
void scrnmngDD_setwidth(int posx, int width);
void scrnmngDD_setextend(int extend);