mirror of
https://github.com/AppleWin/AppleWin.git
synced 2026-04-25 19:19:02 +00:00
Support 2nd Disk][ in slot-5, via command line: - -s5 diskii - -s5d1 \<imagefile\> - -s5d2 \<imagefile\> NB. there's currently no Configuration UI support, except the Drive icons' tooltips show what's in slot-5 & slot-6 (for drive-n). So there's no way to eject the disks or insert new disks. The use-case I'm supporting it Wasteland which just has the 4 disks in the 4 drives. Improved card management: - Added `class Card` (in Card.h) which all other cards (that exist as classes) derive from (eg. LC,SSC,Mouse,Disk2). - Added `class CardManager` (in CardManager.cpp\h) which now manages the 8 slots (and aux slot). - Added `class Disk2CardManager` (in Disk2CardManager.cpp\h) which provides methods for operations that act on all Disk2 instances at the same time. - Currently limited to just 1x SSC and 1x Mouse card (why would you need more?). This simplifies things, meaning there's no need to have dedicated SSCManager / MouseCardManager objects. - Currently the 2nd Disk2 card can only be put into slot-5. This limitation is just due to the complexity of the Configuration UI. Having a more general drop-down per slot UI would remove this limitation.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "../Applewin.h"
|
||||
#include "../CardManager.h"
|
||||
#include "../CPU.h"
|
||||
#include "../DiskImage.h" // Disk_Status_e
|
||||
#include "../Harddisk.h" // HD_CardIsEnabled()
|
||||
@@ -19,9 +20,9 @@ public:
|
||||
m_bEnableTheFreezesF8Rom = bEnableTheFreezesF8Rom;
|
||||
memset(&m_Slot, 0, sizeof(m_Slot));
|
||||
m_SlotAux = CT_Empty;
|
||||
m_Slot[4] = g_Slot[4];
|
||||
m_Slot[5] = g_Slot[5];
|
||||
m_Slot[7] = g_Slot[7];
|
||||
m_Slot[SLOT4] = g_CardMgr.QuerySlot(SLOT4);
|
||||
m_Slot[SLOT5] = g_CardMgr.QuerySlot(SLOT5);
|
||||
m_Slot[SLOT7] = g_CardMgr.QuerySlot(SLOT7);
|
||||
}
|
||||
|
||||
const CConfigNeedingRestart& operator= (const CConfigNeedingRestart& other)
|
||||
|
||||
@@ -203,8 +203,16 @@ BOOL CPageConfig::DlgProcInternal(HWND hWnd, UINT message, WPARAM wparam, LPARAM
|
||||
CheckDlgButton(hWnd, IDC_CHECK_VERTICAL_BLEND, IsVideoStyle(VS_COLOR_VERTICAL_BLEND) ? BST_CHECKED : BST_UNCHECKED);
|
||||
EnableWindow(GetDlgItem(hWnd, IDC_CHECK_VERTICAL_BLEND), (GetVideoType() == VT_COLOR_MONITOR_RGB) ? TRUE : FALSE);
|
||||
|
||||
m_PropertySheetHelper.FillComboBox(hWnd,IDC_SERIALPORT, sg_SSC.GetSerialPortChoices(), sg_SSC.GetSerialPort());
|
||||
EnableWindow(GetDlgItem(hWnd, IDC_SERIALPORT), !sg_SSC.IsActive() ? TRUE : FALSE);
|
||||
if (g_CardMgr.IsSSCInstalled())
|
||||
{
|
||||
CSuperSerialCard* pSSC = g_CardMgr.GetSSC();
|
||||
m_PropertySheetHelper.FillComboBox(hWnd, IDC_SERIALPORT, pSSC->GetSerialPortChoices(), pSSC->GetSerialPort());
|
||||
EnableWindow(GetDlgItem(hWnd, IDC_SERIALPORT), !pSSC->IsActive() ? TRUE : FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
EnableWindow(GetDlgItem(hWnd, IDC_SERIALPORT), FALSE);
|
||||
}
|
||||
|
||||
CheckDlgButton(hWnd, IDC_CHECK_50HZ_VIDEO, (GetVideoRefreshRate() == VR_50HZ) ? BST_CHECKED : BST_UNCHECKED);
|
||||
|
||||
@@ -333,12 +341,16 @@ void CPageConfig::DlgOK(HWND hWnd)
|
||||
|
||||
//
|
||||
|
||||
const DWORD uNewSerialPort = (DWORD) SendDlgItemMessage(hWnd, IDC_SERIALPORT, CB_GETCURSEL, 0, 0);
|
||||
sg_SSC.CommSetSerialPort(hWnd, uNewSerialPort);
|
||||
RegSaveString( TEXT(REG_CONFIG),
|
||||
TEXT(REGVALUE_SERIAL_PORT_NAME),
|
||||
TRUE,
|
||||
sg_SSC.GetSerialPortName() );
|
||||
if (g_CardMgr.IsSSCInstalled())
|
||||
{
|
||||
CSuperSerialCard* pSSC = g_CardMgr.GetSSC();
|
||||
const DWORD uNewSerialPort = (DWORD) SendDlgItemMessage(hWnd, IDC_SERIALPORT, CB_GETCURSEL, 0, 0);
|
||||
pSSC->CommSetSerialPort(hWnd, uNewSerialPort);
|
||||
RegSaveString( TEXT(REG_CONFIG),
|
||||
TEXT(REGVALUE_SERIAL_PORT_NAME),
|
||||
TRUE,
|
||||
pSSC->GetSerialPortName() );
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#include "StdAfx.h"
|
||||
|
||||
#include "../Applewin.h"
|
||||
#include "../CardManager.h"
|
||||
#include "../Disk.h" // Drive_e, Disk_Status_e
|
||||
#include "../Frame.h"
|
||||
#include "../Registry.h"
|
||||
@@ -89,14 +90,14 @@ BOOL CPageDisk::DlgProcInternal(HWND hWnd, UINT message, WPARAM wparam, LPARAM l
|
||||
case IDC_COMBO_DISK1:
|
||||
if (HIWORD(wparam) == CBN_SELCHANGE)
|
||||
{
|
||||
HandleDiskCombo(hWnd, DRIVE_1, LOWORD(wparam));
|
||||
HandleFloppyDriveCombo(hWnd, DRIVE_1, LOWORD(wparam));
|
||||
FrameRefreshStatus(DRAW_BUTTON_DRIVES);
|
||||
}
|
||||
break;
|
||||
case IDC_COMBO_DISK2:
|
||||
if (HIWORD(wparam) == CBN_SELCHANGE)
|
||||
{
|
||||
HandleDiskCombo(hWnd, DRIVE_2, LOWORD(wparam));
|
||||
HandleFloppyDriveCombo(hWnd, DRIVE_2, LOWORD(wparam));
|
||||
FrameRefreshStatus(DRAW_BUTTON_DRIVES);
|
||||
}
|
||||
break;
|
||||
@@ -130,23 +131,12 @@ BOOL CPageDisk::DlgProcInternal(HWND hWnd, UINT message, WPARAM wparam, LPARAM l
|
||||
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
m_PropertySheetHelper.FillComboBox(hWnd, IDC_DISKTYPE, m_discchoices, sg_Disk2Card.GetEnhanceDisk() ? 1 : 0);
|
||||
m_PropertySheetHelper.FillComboBox(hWnd, IDC_COMBO_DISK1, m_defaultDiskOptions, -1);
|
||||
m_PropertySheetHelper.FillComboBox(hWnd, IDC_COMBO_DISK2, m_defaultDiskOptions, -1);
|
||||
m_PropertySheetHelper.FillComboBox(hWnd, IDC_DISKTYPE, m_discchoices, g_CardMgr.GetDisk2CardMgr().GetEnhanceDisk() ? 1 : 0);
|
||||
|
||||
if (!sg_Disk2Card.GetFullName(DRIVE_1).empty())
|
||||
{
|
||||
SendDlgItemMessage(hWnd, IDC_COMBO_DISK1, CB_INSERTSTRING, 0, (LPARAM)sg_Disk2Card.GetFullName(DRIVE_1).c_str());
|
||||
SendDlgItemMessage(hWnd, IDC_COMBO_DISK1, CB_SETCURSEL, 0, 0);
|
||||
}
|
||||
if (g_CardMgr.QuerySlot(SLOT6) == CT_Disk2)
|
||||
InitComboFloppyDrive(hWnd, SLOT6);
|
||||
|
||||
if (!sg_Disk2Card.GetFullName(DRIVE_2).empty())
|
||||
{
|
||||
SendDlgItemMessage(hWnd, IDC_COMBO_DISK2, CB_INSERTSTRING, 0, (LPARAM)sg_Disk2Card.GetFullName(DRIVE_2).c_str());
|
||||
SendDlgItemMessage(hWnd, IDC_COMBO_DISK2, CB_SETCURSEL, 0, 0);
|
||||
}
|
||||
|
||||
InitComboHDD(hWnd);
|
||||
InitComboHDD(hWnd, SLOT7);
|
||||
|
||||
TCHAR PathToCiderPress[MAX_PATH];
|
||||
RegLoadString(TEXT(REG_CONFIG), REGVALUE_CIDERPRESSLOC, 1, PathToCiderPress, MAX_PATH, TEXT(""));
|
||||
@@ -166,7 +156,27 @@ BOOL CPageDisk::DlgProcInternal(HWND hWnd, UINT message, WPARAM wparam, LPARAM l
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void CPageDisk::InitComboHDD(HWND hWnd)
|
||||
void CPageDisk::InitComboFloppyDrive(HWND hWnd, UINT slot)
|
||||
{
|
||||
Disk2InterfaceCard* pDisk2Card = dynamic_cast<Disk2InterfaceCard*>(g_CardMgr.GetObj(slot));
|
||||
|
||||
m_PropertySheetHelper.FillComboBox(hWnd, IDC_COMBO_DISK1, m_defaultDiskOptions, -1);
|
||||
m_PropertySheetHelper.FillComboBox(hWnd, IDC_COMBO_DISK2, m_defaultDiskOptions, -1);
|
||||
|
||||
if (!pDisk2Card->GetFullName(DRIVE_1).empty())
|
||||
{
|
||||
SendDlgItemMessage(hWnd, IDC_COMBO_DISK1, CB_INSERTSTRING, 0, (LPARAM)pDisk2Card->GetFullName(DRIVE_1).c_str());
|
||||
SendDlgItemMessage(hWnd, IDC_COMBO_DISK1, CB_SETCURSEL, 0, 0);
|
||||
}
|
||||
|
||||
if (!pDisk2Card->GetFullName(DRIVE_2).empty())
|
||||
{
|
||||
SendDlgItemMessage(hWnd, IDC_COMBO_DISK2, CB_INSERTSTRING, 0, (LPARAM)pDisk2Card->GetFullName(DRIVE_2).c_str());
|
||||
SendDlgItemMessage(hWnd, IDC_COMBO_DISK2, CB_SETCURSEL, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void CPageDisk::InitComboHDD(HWND hWnd, UINT /*slot*/)
|
||||
{
|
||||
m_PropertySheetHelper.FillComboBox(hWnd, IDC_COMBO_HDD1, m_defaultHDDOptions, -1);
|
||||
m_PropertySheetHelper.FillComboBox(hWnd, IDC_COMBO_HDD2, m_defaultHDDOptions, -1);
|
||||
@@ -187,9 +197,9 @@ void CPageDisk::InitComboHDD(HWND hWnd)
|
||||
void CPageDisk::DlgOK(HWND hWnd)
|
||||
{
|
||||
const bool bNewEnhanceDisk = SendDlgItemMessage(hWnd, IDC_DISKTYPE,CB_GETCURSEL, 0, 0) ? true : false;
|
||||
if (bNewEnhanceDisk != sg_Disk2Card.GetEnhanceDisk())
|
||||
if (bNewEnhanceDisk != g_CardMgr.GetDisk2CardMgr().GetEnhanceDisk())
|
||||
{
|
||||
sg_Disk2Card.SetEnhanceDisk(bNewEnhanceDisk);
|
||||
g_CardMgr.GetDisk2CardMgr().SetEnhanceDisk(bNewEnhanceDisk);
|
||||
REGSAVE(TEXT(REGVALUE_ENHANCE_DISK_SPEED), (DWORD)bNewEnhanceDisk);
|
||||
}
|
||||
|
||||
@@ -288,8 +298,12 @@ void CPageDisk::HandleHDDCombo(HWND hWnd, UINT driveSelected, UINT comboSelected
|
||||
}
|
||||
}
|
||||
|
||||
void CPageDisk::HandleDiskCombo(HWND hWnd, UINT driveSelected, UINT comboSelected)
|
||||
void CPageDisk::HandleFloppyDriveCombo(HWND hWnd, UINT driveSelected, UINT comboSelected)
|
||||
{
|
||||
Disk2InterfaceCard* pDisk2Card = (g_CardMgr.QuerySlot(SLOT6) == CT_Disk2)
|
||||
? dynamic_cast<Disk2InterfaceCard*>(g_CardMgr.GetObj(SLOT6))
|
||||
: NULL;
|
||||
|
||||
// Search from "select floppy drive"
|
||||
DWORD dwOpenDialogIndex = (DWORD)SendDlgItemMessage(hWnd, comboSelected, CB_FINDSTRINGEXACT, -1, (LPARAM)&m_defaultDiskOptions[0]);
|
||||
DWORD dwComboSelection = (DWORD)SendDlgItemMessage(hWnd, comboSelected, CB_GETCURSEL, 0, 0);
|
||||
@@ -299,7 +313,8 @@ void CPageDisk::HandleDiskCombo(HWND hWnd, UINT driveSelected, UINT comboSelecte
|
||||
if (dwComboSelection == dwOpenDialogIndex)
|
||||
{
|
||||
EnableDisk(hWnd, FALSE); // Prevent multiple Selection dialogs to be triggered
|
||||
bool bRes = sg_Disk2Card.UserSelectNewDiskImage(driveSelected);
|
||||
bool bRes = false;
|
||||
if (pDisk2Card) bRes = pDisk2Card->UserSelectNewDiskImage(driveSelected);
|
||||
EnableDisk(hWnd, TRUE);
|
||||
|
||||
if (!bRes)
|
||||
@@ -316,13 +331,15 @@ void CPageDisk::HandleDiskCombo(HWND hWnd, UINT driveSelected, UINT comboSelecte
|
||||
SendDlgItemMessage(hWnd, comboSelected, CB_DELETESTRING, 0, 0);
|
||||
}
|
||||
|
||||
SendDlgItemMessage(hWnd, comboSelected, CB_INSERTSTRING, 0, (LPARAM)sg_Disk2Card.GetFullName(driveSelected).c_str());
|
||||
std::string fullname;
|
||||
if (pDisk2Card) fullname = pDisk2Card->GetFullName(driveSelected);
|
||||
SendDlgItemMessage(hWnd, comboSelected, CB_INSERTSTRING, 0, (LPARAM)fullname.c_str());
|
||||
SendDlgItemMessage(hWnd, comboSelected, CB_SETCURSEL, 0, 0);
|
||||
|
||||
// If the FD was in the other combo, remove now
|
||||
DWORD comboOther = (comboSelected == IDC_COMBO_DISK1) ? IDC_COMBO_DISK2 : IDC_COMBO_DISK1;
|
||||
|
||||
DWORD duplicated = (DWORD)SendDlgItemMessage(hWnd, comboOther, CB_FINDSTRINGEXACT, -1, (LPARAM)sg_Disk2Card.GetFullName(driveSelected).c_str());
|
||||
DWORD duplicated = (DWORD)SendDlgItemMessage(hWnd, comboOther, CB_FINDSTRINGEXACT, -1, (LPARAM)fullname.c_str());
|
||||
if (duplicated != CB_ERR)
|
||||
{
|
||||
SendDlgItemMessage(hWnd, comboOther, CB_DELETESTRING, duplicated, 0);
|
||||
@@ -337,7 +354,7 @@ void CPageDisk::HandleDiskCombo(HWND hWnd, UINT driveSelected, UINT comboSelecte
|
||||
if (RemovalConfirmation(uCommand))
|
||||
{
|
||||
// Eject selected disk
|
||||
sg_Disk2Card.EjectDisk(driveSelected);
|
||||
if (pDisk2Card) pDisk2Card->EjectDisk(driveSelected);
|
||||
// Remove drive from list
|
||||
SendDlgItemMessage(hWnd, comboSelected, CB_DELETESTRING, 0, 0);
|
||||
}
|
||||
@@ -357,7 +374,7 @@ void CPageDisk::HandleHDDSwap(HWND hWnd)
|
||||
if (!HD_ImageSwap())
|
||||
return;
|
||||
|
||||
InitComboHDD(hWnd);
|
||||
InitComboHDD(hWnd, SLOT7);
|
||||
}
|
||||
|
||||
UINT CPageDisk::RemovalConfirmation(UINT uCommand)
|
||||
|
||||
@@ -25,11 +25,12 @@ protected:
|
||||
|
||||
private:
|
||||
void InitOptions(HWND hWnd);
|
||||
void InitComboHDD(HWND hWnd);
|
||||
void InitComboFloppyDrive(HWND hWnd, UINT slot);
|
||||
void InitComboHDD(HWND hWnd, UINT slot);
|
||||
void EnableHDD(HWND hWnd, BOOL bEnable);
|
||||
void EnableDisk(HWND hWnd, BOOL bEnable);
|
||||
void HandleHDDCombo(HWND hWnd, UINT driveSelected, UINT comboSelected);
|
||||
void HandleDiskCombo(HWND hWnd, UINT driveSelected, UINT comboSelected);
|
||||
void HandleFloppyDriveCombo(HWND hWnd, UINT driveSelected, UINT comboSelected);
|
||||
void HandleHDDSwap(HWND hWnd);
|
||||
UINT RemovalConfirmation(UINT uCommand);
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#include "../SaveState_Structs_common.h"
|
||||
#include "../Common.h"
|
||||
|
||||
#include "../CardManager.h"
|
||||
#include "../Mockingboard.h"
|
||||
#include "../Registry.h"
|
||||
#include "../Speaker.h"
|
||||
@@ -116,7 +117,7 @@ BOOL CPageSound::DlgProcInternal(HWND hWnd, UINT message, WPARAM wparam, LPARAM
|
||||
SendDlgItemMessage(hWnd,IDC_MB_VOLUME,TBM_SETTICFREQ,10,0);
|
||||
SendDlgItemMessage(hWnd,IDC_MB_VOLUME,TBM_SETPOS,1,MB_GetVolume());
|
||||
|
||||
if (g_Slot[5] == CT_SAM)
|
||||
if (g_CardMgr.QuerySlot(SLOT5) == CT_SAM)
|
||||
m_NewCardType = CT_SAM;
|
||||
else
|
||||
m_NewCardType = MB_GetSoundcardType(); // Reinit 1st time page is activated (fires before PSN_SETACTIVE)
|
||||
|
||||
@@ -24,6 +24,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#include "StdAfx.h"
|
||||
|
||||
#include "../Applewin.h" // g_nAppMode, g_uScrollLockToggle, sg_PropertySheet
|
||||
#include "../CardManager.h"
|
||||
#include "../Disk.h"
|
||||
#include "../Frame.h"
|
||||
#include "../Log.h"
|
||||
@@ -124,7 +125,11 @@ void CPropertySheetHelper::SetSlot(UINT slot, SS_CARDTYPE newCardType)
|
||||
if (slot >= NUM_SLOTS)
|
||||
return;
|
||||
|
||||
g_Slot[slot] = newCardType;
|
||||
// Two paths:
|
||||
// 1) Via Config dialog: card not inserted yet
|
||||
// 2) Snapshot_LoadState_v2(): card already inserted
|
||||
if (g_CardMgr.QuerySlot(slot) != newCardType)
|
||||
g_CardMgr.Insert(slot, newCardType);
|
||||
|
||||
std::string slotText;
|
||||
switch (slot)
|
||||
@@ -139,7 +144,7 @@ void CPropertySheetHelper::SetSlot(UINT slot, SS_CARDTYPE newCardType)
|
||||
case 7: slotText = REGVALUE_SLOT7; break;
|
||||
}
|
||||
|
||||
REGSAVE(slotText.c_str(), (DWORD)g_Slot[slot]);
|
||||
REGSAVE(slotText.c_str(), (DWORD)newCardType);
|
||||
}
|
||||
|
||||
// Looks like a (bad) C&P from SaveStateSelectImage()
|
||||
@@ -209,7 +214,10 @@ void CPropertySheetHelper::SaveStateUpdate()
|
||||
|
||||
void CPropertySheetHelper::GetDiskBaseNameWithAWS(std::string & pszFilename)
|
||||
{
|
||||
const std::string & pDiskName = sg_Disk2Card.GetBaseName(DRIVE_1);
|
||||
if (g_CardMgr.QuerySlot(SLOT6) != CT_Disk2)
|
||||
return;
|
||||
|
||||
const std::string & pDiskName = dynamic_cast<Disk2InterfaceCard*>(g_CardMgr.GetObj(SLOT6))->GetBaseName(DRIVE_1);
|
||||
if (!pDiskName.empty())
|
||||
{
|
||||
pszFilename = pDiskName + ".aws.yaml";
|
||||
@@ -445,8 +453,8 @@ void CPropertySheetHelper::SaveCurrentConfig(void)
|
||||
// NB. clone-type is encoded in g_Apple2Type
|
||||
m_ConfigOld.m_Apple2Type = GetApple2Type();
|
||||
m_ConfigOld.m_CpuType = GetMainCpu();
|
||||
m_ConfigOld.m_Slot[4] = g_Slot[4];
|
||||
m_ConfigOld.m_Slot[5] = g_Slot[5];
|
||||
m_ConfigOld.m_Slot[SLOT4] = g_CardMgr.QuerySlot(SLOT4);
|
||||
m_ConfigOld.m_Slot[SLOT5] = g_CardMgr.QuerySlot(SLOT5);
|
||||
m_ConfigOld.m_bEnableHDD = HD_CardIsEnabled();
|
||||
m_ConfigOld.m_bEnableTheFreezesF8Rom = sg_PropertySheet.GetTheFreezesF8Rom();
|
||||
m_ConfigOld.m_videoRefreshRate = GetVideoRefreshRate();
|
||||
@@ -464,8 +472,8 @@ void CPropertySheetHelper::RestoreCurrentConfig(void)
|
||||
// NB. clone-type is encoded in g_Apple2Type
|
||||
SetApple2Type(m_ConfigOld.m_Apple2Type);
|
||||
SetMainCpu(m_ConfigOld.m_CpuType);
|
||||
g_Slot[4] = m_ConfigOld.m_Slot[4];
|
||||
g_Slot[5] = m_ConfigOld.m_Slot[5];
|
||||
g_CardMgr.Insert(SLOT4, m_ConfigOld.m_Slot[SLOT4]);
|
||||
g_CardMgr.Insert(SLOT5, m_ConfigOld.m_Slot[SLOT5]);
|
||||
HD_SetEnabled(m_ConfigOld.m_bEnableHDD);
|
||||
sg_PropertySheet.SetTheFreezesF8Rom(m_ConfigOld.m_bEnableTheFreezesF8Rom);
|
||||
SetVideoRefreshRate(m_ConfigOld.m_videoRefreshRate);
|
||||
|
||||
Reference in New Issue
Block a user