From 21d16d3a0cef3167c4b51df98c9e318568938dfe Mon Sep 17 00:00:00 2001 From: TomCh Date: Sat, 22 Feb 2020 11:38:25 +0000 Subject: [PATCH] Auto-switch DiskII firmware to 13 or 16 sector depending on disk in drive-1 (#734) (PR #761) . The auto-switch is done on each reset, or on inserting a disk at the start-up screen (MODE_LOGO). . The Window's title include '(S6-13)' if DiskII card has 13-sector f/w. . The debugger's 'disk info' cmd will show FW13 or FW16 depending on f/w. --- AppleWinExpress2008.vcproj | 4 ++ resource/Applewin.rc | 3 +- resource/DISK2-13sector.rom | Bin 0 -> 256 bytes resource/resource.h | 3 +- source/Debugger/Debug.cpp | 3 +- source/Disk.cpp | 104 +++++++++++++++++++++++------------- source/Disk.h | 8 +++ source/Disk2CardManager.cpp | 14 +++++ source/Disk2CardManager.h | 1 + source/DiskImage.cpp | 5 ++ source/DiskImage.h | 1 + source/DiskImageHelper.cpp | 4 +- source/DiskImageHelper.h | 12 +++-- source/Frame.cpp | 5 +- source/Memory.cpp | 5 ++ source/Memory.h | 2 + 16 files changed, 126 insertions(+), 48 deletions(-) create mode 100644 resource/DISK2-13sector.rom diff --git a/AppleWinExpress2008.vcproj b/AppleWinExpress2008.vcproj index a4a2b1ff..0fdb2a79 100644 --- a/AppleWinExpress2008.vcproj +++ b/AppleWinExpress2008.vcproj @@ -1181,6 +1181,10 @@ RelativePath=".\resource\Disk2.rom" > + + diff --git a/resource/Applewin.rc b/resource/Applewin.rc index 80a84f8e..8c3c0e25 100644 --- a/resource/Applewin.rc +++ b/resource/Applewin.rc @@ -308,7 +308,8 @@ END // FIRMWARE // -IDR_DISK2_FW FIRMWARE "Disk2.rom" +IDR_DISK2_13SECTOR_FW FIRMWARE "Disk2-13sector.rom" +IDR_DISK2_16SECTOR_FW FIRMWARE "Disk2.rom" IDR_SSC_FW FIRMWARE "SSC.rom" IDR_HDDRVR_FW FIRMWARE "Hddrvr.bin" IDR_PRINTDRVR_FW FIRMWARE "Parallel.rom" diff --git a/resource/DISK2-13sector.rom b/resource/DISK2-13sector.rom new file mode 100644 index 0000000000000000000000000000000000000000..3588f88e32831b4bf748d58748527a1fa473a930 GIT binary patch literal 256 zcmZ3auz+DDbE}O+#|#yl4`0=6Cj2;X^~2j!T{9UtE<96+_`ho}1EU8Q5VUHqT6w`^ zZ{LBvJqPx79oXA>U_rp%h66J+nYmcCSM6;)urf?x#h(s=*FfXcS2DD!wc1K>0M!co z_Pl!GJD72D)rHTmAgrw)I5j5R_gwoy{=&@#%q?1AQLR=RFs*9Sap9fDQQHgqHtbz6 ztHovy$dpJ1jwLo7AZNWp7MZAa;=+5Ff(yL~D;6>AWZ>|!JHzZ{HxuZwjcP!*v)TZa by?9`J;mI+r3-``2FkfKyVPy8v{r?{TM}2(l literal 0 HcmV?d00001 diff --git a/resource/resource.h b/resource/resource.h index d1ff4186..ce0bec36 100644 --- a/resource/resource.h +++ b/resource/resource.h @@ -34,7 +34,6 @@ #define IDD_TFE_SETTINGS_DIALOG 131 #define IDR_PRINTDRVR_FW 132 #define IDD_PROPPAGE_ADVANCED 132 -#define IDR_DISK2_FW 133 #define IDR_SSC_FW 134 #define IDR_MOCKINGBOARD_D_FW 135 #define IDR_MOUSEINTERFACE_FW 136 @@ -48,6 +47,8 @@ #define IDC_CHECK_CONFIRM_REBOOT 146 #define IDR_TK3000_2E_ROM 147 #define IDR_TKCLOCK_FW 148 +#define IDR_DISK2_13SECTOR_FW 149 +#define IDR_DISK2_16SECTOR_FW 150 #define IDC_KEYB_BUFFER_ENABLE 1005 #define IDC_SAVESTATE 1006 #define IDC_SAVESTATE_ON_EXIT 1007 diff --git a/source/Debugger/Debug.cpp b/source/Debugger/Debug.cpp index 4aaeaef4..515a4cdd 100644 --- a/source/Debugger/Debug.cpp +++ b/source/Debugger/Debug.cpp @@ -3768,7 +3768,8 @@ Update_t CmdDisk ( int nArgs) goto _Help; char buffer[200] = ""; - ConsoleBufferPushFormat(buffer, "D%d at T$%s, phase $%s, offset $%X, mask $%02X, extraCycles %.2f, %s", + ConsoleBufferPushFormat(buffer, "FW%2d: D%d at T$%s, phase $%s, offset $%X, mask $%02X, extraCycles %.2f, %s", + diskCard.GetCurrentFirmware(), diskCard.GetCurrentDrive() + 1, diskCard.GetCurrentTrackString().c_str(), diskCard.GetCurrentPhaseString().c_str(), diff --git a/source/Disk.cpp b/source/Disk.cpp index bf94a0ab..159d6911 100644 --- a/source/Disk.cpp +++ b/source/Disk.cpp @@ -64,6 +64,7 @@ Disk2InterfaceCard::Disk2InterfaceCard(void) : m_diskLastCycle = 0; m_diskLastReadLatchCycle = 0; m_enhanceDisk = true; + m_is13SectorFirmware = false; ResetLogicStateSequencer(); @@ -228,33 +229,6 @@ void Disk2InterfaceCard::CheckSpinning(const ULONG uExecutedCycles) //=========================================================================== -Disk_Status_e Disk2InterfaceCard::GetDriveLightStatus(const int drive) -{ - if (IsDriveValid( drive )) - { - FloppyDrive* pDrive = &m_floppyDrive[ drive ]; - - if (pDrive->m_spinning) - { - if (pDrive->m_disk.m_bWriteProtected) - return DISK_STATUS_PROT; - - if (pDrive->m_writelight) - return DISK_STATUS_WRITE; - else - return DISK_STATUS_READ; - } - else - { - return DISK_STATUS_OFF; - } - } - - return DISK_STATUS_OFF; -} - -//=========================================================================== - bool Disk2InterfaceCard::IsDriveValid(const int drive) { return (drive >= 0 && drive < NUM_DRIVES); @@ -595,6 +569,31 @@ const std::string & Disk2InterfaceCard::DiskGetFullPathName(const int drive) //=========================================================================== +Disk_Status_e Disk2InterfaceCard::GetDriveLightStatus(const int drive) +{ + if (IsDriveValid( drive )) + { + FloppyDrive* pDrive = &m_floppyDrive[ drive ]; + + if (pDrive->m_spinning) + { + if (pDrive->m_disk.m_bWriteProtected) + return DISK_STATUS_PROT; + + if (pDrive->m_writelight) + return DISK_STATUS_WRITE; + else + return DISK_STATUS_READ; + } + else + { + return DISK_STATUS_OFF; + } + } + + return DISK_STATUS_OFF; +} + void Disk2InterfaceCard::GetLightStatus(Disk_Status_e *pDisk1Status, Disk_Status_e *pDisk2Status) { if (pDisk1Status) @@ -662,6 +661,9 @@ ImageError_e Disk2InterfaceCard::InsertDisk(const int drive, LPCTSTR pszImageFil { GetImageTitle(pszImageFilename, pFloppy->m_imagename, pFloppy->m_fullname); Video_ResetScreenshotCounter(pFloppy->m_imagename); + + if (g_nAppMode == MODE_LOGO) + InitFirmware(GetCxRomPeripheral()); } else { @@ -1469,6 +1471,9 @@ void Disk2InterfaceCard::Reset(const bool bIsPowerCycle) FrameRefreshStatus(DRAW_LEDS, false); } + + InitFirmware(GetCxRomPeripheral()); + FrameRefreshStatus(DRAW_TITLE, false); } void Disk2InterfaceCard::ResetSwitches(void) @@ -1697,28 +1702,51 @@ bool Disk2InterfaceCard::DriveSwap(void) //=========================================================================== -// TODO: LoadRom_Disk_Floppy() -void Disk2InterfaceCard::Initialize(LPBYTE pCxRomPeripheral, UINT uSlot) +bool Disk2InterfaceCard::GetFirmware(LPCSTR lpName, BYTE* pDst) { - const UINT DISK2_FW_SIZE = APPLE_SLOT_SIZE; - - HRSRC hResInfo = FindResource(NULL, MAKEINTRESOURCE(IDR_DISK2_FW), "FIRMWARE"); + HRSRC hResInfo = FindResource(NULL, lpName, "FIRMWARE"); if(hResInfo == NULL) - return; + return false; DWORD dwResSize = SizeofResource(NULL, hResInfo); if(dwResSize != DISK2_FW_SIZE) - return; + return false; HGLOBAL hResData = LoadResource(NULL, hResInfo); if(hResData == NULL) - return; + return false; BYTE* pData = (BYTE*) LockResource(hResData); // NB. Don't need to unlock resource - if(pData == NULL) + if (!pData) + return false; + + memcpy(pDst, pData, DISK2_FW_SIZE); + return true; +} + +void Disk2InterfaceCard::InitFirmware(LPBYTE pCxRomPeripheral) +{ + if (pCxRomPeripheral == NULL) return; - memcpy(pCxRomPeripheral + uSlot*APPLE_SLOT_SIZE, pData, DISK2_FW_SIZE); + ImageInfo* pImage = m_floppyDrive[DRIVE_1].m_disk.m_imagehandle; + + m_is13SectorFirmware = ImageIsBootSectorFormatSector13(pImage); + + if (m_is13SectorFirmware) + memcpy(pCxRomPeripheral + m_slot*APPLE_SLOT_SIZE, m_13SectorFirmware, DISK2_FW_SIZE); + else + memcpy(pCxRomPeripheral + m_slot*APPLE_SLOT_SIZE, m_16SectorFirmware, DISK2_FW_SIZE); +} + +// TODO: LoadRom_Disk_Floppy() +void Disk2InterfaceCard::Initialize(LPBYTE pCxRomPeripheral, UINT uSlot) +{ + bool res = GetFirmware(MAKEINTRESOURCE(IDR_DISK2_13SECTOR_FW), m_13SectorFirmware); + _ASSERT(res); + + res = GetFirmware(MAKEINTRESOURCE(IDR_DISK2_16SECTOR_FW), m_16SectorFirmware); + _ASSERT(res); // Note: We used to disable the track stepping delay in the Disk II controller firmware by // patching $C64C with $A9,$00,$EA. Now not doing this since: @@ -1730,6 +1758,8 @@ void Disk2InterfaceCard::Initialize(LPBYTE pCxRomPeripheral, UINT uSlot) RegisterIoHandler(uSlot, &Disk2InterfaceCard::IORead, &Disk2InterfaceCard::IOWrite, NULL, NULL, this, NULL); m_slot = uSlot; + + InitFirmware(pCxRomPeripheral); } //=========================================================================== diff --git a/source/Disk.h b/source/Disk.h index 23640b9f..f61f8bf7 100644 --- a/source/Disk.h +++ b/source/Disk.h @@ -144,6 +144,7 @@ public: void NotifyInvalidImage(const int drive, LPCTSTR pszImageFilename, const ImageError_e Error); bool GetProtect(const int drive); void SetProtect(const int drive, const bool bWriteProtect); + UINT GetCurrentFirmware(void) { return m_is13SectorFirmware ? 13 : 16; } int GetCurrentDrive(void); int GetCurrentTrack(void); float GetCurrentPhase(void); @@ -195,6 +196,8 @@ private: void SetSequencerFunction(WORD addr); void DumpSectorWOZ(FloppyDisk floppy); void DumpTrackWOZ(FloppyDisk floppy); + bool GetFirmware(LPCSTR lpName, BYTE* pDst); + void InitFirmware(LPBYTE pCxRomPeripheral); void SaveSnapshotFloppy(YamlSaveHelper& yamlSaveHelper, UINT unit); void SaveSnapshotDriveUnit(YamlSaveHelper& yamlSaveHelper, UINT unit); @@ -218,6 +221,11 @@ private: // + static const UINT DISK2_FW_SIZE = 256; + BYTE m_13SectorFirmware[DISK2_FW_SIZE]; + BYTE m_16SectorFirmware[DISK2_FW_SIZE]; + bool m_is13SectorFirmware; + WORD m_currDrive; FloppyDrive m_floppyDrive[NUM_DRIVES]; BYTE m_floppyLatch; diff --git a/source/Disk2CardManager.cpp b/source/Disk2CardManager.cpp index 4a9eb2af..06ba994c 100644 --- a/source/Disk2CardManager.cpp +++ b/source/Disk2CardManager.cpp @@ -118,3 +118,17 @@ void Disk2CardManager::Destroy(void) } } } + +bool Disk2CardManager::IsAnyFirmware13Sector(void) +{ + for (UINT i = 0; i < NUM_SLOTS; i++) + { + if (g_CardMgr.QuerySlot(i) == CT_Disk2) + { + // If any Disk2 card has 13-sector firmware then return true + if (dynamic_cast(g_CardMgr.GetRef(i)).GetCurrentFirmware() == 13) + return true; + } + } + return false; +} diff --git a/source/Disk2CardManager.h b/source/Disk2CardManager.h index 5f8769a0..85bf193d 100644 --- a/source/Disk2CardManager.h +++ b/source/Disk2CardManager.h @@ -13,4 +13,5 @@ public: void SetEnhanceDisk(bool enhanceDisk); void LoadLastDiskImage(void); void Destroy(void); + bool IsAnyFirmware13Sector(void); }; diff --git a/source/DiskImage.cpp b/source/DiskImage.cpp index 976c9853..c853c591 100644 --- a/source/DiskImage.cpp +++ b/source/DiskImage.cpp @@ -246,6 +246,11 @@ BYTE ImageGetOptimalBitTiming(ImageInfo* const pImageInfo) return pImageInfo ? pImageInfo->optimalBitTiming : 32; } +bool ImageIsBootSectorFormatSector13(ImageInfo* const pImageInfo) +{ + return pImageInfo ? pImageInfo->bootSectorFormat == CWOZHelper::bootSector13 : false; +} + UINT ImagePhaseToTrack(ImageInfo* const pImageInfo, const float phase, const bool limit/*=true*/) { if (!pImageInfo) diff --git a/source/DiskImage.h b/source/DiskImage.h index af6faf86..c7b69449 100644 --- a/source/DiskImage.h +++ b/source/DiskImage.h @@ -84,5 +84,6 @@ bool ImageIsWOZ(ImageInfo* const pImageInfo); BYTE ImageGetOptimalBitTiming(ImageInfo* const pImageInfo); UINT ImagePhaseToTrack(ImageInfo* const pImageInfo, const float phase, const bool limit=true); UINT ImageGetMaxNibblesPerTrack(ImageInfo* const pImageInfo); +bool ImageIsBootSectorFormatSector13(ImageInfo* const pImageInfo); void GetImageTitle(LPCTSTR pPathname, std::string & pImageName, std::string & pFullName); diff --git a/source/DiskImageHelper.cpp b/source/DiskImageHelper.cpp index 50298b68..bdf18474 100644 --- a/source/DiskImageHelper.cpp +++ b/source/DiskImageHelper.cpp @@ -57,6 +57,7 @@ ImageInfo::ImageInfo() pImageBuffer = NULL; pWOZTrackMap = NULL; optimalBitTiming = 0; + bootSectorFormat = CWOZHelper::bootUnknown; maxNibblesPerTrack = 0; } @@ -1938,6 +1939,7 @@ bool CImageHelperBase::WOZUpdateInfo(ImageInfo* pImageInfo, DWORD& dwOffset) pImageInfo->optimalBitTiming = m_WOZHelper.GetOptimalBitTiming(); pImageInfo->maxNibblesPerTrack = m_WOZHelper.GetMaxNibblesPerTrack(); + pImageInfo->bootSectorFormat = m_WOZHelper.GetBootSectorFormat(); m_WOZHelper.InvalidateInfo(); return true; @@ -2196,7 +2198,7 @@ BYTE* CWOZHelper::CreateEmptyDisk(DWORD& size) memset(&pWOZ->info.v1.creator[0], ' ', sizeof(pWOZ->info.v1.creator)); memcpy(&pWOZ->info.v1.creator[0], creator.c_str(), creator.size()); // don't include null pWOZ->info.diskSides = 1; - pWOZ->info.bootSectorFormat = InfoChunkv2::bootUnknown; // could be INIT'd to 13 or 16 sector + pWOZ->info.bootSectorFormat = bootUnknown; // could be INIT'd to 13 or 16 sector pWOZ->info.optimalBitTiming = InfoChunkv2::optimalBitTiming5_25; pWOZ->info.compatibleHardware = 0; // unknown pWOZ->info.requiredRAM = 0; // unknown diff --git a/source/DiskImageHelper.h b/source/DiskImageHelper.h index b467dec2..a5271843 100644 --- a/source/DiskImageHelper.h +++ b/source/DiskImageHelper.h @@ -37,6 +37,7 @@ struct ImageInfo BYTE* pImageBuffer; BYTE* pWOZTrackMap; // WOZ only (points into pImageBuffer) BYTE optimalBitTiming; // WOZ only + BYTE bootSectorFormat; // WOZ only UINT maxNibblesPerTrack; ImageInfo(); @@ -210,6 +211,7 @@ public: bool IsWriteProtected(void) { return m_pInfo->v1.writeProtected == 1; } BYTE GetOptimalBitTiming(void) { return (m_pInfo->v1.version >= 2) ? m_pInfo->optimalBitTiming : InfoChunkv2::optimalBitTiming5_25; } UINT GetMaxNibblesPerTrack(void) { return (m_pInfo->v1.version >= 2) ? m_pInfo->largestTrack*CWOZHelper::BLOCK_SIZE : WOZ1_TRACK_SIZE; } + BYTE GetBootSectorFormat(void) { return (m_pInfo->v1.version >= 2) ? m_pInfo->bootSectorFormat : bootUnknown; } void InvalidateInfo(void) { m_pInfo = NULL; } BYTE* CreateEmptyDisk(DWORD& size); #if _DEBUG @@ -236,6 +238,11 @@ public: static const BYTE TMAP_TRACK_EMPTY = 0xFF; static const UINT16 TRK_DEFAULT_BLOCK_COUNT_5_25 = 13; // $D is default for TRKv2.blockCount + static const BYTE bootUnknown = 0; + static const BYTE bootSector16 = 1; + static const BYTE bootSector13 = 2; + static const BYTE bootSectorBoth = 3; + struct WOZChunkHdr { UINT32 id; @@ -303,11 +310,6 @@ private: UINT16 requiredRAM; // in K (1024 bytes) UINT16 largestTrack; // in blocks (512 bytes) - static const BYTE bootUnknown = 0; - static const BYTE bootSector16 = 1; - static const BYTE bootSector13 = 2; - static const BYTE bootSectorBoth = 3; - static const BYTE optimalBitTiming5_25 = 32; }; diff --git a/source/Frame.cpp b/source/Frame.cpp index 497af9a7..b8e9caf6 100644 --- a/source/Frame.cpp +++ b/source/Frame.cpp @@ -274,11 +274,12 @@ static void GetAppleWindowTitle() g_pAppTitle += " - "; if( IsVideoStyle(VS_HALF_SCANLINES) ) - { g_pAppTitle += " 50% "; - } g_pAppTitle += g_apVideoModeDesc[ g_eVideoType ]; + if (g_CardMgr.GetDisk2CardMgr().IsAnyFirmware13Sector()) + g_pAppTitle += " (S6-13) "; + if (g_hCustomRomF8 != INVALID_HANDLE_VALUE) g_pAppTitle += TEXT(" (custom rom)"); else if (sg_PropertySheet.GetTheFreezesF8Rom() && IS_APPLE2) diff --git a/source/Memory.cpp b/source/Memory.cpp index 591d9b62..4d04cc29 100644 --- a/source/Memory.cpp +++ b/source/Memory.cpp @@ -372,6 +372,11 @@ LanguageCardUnit* GetLanguageCard(void) return g_pLanguageCard; } +LPBYTE GetCxRomPeripheral(void) +{ + return pCxRomPeripheral; // Can be NULL if at MODE_LOGO +} + //============================================================================= static BYTE __stdcall IORead_C00x(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nExecutedCycles) diff --git a/source/Memory.h b/source/Memory.h index 8e2a4a58..5de37bb5 100644 --- a/source/Memory.h +++ b/source/Memory.h @@ -101,3 +101,5 @@ UINT GetRamWorksActiveBank(void); void SetSaturnMemorySize(UINT banks); void SetMemMainLanguageCard(LPBYTE ptr, bool bMemMain=false); class LanguageCardUnit* GetLanguageCard(void); + +LPBYTE GetCxRomPeripheral(void);