From 469f9ba8070b646f8cc1fe2d4dcd501b66403765 Mon Sep 17 00:00:00 2001 From: tomcw Date: Sat, 12 Dec 2020 20:49:46 +0000 Subject: [PATCH] Support disconnecting drives from DiskII Interface card: -d1-disconnected, -d2-disconnected --- source/CmdLine.cpp | 8 ++++++++ source/CmdLine.h | 3 +++ source/Disk.cpp | 16 ++++++++++++++++ source/Disk.h | 1 + source/Utilities.cpp | 17 +++++++++++------ source/Utilities.h | 2 +- source/Windows/AppleWin.cpp | 4 ++-- 7 files changed, 42 insertions(+), 9 deletions(-) diff --git a/source/CmdLine.cpp b/source/CmdLine.cpp index 37c370fc..05a18f23 100644 --- a/source/CmdLine.cpp +++ b/source/CmdLine.cpp @@ -134,6 +134,14 @@ bool ProcessCmdLine(LPSTR lpCmdLine) lpNextArg = GetNextArg(lpNextArg); g_cmdLine.szImageName_drive[SLOT6][DRIVE_2] = lpCmdLine; } + else if (strcmp(lpCmdLine, "-d1-disconnected") == 0) + { + g_cmdLine.driveConnected[SLOT6][DRIVE_1] = false; + } + else if (strcmp(lpCmdLine, "-d2-disconnected") == 0) + { + g_cmdLine.driveConnected[SLOT6][DRIVE_2] = false; + } else if (strcmp(lpCmdLine, "-h1") == 0) { lpCmdLine = GetCurrArg(lpNextArg); diff --git a/source/CmdLine.h b/source/CmdLine.h index bdbd64de..9d2b387b 100644 --- a/source/CmdLine.h +++ b/source/CmdLine.h @@ -44,6 +44,8 @@ struct CmdLine slotInsert[i] = CT_Empty; szImageName_drive[i][DRIVE_1] = NULL; szImageName_drive[i][DRIVE_2] = NULL; + driveConnected[i][DRIVE_1] = true; + driveConnected[i][DRIVE_2] = true; } } @@ -60,6 +62,7 @@ struct CmdLine UINT bestWidth; UINT bestHeight; LPSTR szImageName_drive[NUM_SLOTS][NUM_DRIVES]; + bool driveConnected[NUM_SLOTS][NUM_DRIVES]; LPSTR szImageName_harddisk[NUM_HARDDISKS]; LPSTR szSnapshotName; LPSTR szScreenshotFilename; diff --git a/source/Disk.cpp b/source/Disk.cpp index 8770b233..a91f13f2 100644 --- a/source/Disk.cpp +++ b/source/Disk.cpp @@ -355,6 +355,16 @@ void Disk2InterfaceCard::EjectDisk(const int drive) Video_ResetScreenshotCounter(""); } +void Disk2InterfaceCard::UnplugDrive(const int drive) +{ + if (!IsDriveValid(drive)) + return; + + EjectDisk(drive); + + m_floppyDrive[drive].m_isConnected = false; +} + //=========================================================================== void Disk2InterfaceCard::WriteTrack(const int drive) @@ -1552,6 +1562,12 @@ void Disk2InterfaceCard::ResetSwitches(void) bool Disk2InterfaceCard::UserSelectNewDiskImage(const int drive, LPCSTR pszFilename/*=""*/) { + if (!IsDriveConnected(drive)) + { + MessageBox(g_hFrameWindow, "Drive not connected!", "Insert disk", MB_ICONEXCLAMATION|MB_SETFOREGROUND|MB_OK); + return false; + } + TCHAR directory[MAX_PATH]; TCHAR filename[MAX_PATH]; TCHAR title[40]; diff --git a/source/Disk.h b/source/Disk.h index 9bbb9554..4a240089 100644 --- a/source/Disk.h +++ b/source/Disk.h @@ -144,6 +144,7 @@ public: ImageError_e InsertDisk(const int drive, LPCTSTR pszImageFilename, const bool bForceWriteProtected, const bool bCreateIfNecessary); void EjectDisk(const int drive); + void UnplugDrive(const int drive); bool IsConditionForFullSpeed(void); void NotifyInvalidImage(const int drive, LPCTSTR pszImageFilename, const ImageError_e Error); diff --git a/source/Utilities.cpp b/source/Utilities.cpp index 6ba4f4c5..156cd15b 100644 --- a/source/Utilities.cpp +++ b/source/Utilities.cpp @@ -389,16 +389,17 @@ bool DoHardDiskInsert(const int nDrive, LPCSTR szFileName) return res; } -void InsertFloppyDisks(const UINT slot, LPSTR szImageName_drive[NUM_DRIVES], bool& bBoot) +void InsertFloppyDisks(const UINT slot, LPSTR szImageName_drive[NUM_DRIVES], bool driveConnected[NUM_DRIVES], bool& bBoot) { _ASSERT(slot == 5 || slot == 6); - if (!szImageName_drive[DRIVE_1] && !szImageName_drive[DRIVE_2]) - return; - bool bRes = true; - if (szImageName_drive[DRIVE_1]) + if (!driveConnected[DRIVE_1]) + { + dynamic_cast(GetCardMgr().GetRef(slot)).UnplugDrive(DRIVE_1); + } + else if (szImageName_drive[DRIVE_1]) { bRes = DoDiskInsert(slot, DRIVE_1, szImageName_drive[DRIVE_1]); LogFileOutput("Init: S%d, DoDiskInsert(D1), res=%d\n", slot, bRes); @@ -406,7 +407,11 @@ void InsertFloppyDisks(const UINT slot, LPSTR szImageName_drive[NUM_DRIVES], boo bBoot = true; } - if (szImageName_drive[DRIVE_2]) + if (!driveConnected[DRIVE_2]) + { + dynamic_cast(GetCardMgr().GetRef(slot)).UnplugDrive(DRIVE_2); + } + else if (szImageName_drive[DRIVE_2]) { bRes |= DoDiskInsert(slot, DRIVE_2, szImageName_drive[DRIVE_2]); LogFileOutput("Init: S%d, DoDiskInsert(D2), res=%d\n", slot, bRes); diff --git a/source/Utilities.h b/source/Utilities.h index 61eb7d4b..47dc1b31 100644 --- a/source/Utilities.h +++ b/source/Utilities.h @@ -7,7 +7,7 @@ void LoadConfiguration(); bool DoDiskInsert(const UINT slot, const int nDrive, LPCSTR szFileName); bool DoHardDiskInsert(const int nDrive, LPCSTR szFileName); -void InsertFloppyDisks(const UINT slot, LPSTR szImageName_drive[NUM_DRIVES], bool& bBoot); +void InsertFloppyDisks(const UINT slot, LPSTR szImageName_drive[NUM_DRIVES], bool driveConnected[NUM_DRIVES], bool& bBoot); void InsertHardDisks(LPSTR szImageName_harddisk[NUM_HARDDISKS], bool& bBoot); void UnplugHardDiskControllerCard(void); void GetAppleWindowTitle(); diff --git a/source/Windows/AppleWin.cpp b/source/Windows/AppleWin.cpp index 151c6688..3ad400d3 100644 --- a/source/Windows/AppleWin.cpp +++ b/source/Windows/AppleWin.cpp @@ -880,10 +880,10 @@ static void RepeatInitialization(void) // Post: may enable HDD, required for MemInitialize()->MemInitializeIO() { bool temp = false; - InsertFloppyDisks(SLOT5, g_cmdLine.szImageName_drive[SLOT5], temp); + InsertFloppyDisks(SLOT5, g_cmdLine.szImageName_drive[SLOT5], g_cmdLine.driveConnected[SLOT5], temp); //g_cmdLine.szImageName_drive[SLOT5][DRIVE_1] = g_cmdLine.szImageName_drive[SLOT5][DRIVE_2] = NULL; // *Do* insert on a restart (since no way they could have changed) - InsertFloppyDisks(SLOT6, g_cmdLine.szImageName_drive[SLOT6], g_cmdLine.bBoot); + InsertFloppyDisks(SLOT6, g_cmdLine.szImageName_drive[SLOT6], g_cmdLine.driveConnected[SLOT6], g_cmdLine.bBoot); g_cmdLine.szImageName_drive[SLOT6][DRIVE_1] = g_cmdLine.szImageName_drive[SLOT6][DRIVE_2] = NULL; // Don't insert on a restart InsertHardDisks(g_cmdLine.szImageName_harddisk, g_cmdLine.bBoot);