Skip to content

Commit b515eb4

Browse files
ejaquayejaquay
authored andcommitted
Cartridge eject before load. Auto close config dialogs.
Pak Cartridge submenu now only enables load if there is no cart loaded. If there is a cart loaded the submenu only allows eject. Mpi config dialog also enforces eject before load. Disk, sdc, mpi, and acia configs now auto close if their dll's are unloaded, either from the pak submenu or from the mpi config. Changes seem to have fixed known crashes caused by loading/unloading of carts.
1 parent 1bdf736 commit b515eb4

File tree

8 files changed

+250
-177
lines changed

8 files changed

+250
-177
lines changed

FD502/fd502.cpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,9 @@ BOOL WINAPI DllMain(
9494
{
9595
if (fdwReason == DLL_PROCESS_DETACH ) //Clean Up
9696
{
97+
SendMessage(g_hConfDlg,WM_CLOSE,0,0);
9798
for (unsigned char Drive=0;Drive<=3;Drive++)
9899
unmount_disk_image(Drive);
99-
if (g_hConfDlg) DestroyWindow(g_hConfDlg);
100100
}
101101
else
102102
{
@@ -149,7 +149,8 @@ extern "C"
149149
SaveConfig();
150150
break;
151151
case 16:
152-
CreateDialog(g_hinstDLL,(LPCTSTR)IDD_CONFIG,h_own,(DLGPROC)Config);
152+
if (g_hConfDlg == NULL)
153+
CreateDialog(g_hinstDLL,(LPCTSTR)IDD_CONFIG,h_own,(DLGPROC)Config);
153154
ShowWindow(g_hConfDlg,1);
154155
break;
155156
case 17:
@@ -271,10 +272,21 @@ LRESULT CALLBACK Config(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
271272
char VirtualNames[5][16]={"None","Drive 0","Drive 1","Drive 2","Drive 3"};
272273
OPENFILENAME ofn ;
273274

274-
g_hConfDlg = hDlg;
275275
switch (message)
276276
{
277+
case WM_CLOSE:
278+
DestroyWindow(hDlg);
279+
return TRUE;
280+
break;
281+
282+
case WM_DESTROY:
283+
PostQuitMessage(0);
284+
g_hConfDlg = NULL;
285+
return TRUE;
286+
break;
287+
277288
case WM_INITDIALOG:
289+
g_hConfDlg = hDlg;
278290
CenterDialog(hDlg);
279291
TempSelectRom=SelectRom;
280292
if (!RealDisks)

HardDisk/harddisk.cpp

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,9 @@ BOOL WINAPI DllMain( HINSTANCE hinstDLL, // handle to DLL module
6969
LPVOID lpReserved ) // reserved
7070
{
7171
if (fdwReason == DLL_PROCESS_DETACH ) {
72+
SendMessage(hConfDlg,WM_CLOSE,0,0);
7273
UnmountHD(0);
7374
UnmountHD(1);
74-
if (hConfDlg) DestroyWindow(hConfDlg);
7575
} else {
7676
g_hinstDLL=hinstDLL;
7777
}
@@ -158,12 +158,26 @@ LRESULT CALLBACK Config(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
158158
{
159159
switch (message)
160160
{
161+
case WM_CLOSE:
162+
EndDialog(hDlg,LOWORD(wParam));
163+
DestroyWindow(hDlg);
164+
return TRUE;
165+
break;
166+
167+
case WM_DESTROY:
168+
PostQuitMessage(0);
169+
hConfDlg=NULL;
170+
return TRUE;
171+
break;
172+
161173
case WM_INITDIALOG:
162174
hConfDlg=hDlg;
163-
CenterDialog(hDlg);
175+
CenterDialog(hDlg);
164176
SendDlgItemMessage(hDlg,IDC_CLOCK,BM_SETCHECK,ClockEnabled,0);
165177
SendDlgItemMessage(hDlg,IDC_READONLY,BM_SETCHECK,ClockReadOnly,0);
166178
EnableWindow(GetDlgItem(hDlg, IDC_CLOCK), TRUE);
179+
return TRUE;
180+
break;
167181

168182
case WM_COMMAND:
169183
switch (LOWORD(wParam))
@@ -186,12 +200,7 @@ LRESULT CALLBACK Config(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
186200

187201
/*
188202
// This captures the Fuction transfer point for the CPU assert interupt
189-
//
190-
// NOTE: Vcc currently is not doing interupts after DMA transfers!
191-
// This only works because it is single threaded which causes 6x09
192-
// emulation to halt until transfers complete. Real hardware differs.
193-
//
194-
// TODO: Asyncronous Disk I/O
203+
// NOTE: Vcc does not do interupts after DMA transfers
195204
//
196205
197206
extern "C"
@@ -248,6 +257,7 @@ extern "C"
248257
{
249258
MemRead8 = Temp1;
250259
MemWrite8 = Temp2;
260+
VhdReset(); // Selects drive zero
251261
return;
252262
}
253263
}
@@ -295,15 +305,15 @@ extern "C"
295305
}
296306
}
297307

298-
extern "C"
299-
{
300-
__declspec(dllexport) unsigned char
301-
ModuleReset(void)
302-
{
303-
VhdReset();
304-
return 0;
305-
}
306-
}
308+
//extern "C"
309+
//{
310+
// __declspec(dllexport) unsigned char
311+
// ModuleReset(void)
312+
// {
313+
// VhdReset();
314+
// return 0;
315+
// }
316+
//}
307317

308318
/*
309319
void CPUAssertInterupt(unsigned char Interupt,unsigned char Latencey)
@@ -443,8 +453,8 @@ void SaveConfig(void)
443453
}
444454
WritePrivateProfileString(ModName,"VHDImage",VHDfile0 ,IniFile);
445455
WritePrivateProfileString(ModName,"VHDImage1",VHDfile1 ,IniFile);
446-
WritePrivateProfileInt(ModName,"ClkEnable",ClockEnabled ,IniFile);
447-
WritePrivateProfileInt(ModName,"ClkRdOnly",ClockReadOnly ,IniFile);
456+
WritePrivateProfileInt(ModName,"ClkEnable",ClockEnabled ,IniFile);
457+
WritePrivateProfileInt(ModName,"ClkRdOnly",ClockReadOnly ,IniFile);
448458
return;
449459
}
450460

@@ -473,7 +483,7 @@ void BuildDynaMenu(void)
473483
strcat(TempMsg,TempBuf);
474484
DynamicMenuCallback(TempMsg,5013,SLAVE);
475485

476-
DynamicMenuCallback( "HD Config",5014,STANDALONE);
486+
DynamicMenuCallback( "HD Config",5014,STANDALONE);
477487

478488
DynamicMenuCallback("",1,0);
479489
}

acia/acia.c

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ void BuildDynaMenu(void);
3939
LRESULT CALLBACK Config(HWND, UINT, WPARAM, LPARAM);
4040
void LoadConfig(void);
4141
void SaveConfig(void);
42+
void CenterDialog(HWND);
4243

4344
//------------------------------------------------------------------------
4445
// Globals
@@ -72,8 +73,7 @@ DllMain(HINSTANCE hinst, DWORD reason, LPVOID foo)
7273
LoadExtRom("RS232.ROM");
7374

7475
} else if (reason == DLL_PROCESS_DETACH) {
75-
if (g_hDlg) DestroyWindow(g_hDlg);
76-
g_hDlg = NULL;
76+
if (g_hDlg) SendMessage(g_hDlg,WM_CLOSE,0,0);
7777
sc6551_close();
7878
AciaStat[0]='\0';
7979
}
@@ -299,7 +299,14 @@ LRESULT CALLBACK Config(HWND hDlg,UINT msg,WPARAM wParam,LPARAM lParam)
299299
switch (msg) {
300300

301301
case WM_CLOSE:
302-
EndDialog(hDlg,0);
302+
DestroyWindow(hDlg);
303+
return TRUE;
304+
break;
305+
306+
case WM_DESTROY:
307+
PostQuitMessage(0);
308+
g_hDlg = NULL;
309+
return TRUE;
303310
break;
304311

305312
case WM_INITDIALOG:
@@ -308,7 +315,7 @@ LRESULT CALLBACK Config(HWND hDlg,UINT msg,WPARAM wParam,LPARAM lParam)
308315
DestroyWindow(g_hDlg);
309316
g_hDlg = hDlg;
310317

311-
SetWindowPos(hDlg, HWND_TOP, 10, 10, 0, 0, SWP_NOSIZE);
318+
CenterDialog(hDlg);
312319

313320
// Set Button as per Base Port
314321
switch (AciaBasePort) {
@@ -504,6 +511,19 @@ LRESULT CALLBACK Config(HWND hDlg,UINT msg,WPARAM wParam,LPARAM lParam)
504511
return FALSE;
505512
}
506513

514+
//------------------------------------------------------------
515+
// Center a dialog box in parent window
516+
//------------------------------------------------------------
517+
void CenterDialog(HWND hDlg)
518+
{
519+
RECT rPar, rDlg;
520+
GetWindowRect(GetParent(hDlg), &rPar);
521+
GetWindowRect(hDlg, &rDlg);
522+
int x = rPar.left + (rPar.right - rPar.left - (rDlg.right - rDlg.left)) / 2;
523+
int y = rPar.top + (rPar.bottom - rPar.top - (rDlg.bottom - rDlg.top)) / 2;
524+
SetWindowPos(hDlg, NULL, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
525+
}
526+
507527
//----------------------------------------------------------------
508528
// Dispatch I/0 to communication type used.
509529
//-----------------------------------------------------------------

acia/acia.rc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ END
5353
//
5454

5555
IDD_PROPPAGE DIALOGEX 0, 0, 202, 185
56-
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION
56+
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
5757
CAPTION "Acia Interface"
5858
FONT 8, "MS Sans Serif", 0, 0, 0x0
5959
BEGIN

0 commit comments

Comments
 (0)