Changed Config->Input prop sheet's UI:

. [Feature #4399] Allow Z80 SoftCard to be inserted into slot 4 or 5. (Allows CP/M v3 to work)
Removed CPP macro: SUPPORT_CPM (since it's been in since 1.16.0, Feb 2009)
Bumped version to 1.21.0
This commit is contained in:
tomch 2012-01-22 13:46:36 +00:00
parent e614289098
commit a3f85280f0
17 changed files with 152 additions and 92 deletions

View File

@ -19,8 +19,11 @@ Restrictions/bugs:
- For an original Apple //e, 80-column (PR#3) and INVERSE, it still appears to be mousetext character, but it should be inverted upper-case from $40 to $5F. - For an original Apple //e, 80-column (PR#3) and INVERSE, it still appears to be mousetext character, but it should be inverted upper-case from $40 to $5F.
1.xx.0 - ?? ??? 2012 1.21.0 - 21 Jan 2012
-------------------- --------------------
Changes:
. [Feature #4399] Allow Z80 SoftCard to be inserted into slot 4 or 5. (Allows CP/M v3 to work)
Fixes: Fixes:
. Floating bus not returned for empty slot $Cnxx addresses (Fix for A2VGA.DSK: Apple][VGA card detection). . Floating bus not returned for empty slot $Cnxx addresses (Fix for A2VGA.DSK: Apple][VGA card detection).

View File

@ -122,8 +122,6 @@ STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_CAPTIO
CAPTION "Input" CAPTION "Input"
FONT 8, "MS Shell Dlg", 0, 0, 0x0 FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN BEGIN
CONTROL "&Restrict mouse to Apple window",IDC_MOUSE_RESTRICT_TO_WINDOW,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,123,121,10
GROUPBOX "Joystick Control",IDC_STATIC,5,7,200,66 GROUPBOX "Joystick Control",IDC_STATIC,5,7,200,66
LTEXT "Joystick &1:",IDC_STATIC,12,20,40,8 LTEXT "Joystick &1:",IDC_STATIC,12,20,40,8
COMBOBOX IDC_JOYSTICK0,52,18,100,100,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_JOYSTICK0,52,18,100,100,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
@ -140,9 +138,11 @@ BEGIN
CONTROL "&Mouse interface in slot 4",IDC_MOUSE_IN_SLOT4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,95,106,10 CONTROL "&Mouse interface in slot 4",IDC_MOUSE_IN_SLOT4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,95,106,10
CONTROL "Show &crosshairs in window's frame",IDC_MOUSE_CROSSHAIR, CONTROL "Show &crosshairs in window's frame",IDC_MOUSE_CROSSHAIR,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,109,159,10 "Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,109,159,10
CONTROL "Microsoft C&P/M SoftCard in slot 5",IDC_Z80_IN_SLOT5, CONTROL "&Restrict mouse to Apple window",IDC_MOUSE_RESTRICT_TO_WINDOW,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,138,122,10 "Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,123,121,10
PUSHBUTTON "Paste &From Clipboard",IDC_PASTE_FROM_CLIPBOARD,5,160,81,14 LTEXT "Microsoft CP/M SoftCard:",IDC_STATIC,5,138,122,10
COMBOBOX IDC_CPM_CONFIG,90,136,55,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Paste &From Clipboard",IDC_PASTE_FROM_CLIPBOARD,5,160,81,14
LTEXT "(Shift+Insert during emulation)",IDC_STATIC,90,163,111,8 LTEXT "(Shift+Insert during emulation)",IDC_STATIC,90,163,111,8
END END
@ -253,8 +253,8 @@ DISK_ICON ICON "DISK.ICO"
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,20,1,0 FILEVERSION 1,21,0,0
PRODUCTVERSION 1,20,1,0 PRODUCTVERSION 1,21,0,0
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@ -272,12 +272,12 @@ BEGIN
VALUE "Comments", "http://applewin.berlios.de" VALUE "Comments", "http://applewin.berlios.de"
VALUE "CompanyName", "AppleWin" VALUE "CompanyName", "AppleWin"
VALUE "FileDescription", "Apple //e Emulator for Windows" VALUE "FileDescription", "Apple //e Emulator for Windows"
VALUE "FileVersion", "1, 20, 1, 0" VALUE "FileVersion", "1, 21, 0, 0"
VALUE "InternalName", "APPLEWIN" VALUE "InternalName", "APPLEWIN"
VALUE "LegalCopyright", " 1994-2011 Michael O'Brien, Oliver Schmidt, Tom Charlesworth, Michael Pohoreski, Nick Westgate, Linards Ticmanis" VALUE "LegalCopyright", " 1994-2012 Michael O'Brien, Oliver Schmidt, Tom Charlesworth, Michael Pohoreski, Nick Westgate, Linards Ticmanis"
VALUE "OriginalFilename", "APPLEWIN.EXE" VALUE "OriginalFilename", "APPLEWIN.EXE"
VALUE "ProductName", "Apple //e Emulator" VALUE "ProductName", "Apple //e Emulator"
VALUE "ProductVersion", "1, 20, 1, 0" VALUE "ProductVersion", "1, 21, 0, 0"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"

View File

@ -87,7 +87,7 @@
#define IDC_MOUSE_RESTRICT_TO_WINDOW 1048 #define IDC_MOUSE_RESTRICT_TO_WINDOW 1048
#define IDC_CIDERPRESS_BROWSE 1049 #define IDC_CIDERPRESS_BROWSE 1049
#define IDC_CIDERPRESS_FILENAME 1050 #define IDC_CIDERPRESS_FILENAME 1050
#define IDC_Z80_IN_SLOT5 1051 #define IDC_CPM_CONFIG 1051
#define IDC_DUMPTOPRINTER 1052 #define IDC_DUMPTOPRINTER 1052
#define IDC_PRINTER_DUMP_FILENAME 1053 #define IDC_PRINTER_DUMP_FILENAME 1053
#define IDC_PRINTER_DUMP_FILENAME_BROWSE 1054 #define IDC_PRINTER_DUMP_FILENAME_BROWSE 1054

View File

@ -85,11 +85,8 @@ CSuperSerialCard sg_SSC;
CMouseInterface sg_Mouse; CMouseInterface sg_Mouse;
// TODO: CLEANUP! Move to peripherals.cpp!!! // TODO: CLEANUP! Move to peripherals.cpp!!!
#ifdef SUPPORT_CPM SS_CARDTYPE g_Slot4 = CT_Empty;
UINT g_Slot4 = CT_Empty; SS_CARDTYPE g_Slot5 = CT_Empty;
#else
UINT g_Slot4 = CT_Mockingboard; // CT_Mockingboard or CT_MouseInterface
#endif
eCPU g_ActiveCPU = CPU_6502; eCPU g_ActiveCPU = CPU_6502;
@ -555,24 +552,19 @@ void LoadConfiguration ()
if(REGLOAD(TEXT(REGVALUE_MOUSE_RESTRICT_TO_WINDOW), &dwTmp)) if(REGLOAD(TEXT(REGVALUE_MOUSE_RESTRICT_TO_WINDOW), &dwTmp))
g_uMouseRestrictToWindow = dwTmp; g_uMouseRestrictToWindow = dwTmp;
#ifdef SUPPORT_CPM if(REGLOAD(TEXT(REGVALUE_CPM_CONFIG), &dwTmp))
if(REGLOAD(TEXT(REGVALUE_Z80_IN_SLOT5), &dwTmp)) g_CPMChoice = (CPMCHOICE) dwTmp;
g_uZ80InSlot5 = dwTmp;
if (g_uZ80InSlot5) if (g_CPMChoice == CPM_SLOT4 || g_CPMChoice == CPM_SLOT5)
MB_SetSoundcardType(SC_NONE); MB_SetSoundcardType(SC_NONE);
g_Slot4 = g_Slot4 =
g_uMouseInSlot4 ? CT_MouseInterface g_uMouseInSlot4 ? CT_MouseInterface
: g_uZ80InSlot5 ? CT_Empty : (g_CPMChoice == CPM_SLOT4) ? CT_Z80
: CT_Mockingboard; : CT_Mockingboard;
// : g_uClockInSlot4 ? CT_GenericClock
// : CT_Mockingboard; g_Slot5 = (g_CPMChoice == CPM_SLOT5) ? CT_Z80
#else : CT_Mockingboard;
g_Slot4 = g_uMouseInSlot4
? CT_MouseInterface
: CT_Mockingboard;
#endif
// //

View File

@ -44,12 +44,12 @@ extern bool g_bDisableDirectSound; // Cmd line switch: don't init DS (s
extern bool g_bDisableDirectSoundMockingboard; // Cmd line switch: don't init MB support extern bool g_bDisableDirectSoundMockingboard; // Cmd line switch: don't init MB support
// TODO: Make g_CurrentPeripherals[MAX_SLOTS] = { CT_Empty } // TODO: Make g_CurrentPeripherals[MAX_SLOTS] = { CT_Empty }
extern UINT g_Slot4; // Mockingboard or Mouse in slot4 extern SS_CARDTYPE g_Slot4; // Mockingboard, Z80, Mouse in slot4
extern SS_CARDTYPE g_Slot5; // Mockingboard, Z80, in slot5
// TODO: Move into: g_CurrentPeripherals[] // TODO: Move into: g_CurrentPeripherals[]
extern UINT g_uMouseInSlot4; extern UINT g_uMouseInSlot4;
//extern UINT g_uClockInSlot4; //extern UINT g_uClockInSlot4;
extern UINT g_uZ80InSlot5;
extern HANDLE g_hCustomRomF8; // NULL if no custom rom extern HANDLE g_hCustomRomF8; // NULL if no custom rom

View File

@ -87,11 +87,9 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#include "StdAfx.h" #include "StdAfx.h"
#include "MouseInterface.h" #include "MouseInterface.h"
#ifdef SUPPORT_CPM
#include "z80emu.h" #include "z80emu.h"
#include "Z80VICE\z80.h" #include "Z80VICE\z80.h"
#include "Z80VICE\z80mem.h" #include "Z80VICE\z80mem.h"
#endif
#ifdef USE_SPEECH_API #ifdef USE_SPEECH_API
#include "Speech.h" #include "Speech.h"
@ -461,10 +459,8 @@ void CpuInitialize ()
CpuIrqReset(); CpuIrqReset();
CpuNmiReset(); CpuNmiReset();
#ifdef SUPPORT_CPM
z80mem_initialize(); z80mem_initialize();
z80_reset(); z80_reset();
#endif
} }
//=========================================================================== //===========================================================================
@ -567,10 +563,8 @@ void CpuReset()
regs.bJammed = 0; regs.bJammed = 0;
#ifdef SUPPORT_CPM
g_ActiveCPU = CPU_6502; g_ActiveCPU = CPU_6502;
z80_reset(); z80_reset();
#endif
} }
//=========================================================================== //===========================================================================

View File

@ -44,13 +44,11 @@ static DWORD Cpu6502 (DWORD uTotalCycles)
UINT uExtraCycles = 0; UINT uExtraCycles = 0;
BYTE iOpcode; BYTE iOpcode;
#ifdef SUPPORT_CPM
if (g_ActiveCPU == CPU_Z80) if (g_ActiveCPU == CPU_Z80)
{ {
const UINT uZ80Cycles = z80_mainloop(uTotalCycles, uExecutedCycles); CYC(uZ80Cycles) const UINT uZ80Cycles = z80_mainloop(uTotalCycles, uExecutedCycles); CYC(uZ80Cycles)
} }
else else
#endif
{ {
if (!Fetch(iOpcode, uExecutedCycles)) if (!Fetch(iOpcode, uExecutedCycles))
break; break;

View File

@ -47,13 +47,11 @@ static DWORD Cpu65C02 (DWORD uTotalCycles)
UINT uExtraCycles = 0; UINT uExtraCycles = 0;
BYTE iOpcode; BYTE iOpcode;
#ifdef SUPPORT_CPM
if (g_ActiveCPU == CPU_Z80) if (g_ActiveCPU == CPU_Z80)
{ {
const UINT uZ80Cycles = z80_mainloop(uTotalCycles, uExecutedCycles); CYC(uZ80Cycles) const UINT uZ80Cycles = z80_mainloop(uTotalCycles, uExecutedCycles); CYC(uZ80Cycles)
} }
else else
#endif
{ {
if (!Fetch(iOpcode, uExecutedCycles)) if (!Fetch(iOpcode, uExecutedCycles))
break; break;

View File

@ -106,13 +106,11 @@ static DWORD Cpu65D02 (DWORD uTotalCycles)
UINT uExtraCycles = 0; UINT uExtraCycles = 0;
BYTE iOpcode; BYTE iOpcode;
#ifdef SUPPORT_CPM
if (g_ActiveCPU == CPU_Z80) if (g_ActiveCPU == CPU_Z80)
{ {
const UINT uZ80Cycles = z80_mainloop(uTotalCycles, uExecutedCycles); CYC(uZ80Cycles) const UINT uZ80Cycles = z80_mainloop(uTotalCycles, uExecutedCycles); CYC(uZ80Cycles)
} }
else else
#endif
if (!Fetch(iOpcode, uExecutedCycles)) if (!Fetch(iOpcode, uExecutedCycles))
break; break;

View File

@ -1,6 +1,5 @@
#pragma once #pragma once
#define SUPPORT_CPM
#define USE_SPEECH_API #define USE_SPEECH_API
const double _M14 = (157500000.0 / 11.0); // 14.3181818... * 10^6 const double _M14 = (157500000.0 / 11.0); // 14.3181818... * 10^6
@ -90,7 +89,8 @@ enum AppMode_e
#define REGVALUE_THE_FREEZES_F8_ROM "The Freeze's F8 Rom" #define REGVALUE_THE_FREEZES_F8_ROM "The Freeze's F8 Rom"
#define REGVALUE_CLONETYPE "Clone Type" #define REGVALUE_CLONETYPE "Clone Type"
#define REGVALUE_CIDERPRESSLOC "CiderPress Location" #define REGVALUE_CIDERPRESSLOC "CiderPress Location"
#define REGVALUE_Z80_IN_SLOT5 "Z80 in slot 5" //#define REGVALUE_Z80_IN_SLOT5 "Z80 in slot 5"
#define REGVALUE_CPM_CONFIG "CPM Config"
#define REGVALUE_DUMP_TO_PRINTER "Dump to printer" #define REGVALUE_DUMP_TO_PRINTER "Dump to printer"
#define REGVALUE_CONVERT_ENCODING "Convert printer encoding for clones" #define REGVALUE_CONVERT_ENCODING "Convert printer encoding for clones"
#define REGVALUE_FILTER_UNPRINTABLE "Filter unprintable characters" #define REGVALUE_FILTER_UNPRINTABLE "Filter unprintable characters"

View File

@ -1685,9 +1685,7 @@ void ResetMachineState ()
MB_Reset(); MB_Reset();
SpkrReset(); SpkrReset();
sg_Mouse.Reset(); sg_Mouse.Reset();
#ifdef SUPPORT_CPM
g_ActiveCPU = CPU_6502; g_ActiveCPU = CPU_6502;
#endif
#ifdef USE_SPEECH_API #ifdef USE_SPEECH_API
g_Speech.Reset(); g_Speech.Reset();
#endif #endif

View File

@ -30,11 +30,9 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#include "Harddisk.h" #include "Harddisk.h"
#include "MouseInterface.h" #include "MouseInterface.h"
#include "NoSlotClock.h" #include "NoSlotClock.h"
#ifdef SUPPORT_CPM
#include "z80emu.h" #include "z80emu.h"
#include "Z80VICE\z80.h" #include "Z80VICE\z80.h"
#include "Z80VICE\z80mem.h" #include "Z80VICE\z80mem.h"
#endif
#include "..\resource\resource.h" #include "..\resource\resource.h"
// Memory Flag // Memory Flag
@ -1172,21 +1170,25 @@ void MemInitialize()
{ {
sg_Mouse.Initialize(pCxRomPeripheral, 4); // $C400 : Mouse f/w sg_Mouse.Initialize(pCxRomPeripheral, 4); // $C400 : Mouse f/w
} }
// else if (g_Slot4 == CT_GenericClock)
// {
// LoadRom_Clock_Generic(pCxRomPeripheral, 4);
// }
else if (g_Slot4 == CT_Mockingboard) else if (g_Slot4 == CT_Mockingboard)
{ {
const UINT uSlot4 = 4; const UINT uSlot4 = 4;
const UINT uSlot5 = 5; const UINT uSlot5 = 5;
MB_InitializeIO(pCxRomPeripheral, uSlot4, uSlot5); MB_InitializeIO(pCxRomPeripheral, uSlot4, uSlot5);
} }
else if (g_Slot4 == CT_Z80)
{
ConfigureSoftcard(pCxRomPeripheral, 4); // $C400 : Z80 card
}
// else if (g_Slot4 == CT_GenericClock)
// {
// LoadRom_Clock_Generic(pCxRomPeripheral, 4);
// }
#ifdef SUPPORT_CPM if (g_Slot5 == CT_Z80)
if (g_uZ80InSlot5) {
ConfigureSoftcard(pCxRomPeripheral, 5, g_uZ80InSlot5); // $C500 : Z80 card ConfigureSoftcard(pCxRomPeripheral, 5); // $C500 : Z80 card
#endif }
DiskLoadRom(pCxRomPeripheral, 6); // $C600 : Disk][ f/w DiskLoadRom(pCxRomPeripheral, 6); // $C600 : Disk][ f/w
HD_Load_Rom(pCxRomPeripheral, 7); // $C700 : HDD f/w HD_Load_Rom(pCxRomPeripheral, 7); // $C700 : HDD f/w
@ -1241,9 +1243,7 @@ void MemReset ()
CpuInitialize(); CpuInitialize();
//Sets Caps Lock = false (Pravets 8A/C only) //Sets Caps Lock = false (Pravets 8A/C only)
#ifdef SUPPORT_CPM
z80_reset(); z80_reset();
#endif
} }
//=========================================================================== //===========================================================================

View File

@ -1498,18 +1498,11 @@ static BYTE __stdcall PhasorIO (WORD PC, WORD nAddr, BYTE bWrite, BYTE nValue, U
void MB_InitializeIO(LPBYTE pCxRomPeripheral, UINT uSlot4, UINT uSlot5) void MB_InitializeIO(LPBYTE pCxRomPeripheral, UINT uSlot4, UINT uSlot5)
{ {
#ifdef SUPPORT_CPM if (g_Slot4 == CT_Mockingboard)
if (g_Slot4 == CT_Mockingboard) {
{ RegisterIoHandler(uSlot4, PhasorIO, PhasorIO, MB_Read, MB_Write, NULL, NULL);
RegisterIoHandler(uSlot4, PhasorIO, PhasorIO, MB_Read, MB_Write, NULL, NULL);
RegisterIoHandler(uSlot5, PhasorIO, PhasorIO, MB_Read, MB_Write, NULL, NULL);
}
#else
if (g_Slot4 == CT_Mockingboard)
RegisterIoHandler(uSlot4, PhasorIO, PhasorIO, MB_Read, MB_Write, NULL, NULL);
RegisterIoHandler(uSlot5, PhasorIO, PhasorIO, MB_Read, MB_Write, NULL, NULL); RegisterIoHandler(uSlot5, PhasorIO, PhasorIO, MB_Read, MB_Write, NULL, NULL);
#endif }
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

View File

@ -78,6 +78,15 @@ TCHAR soundchoices[] = TEXT("Disabled\0")
TCHAR discchoices[] = TEXT("Authentic Speed\0") TCHAR discchoices[] = TEXT("Authentic Speed\0")
TEXT("Enhanced Speed\0"); TEXT("Enhanced Speed\0");
TCHAR g_szCPMSlotChoice_Slot4[] = TEXT("Slot 4\0");
TCHAR g_szCPMSlotChoice_Slot5[] = TEXT("Slot 5\0");
TCHAR g_szCPMSlotChoice_Unplugged[] = TEXT("Unplugged\0");
TCHAR g_szCPMSlotChoice_Unavailable[] = TEXT("Unavailable\0");
static TCHAR g_szCPMSlotChoices[100];
CPMCHOICE g_CPMChoice = CPM_UNPLUGGED;
CPMCHOICE g_CPMComboItemToChoice[_CPM_MAX_CHOICES];
const UINT VOLUME_MIN = 0; const UINT VOLUME_MIN = 0;
const UINT VOLUME_MAX = 59; const UINT VOLUME_MAX = 59;
@ -92,8 +101,6 @@ UINT g_uMouseInSlot4 = 0;
UINT g_uMouseShowCrosshair = 0; UINT g_uMouseShowCrosshair = 0;
UINT g_uMouseRestrictToWindow = 0; UINT g_uMouseRestrictToWindow = 0;
UINT g_uZ80InSlot5 = 0;
// //
UINT g_uTheFreezesF8Rom = 0; UINT g_uTheFreezesF8Rom = 0;
@ -219,6 +226,72 @@ static void InitJoystickChoices(HWND window, int nJoyNum, int nIdcValue)
FillComboBox(window, nIdcValue, pnzJoystickChoices, joytype[nJoyNum]); FillComboBox(window, nIdcValue, pnzJoystickChoices, joytype[nJoyNum]);
} }
static void InitCPMChoices(HWND window)
{
for (UINT i=0; i<_CPM_MAX_CHOICES; i++)
g_CPMComboItemToChoice[i] = CPM_UNAVAILABLE;
UINT uStringOffset = 0;
UINT uComboItemIdx = 0;
const eSOUNDCARDTYPE SoundcardType = MB_GetSoundcardType();
const bool bIsSlot4Empty = g_uMouseInSlot4 == 0 &&
SoundcardType == SC_NONE; // Mockingboard is in slots 4+5; Phasor is in slot 4
const bool bIsSlot5Empty = SoundcardType != SC_MOCKINGBOARD;
if (bIsSlot4Empty) // Slot-4 is empty
{
const UINT uStrLen = strlen(g_szCPMSlotChoice_Slot4)+1;
memcpy(&g_szCPMSlotChoices[uStringOffset], g_szCPMSlotChoice_Slot4, uStrLen);
uStringOffset += uStrLen;
g_CPMComboItemToChoice[uComboItemIdx++] = CPM_SLOT4;
}
if (bIsSlot5Empty) // Slot-5 is empty
{
const UINT uStrLen = strlen(g_szCPMSlotChoice_Slot5)+1;
memcpy(&g_szCPMSlotChoices[uStringOffset], g_szCPMSlotChoice_Slot5, uStrLen);
uStringOffset += uStrLen;
g_CPMComboItemToChoice[uComboItemIdx++] = CPM_SLOT5;
}
if (uStringOffset)
{
const UINT uStrLen = strlen(g_szCPMSlotChoice_Unplugged)+1;
memcpy(&g_szCPMSlotChoices[uStringOffset], g_szCPMSlotChoice_Unplugged, uStrLen);
uStringOffset += uStrLen;
g_CPMComboItemToChoice[uComboItemIdx] = CPM_UNPLUGGED;
}
else
{
const UINT uStrLen = strlen(g_szCPMSlotChoice_Unavailable)+1;
memcpy(&g_szCPMSlotChoices[uStringOffset], g_szCPMSlotChoice_Unavailable, uStrLen);
uStringOffset += uStrLen;
g_CPMChoice = CPM_UNAVAILABLE; // Force this
g_CPMComboItemToChoice[uComboItemIdx] = CPM_UNAVAILABLE;
}
g_szCPMSlotChoices[uStringOffset] = 0; // Doubly null terminated
//
UINT uCurrentChoice = uComboItemIdx; // Default to last item (either UNPLUGGED or UNAVAILABLE)
for (UINT i=0; i<=uComboItemIdx; i++)
{
if (g_CPMComboItemToChoice[i] == g_CPMChoice)
{
uCurrentChoice = i;
break;
}
}
FillComboBox(window, IDC_CPM_CONFIG, g_szCPMSlotChoices, uCurrentChoice);
}
//=========================================================================== //===========================================================================
static eApple2Type GetApple2Type(DWORD NewCompType, DWORD NewCloneType) static eApple2Type GetApple2Type(DWORD NewCompType, DWORD NewCloneType)
@ -541,7 +614,7 @@ static void InputDlg_OK(HWND window, UINT afterclose)
REGSAVE(TEXT(REGVALUE_MOUSE_IN_SLOT4),g_uMouseInSlot4); REGSAVE(TEXT(REGVALUE_MOUSE_IN_SLOT4),g_uMouseInSlot4);
REGSAVE(TEXT(REGVALUE_MOUSE_CROSSHAIR),g_uMouseShowCrosshair); REGSAVE(TEXT(REGVALUE_MOUSE_CROSSHAIR),g_uMouseShowCrosshair);
REGSAVE(TEXT(REGVALUE_MOUSE_RESTRICT_TO_WINDOW),g_uMouseRestrictToWindow); REGSAVE(TEXT(REGVALUE_MOUSE_RESTRICT_TO_WINDOW),g_uMouseRestrictToWindow);
REGSAVE(TEXT(REGVALUE_Z80_IN_SLOT5),g_uZ80InSlot5); REGSAVE(TEXT(REGVALUE_CPM_CONFIG), g_CPMChoice);
// //
@ -667,30 +740,36 @@ static BOOL CALLBACK InputDlgProc(HWND window,
} }
break; break;
case IDC_Z80_IN_SLOT5: case IDC_CPM_CONFIG:
if(HIWORD(wparam) == CBN_SELCHANGE)
{ {
UINT uNewState = IsDlgButtonChecked(window, IDC_Z80_IN_SLOT5) ? 1 : 0; DWORD NewCPMChoiceItem = (DWORD) SendDlgItemMessage(window, IDC_CPM_CONFIG, CB_GETCURSEL, 0, 0);
LPCSTR pMsg = uNewState ? CPMCHOICE NewCPMChoice = g_CPMComboItemToChoice[NewCPMChoiceItem];
if (NewCPMChoice == g_CPMChoice)
break;
LPCSTR pMsg = NewCPMChoice != CPM_UNPLUGGED ?
TEXT("The emulator needs to restart as the slot configuration has changed.\n") TEXT("The emulator needs to restart as the slot configuration has changed.\n")
TEXT("Microsoft CP/M SoftCard will be placed in slot 5.\n\n") TEXT("Microsoft CP/M SoftCard will be inserted.\n\n")
TEXT("Would you like to restart the emulator now?") TEXT("Would you like to restart the emulator now?")
: :
TEXT("The emulator needs to restart as the slot configuration has changed.\n") TEXT("The emulator needs to restart as the slot configuration has changed.\n")
TEXT("Microsoft CP/M SoftCard will be removed from slot 5\n\n") TEXT("Microsoft CP/M SoftCard will be removed.\n\n")
TEXT("Would you like to restart the emulator now?"); TEXT("Would you like to restart the emulator now?");
if (MessageBox(window, if (MessageBox(window,
pMsg, pMsg,
TEXT("Configuration"), TEXT("Configuration"),
MB_ICONQUESTION | MB_YESNO | MB_SETFOREGROUND) == IDYES) MB_ICONQUESTION | MB_YESNO | MB_SETFOREGROUND) == IDYES)
{ {
g_uZ80InSlot5 = uNewState; g_CPMChoice = NewCPMChoice;
afterclose = WM_USER_RESTART; afterclose = WM_USER_RESTART;
PropSheet_PressButton(GetParent(window), PSBTN_OK); PropSheet_PressButton(GetParent(window), PSBTN_OK);
} }
else else
{ {
CheckDlgButton(window, IDC_Z80_IN_SLOT5, g_uZ80InSlot5 ? BST_CHECKED : BST_UNCHECKED); InitCPMChoices(window); // Restore original state
} }
} }
break; break;
@ -714,12 +793,17 @@ static BOOL CALLBACK InputDlgProc(HWND window,
SendDlgItemMessage(window, IDC_SPIN_YTRIM, UDM_SETPOS, 0, MAKELONG(JoyGetTrim(false),0)); SendDlgItemMessage(window, IDC_SPIN_YTRIM, UDM_SETPOS, 0, MAKELONG(JoyGetTrim(false),0));
CheckDlgButton(window, IDC_SCROLLLOCK_TOGGLE, g_uScrollLockToggle ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(window, IDC_SCROLLLOCK_TOGGLE, g_uScrollLockToggle ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(window, IDC_MOUSE_IN_SLOT4, g_uMouseInSlot4 ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(window, IDC_MOUSE_IN_SLOT4, g_uMouseInSlot4 ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(window, IDC_MOUSE_CROSSHAIR, g_uMouseShowCrosshair ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(window, IDC_MOUSE_CROSSHAIR, g_uMouseShowCrosshair ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(window, IDC_MOUSE_RESTRICT_TO_WINDOW, g_uMouseRestrictToWindow ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(window, IDC_MOUSE_RESTRICT_TO_WINDOW, g_uMouseRestrictToWindow ? BST_CHECKED : BST_UNCHECKED);
const eSOUNDCARDTYPE SoundcardType = MB_GetSoundcardType();
EnableWindow(GetDlgItem(window, IDC_MOUSE_IN_SLOT4), (g_uMouseInSlot4 || (g_CPMChoice != CPM_SLOT4 && SoundcardType == SC_NONE)) ? TRUE : FALSE);
EnableWindow(GetDlgItem(window, IDC_MOUSE_CROSSHAIR), g_uMouseInSlot4 ? TRUE : FALSE); EnableWindow(GetDlgItem(window, IDC_MOUSE_CROSSHAIR), g_uMouseInSlot4 ? TRUE : FALSE);
EnableWindow(GetDlgItem(window, IDC_MOUSE_RESTRICT_TO_WINDOW), g_uMouseInSlot4 ? TRUE : FALSE); EnableWindow(GetDlgItem(window, IDC_MOUSE_RESTRICT_TO_WINDOW), g_uMouseInSlot4 ? TRUE : FALSE);
CheckDlgButton(window, IDC_Z80_IN_SLOT5, g_uZ80InSlot5 ? BST_CHECKED : BST_UNCHECKED);
InitCPMChoices(window);
afterclose = 0; afterclose = 0;
break; break;
@ -849,14 +933,14 @@ static BOOL CALLBACK SoundDlgProc (HWND window,
CheckRadioButton(window, IDC_MB_ENABLE, IDC_SOUNDCARD_DISABLE, nID); CheckRadioButton(window, IDC_MB_ENABLE, IDC_SOUNDCARD_DISABLE, nID);
if (g_uMouseInSlot4) if (g_uMouseInSlot4 || g_CPMChoice == CPM_SLOT4)
{ {
EnableWindow(GetDlgItem(window, IDC_PHASOR_ENABLE), FALSE); EnableWindow(GetDlgItem(window, IDC_PHASOR_ENABLE), FALSE); // Disable Phasor (slot 4)
} }
if (g_uZ80InSlot5) if (g_uMouseInSlot4 || g_CPMChoice == CPM_SLOT4 || g_CPMChoice == CPM_SLOT5)
{ {
EnableWindow(GetDlgItem(window, IDC_MB_ENABLE), FALSE); EnableWindow(GetDlgItem(window, IDC_MB_ENABLE), FALSE); // Disable Mockingboard (slot 4 & 5)
} }
afterclose = 0; afterclose = 0;

View File

@ -9,6 +9,8 @@
extern HWND hwConfigTab; extern HWND hwConfigTab;
extern HWND hwAdvancedTab; extern HWND hwAdvancedTab;
enum CPMCHOICE {CPM_SLOT4=0, CPM_SLOT5, CPM_UNPLUGGED, CPM_UNAVAILABLE, _CPM_MAX_CHOICES};
extern CPMCHOICE g_CPMChoice;
// Prototypes // Prototypes

View File

@ -34,11 +34,11 @@ BYTE __stdcall CPMZ80_IOWrite(WORD PC, WORD uAddr, BYTE bWrite, BYTE uValue, ULO
//=========================================================================== //===========================================================================
void ConfigureSoftcard(LPBYTE pCxRomPeripheral, UINT uSlot, UINT bEnable) void ConfigureSoftcard(LPBYTE pCxRomPeripheral, UINT uSlot)
{ {
memset(pCxRomPeripheral + (uSlot << 8), 0xFF, APPLE_SLOT_SIZE); memset(pCxRomPeripheral + (uSlot << 8), 0xFF, APPLE_SLOT_SIZE);
g_uCPMZ80Slot = uSlot; g_uCPMZ80Slot = uSlot;
RegisterIoHandler(uSlot, CPMZ80_IONull, CPMZ80_IONull, CPMZ80_IONull, bEnable ? CPMZ80_IOWrite : NULL, NULL, NULL); RegisterIoHandler(uSlot, CPMZ80_IONull, CPMZ80_IONull, CPMZ80_IONull, CPMZ80_IOWrite, NULL, NULL);
} }

View File

@ -13,4 +13,4 @@
// Emula a CPU Z80 // Emula a CPU Z80
// Protótipos // Protótipos
void ConfigureSoftcard(LPBYTE pCxRomPeripheral, UINT uSlot, UINT bEnable); void ConfigureSoftcard(LPBYTE pCxRomPeripheral, UINT uSlot);