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.
This commit is contained in:
TomCh 2020-02-22 11:38:25 +00:00 committed by GitHub
parent ac603dcd10
commit 21d16d3a0c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 126 additions and 48 deletions

View File

@ -1181,6 +1181,10 @@
RelativePath=".\resource\Disk2.rom" RelativePath=".\resource\Disk2.rom"
> >
</File> </File>
<File
RelativePath=".\resource\Disk2-13sector.rom"
>
</File>
<File <File
RelativePath="RESOURCE\DISKOFF.BMP" RelativePath="RESOURCE\DISKOFF.BMP"
> >

View File

@ -308,7 +308,8 @@ END
// FIRMWARE // 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_SSC_FW FIRMWARE "SSC.rom"
IDR_HDDRVR_FW FIRMWARE "Hddrvr.bin" IDR_HDDRVR_FW FIRMWARE "Hddrvr.bin"
IDR_PRINTDRVR_FW FIRMWARE "Parallel.rom" IDR_PRINTDRVR_FW FIRMWARE "Parallel.rom"

BIN
resource/DISK2-13sector.rom Normal file

Binary file not shown.

View File

@ -34,7 +34,6 @@
#define IDD_TFE_SETTINGS_DIALOG 131 #define IDD_TFE_SETTINGS_DIALOG 131
#define IDR_PRINTDRVR_FW 132 #define IDR_PRINTDRVR_FW 132
#define IDD_PROPPAGE_ADVANCED 132 #define IDD_PROPPAGE_ADVANCED 132
#define IDR_DISK2_FW 133
#define IDR_SSC_FW 134 #define IDR_SSC_FW 134
#define IDR_MOCKINGBOARD_D_FW 135 #define IDR_MOCKINGBOARD_D_FW 135
#define IDR_MOUSEINTERFACE_FW 136 #define IDR_MOUSEINTERFACE_FW 136
@ -48,6 +47,8 @@
#define IDC_CHECK_CONFIRM_REBOOT 146 #define IDC_CHECK_CONFIRM_REBOOT 146
#define IDR_TK3000_2E_ROM 147 #define IDR_TK3000_2E_ROM 147
#define IDR_TKCLOCK_FW 148 #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_KEYB_BUFFER_ENABLE 1005
#define IDC_SAVESTATE 1006 #define IDC_SAVESTATE 1006
#define IDC_SAVESTATE_ON_EXIT 1007 #define IDC_SAVESTATE_ON_EXIT 1007

View File

@ -3768,7 +3768,8 @@ Update_t CmdDisk ( int nArgs)
goto _Help; goto _Help;
char buffer[200] = ""; 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.GetCurrentDrive() + 1,
diskCard.GetCurrentTrackString().c_str(), diskCard.GetCurrentTrackString().c_str(),
diskCard.GetCurrentPhaseString().c_str(), diskCard.GetCurrentPhaseString().c_str(),

View File

@ -64,6 +64,7 @@ Disk2InterfaceCard::Disk2InterfaceCard(void) :
m_diskLastCycle = 0; m_diskLastCycle = 0;
m_diskLastReadLatchCycle = 0; m_diskLastReadLatchCycle = 0;
m_enhanceDisk = true; m_enhanceDisk = true;
m_is13SectorFirmware = false;
ResetLogicStateSequencer(); 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) bool Disk2InterfaceCard::IsDriveValid(const int drive)
{ {
return (drive >= 0 && drive < NUM_DRIVES); 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) void Disk2InterfaceCard::GetLightStatus(Disk_Status_e *pDisk1Status, Disk_Status_e *pDisk2Status)
{ {
if (pDisk1Status) if (pDisk1Status)
@ -662,6 +661,9 @@ ImageError_e Disk2InterfaceCard::InsertDisk(const int drive, LPCTSTR pszImageFil
{ {
GetImageTitle(pszImageFilename, pFloppy->m_imagename, pFloppy->m_fullname); GetImageTitle(pszImageFilename, pFloppy->m_imagename, pFloppy->m_fullname);
Video_ResetScreenshotCounter(pFloppy->m_imagename); Video_ResetScreenshotCounter(pFloppy->m_imagename);
if (g_nAppMode == MODE_LOGO)
InitFirmware(GetCxRomPeripheral());
} }
else else
{ {
@ -1469,6 +1471,9 @@ void Disk2InterfaceCard::Reset(const bool bIsPowerCycle)
FrameRefreshStatus(DRAW_LEDS, false); FrameRefreshStatus(DRAW_LEDS, false);
} }
InitFirmware(GetCxRomPeripheral());
FrameRefreshStatus(DRAW_TITLE, false);
} }
void Disk2InterfaceCard::ResetSwitches(void) void Disk2InterfaceCard::ResetSwitches(void)
@ -1697,28 +1702,51 @@ bool Disk2InterfaceCard::DriveSwap(void)
//=========================================================================== //===========================================================================
// TODO: LoadRom_Disk_Floppy() bool Disk2InterfaceCard::GetFirmware(LPCSTR lpName, BYTE* pDst)
void Disk2InterfaceCard::Initialize(LPBYTE pCxRomPeripheral, UINT uSlot)
{ {
const UINT DISK2_FW_SIZE = APPLE_SLOT_SIZE; HRSRC hResInfo = FindResource(NULL, lpName, "FIRMWARE");
HRSRC hResInfo = FindResource(NULL, MAKEINTRESOURCE(IDR_DISK2_FW), "FIRMWARE");
if(hResInfo == NULL) if(hResInfo == NULL)
return; return false;
DWORD dwResSize = SizeofResource(NULL, hResInfo); DWORD dwResSize = SizeofResource(NULL, hResInfo);
if(dwResSize != DISK2_FW_SIZE) if(dwResSize != DISK2_FW_SIZE)
return; return false;
HGLOBAL hResData = LoadResource(NULL, hResInfo); HGLOBAL hResData = LoadResource(NULL, hResInfo);
if(hResData == NULL) if(hResData == NULL)
return; return false;
BYTE* pData = (BYTE*) LockResource(hResData); // NB. Don't need to unlock resource 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; 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 // 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: // 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); RegisterIoHandler(uSlot, &Disk2InterfaceCard::IORead, &Disk2InterfaceCard::IOWrite, NULL, NULL, this, NULL);
m_slot = uSlot; m_slot = uSlot;
InitFirmware(pCxRomPeripheral);
} }
//=========================================================================== //===========================================================================

View File

@ -144,6 +144,7 @@ public:
void NotifyInvalidImage(const int drive, LPCTSTR pszImageFilename, const ImageError_e Error); void NotifyInvalidImage(const int drive, LPCTSTR pszImageFilename, const ImageError_e Error);
bool GetProtect(const int drive); bool GetProtect(const int drive);
void SetProtect(const int drive, const bool bWriteProtect); void SetProtect(const int drive, const bool bWriteProtect);
UINT GetCurrentFirmware(void) { return m_is13SectorFirmware ? 13 : 16; }
int GetCurrentDrive(void); int GetCurrentDrive(void);
int GetCurrentTrack(void); int GetCurrentTrack(void);
float GetCurrentPhase(void); float GetCurrentPhase(void);
@ -195,6 +196,8 @@ private:
void SetSequencerFunction(WORD addr); void SetSequencerFunction(WORD addr);
void DumpSectorWOZ(FloppyDisk floppy); void DumpSectorWOZ(FloppyDisk floppy);
void DumpTrackWOZ(FloppyDisk floppy); void DumpTrackWOZ(FloppyDisk floppy);
bool GetFirmware(LPCSTR lpName, BYTE* pDst);
void InitFirmware(LPBYTE pCxRomPeripheral);
void SaveSnapshotFloppy(YamlSaveHelper& yamlSaveHelper, UINT unit); void SaveSnapshotFloppy(YamlSaveHelper& yamlSaveHelper, UINT unit);
void SaveSnapshotDriveUnit(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; WORD m_currDrive;
FloppyDrive m_floppyDrive[NUM_DRIVES]; FloppyDrive m_floppyDrive[NUM_DRIVES];
BYTE m_floppyLatch; BYTE m_floppyLatch;

View File

@ -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<Disk2InterfaceCard&>(g_CardMgr.GetRef(i)).GetCurrentFirmware() == 13)
return true;
}
}
return false;
}

View File

@ -13,4 +13,5 @@ public:
void SetEnhanceDisk(bool enhanceDisk); void SetEnhanceDisk(bool enhanceDisk);
void LoadLastDiskImage(void); void LoadLastDiskImage(void);
void Destroy(void); void Destroy(void);
bool IsAnyFirmware13Sector(void);
}; };

View File

@ -246,6 +246,11 @@ BYTE ImageGetOptimalBitTiming(ImageInfo* const pImageInfo)
return pImageInfo ? pImageInfo->optimalBitTiming : 32; 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*/) UINT ImagePhaseToTrack(ImageInfo* const pImageInfo, const float phase, const bool limit/*=true*/)
{ {
if (!pImageInfo) if (!pImageInfo)

View File

@ -84,5 +84,6 @@ bool ImageIsWOZ(ImageInfo* const pImageInfo);
BYTE ImageGetOptimalBitTiming(ImageInfo* const pImageInfo); BYTE ImageGetOptimalBitTiming(ImageInfo* const pImageInfo);
UINT ImagePhaseToTrack(ImageInfo* const pImageInfo, const float phase, const bool limit=true); UINT ImagePhaseToTrack(ImageInfo* const pImageInfo, const float phase, const bool limit=true);
UINT ImageGetMaxNibblesPerTrack(ImageInfo* const pImageInfo); UINT ImageGetMaxNibblesPerTrack(ImageInfo* const pImageInfo);
bool ImageIsBootSectorFormatSector13(ImageInfo* const pImageInfo);
void GetImageTitle(LPCTSTR pPathname, std::string & pImageName, std::string & pFullName); void GetImageTitle(LPCTSTR pPathname, std::string & pImageName, std::string & pFullName);

View File

@ -57,6 +57,7 @@ ImageInfo::ImageInfo()
pImageBuffer = NULL; pImageBuffer = NULL;
pWOZTrackMap = NULL; pWOZTrackMap = NULL;
optimalBitTiming = 0; optimalBitTiming = 0;
bootSectorFormat = CWOZHelper::bootUnknown;
maxNibblesPerTrack = 0; maxNibblesPerTrack = 0;
} }
@ -1938,6 +1939,7 @@ bool CImageHelperBase::WOZUpdateInfo(ImageInfo* pImageInfo, DWORD& dwOffset)
pImageInfo->optimalBitTiming = m_WOZHelper.GetOptimalBitTiming(); pImageInfo->optimalBitTiming = m_WOZHelper.GetOptimalBitTiming();
pImageInfo->maxNibblesPerTrack = m_WOZHelper.GetMaxNibblesPerTrack(); pImageInfo->maxNibblesPerTrack = m_WOZHelper.GetMaxNibblesPerTrack();
pImageInfo->bootSectorFormat = m_WOZHelper.GetBootSectorFormat();
m_WOZHelper.InvalidateInfo(); m_WOZHelper.InvalidateInfo();
return true; return true;
@ -2196,7 +2198,7 @@ BYTE* CWOZHelper::CreateEmptyDisk(DWORD& size)
memset(&pWOZ->info.v1.creator[0], ' ', sizeof(pWOZ->info.v1.creator)); 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 memcpy(&pWOZ->info.v1.creator[0], creator.c_str(), creator.size()); // don't include null
pWOZ->info.diskSides = 1; 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.optimalBitTiming = InfoChunkv2::optimalBitTiming5_25;
pWOZ->info.compatibleHardware = 0; // unknown pWOZ->info.compatibleHardware = 0; // unknown
pWOZ->info.requiredRAM = 0; // unknown pWOZ->info.requiredRAM = 0; // unknown

View File

@ -37,6 +37,7 @@ struct ImageInfo
BYTE* pImageBuffer; BYTE* pImageBuffer;
BYTE* pWOZTrackMap; // WOZ only (points into pImageBuffer) BYTE* pWOZTrackMap; // WOZ only (points into pImageBuffer)
BYTE optimalBitTiming; // WOZ only BYTE optimalBitTiming; // WOZ only
BYTE bootSectorFormat; // WOZ only
UINT maxNibblesPerTrack; UINT maxNibblesPerTrack;
ImageInfo(); ImageInfo();
@ -210,6 +211,7 @@ public:
bool IsWriteProtected(void) { return m_pInfo->v1.writeProtected == 1; } bool IsWriteProtected(void) { return m_pInfo->v1.writeProtected == 1; }
BYTE GetOptimalBitTiming(void) { return (m_pInfo->v1.version >= 2) ? m_pInfo->optimalBitTiming : InfoChunkv2::optimalBitTiming5_25; } 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; } 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; } void InvalidateInfo(void) { m_pInfo = NULL; }
BYTE* CreateEmptyDisk(DWORD& size); BYTE* CreateEmptyDisk(DWORD& size);
#if _DEBUG #if _DEBUG
@ -236,6 +238,11 @@ public:
static const BYTE TMAP_TRACK_EMPTY = 0xFF; 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 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 struct WOZChunkHdr
{ {
UINT32 id; UINT32 id;
@ -303,11 +310,6 @@ private:
UINT16 requiredRAM; // in K (1024 bytes) UINT16 requiredRAM; // in K (1024 bytes)
UINT16 largestTrack; // in blocks (512 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; static const BYTE optimalBitTiming5_25 = 32;
}; };

View File

@ -274,11 +274,12 @@ static void GetAppleWindowTitle()
g_pAppTitle += " - "; g_pAppTitle += " - ";
if( IsVideoStyle(VS_HALF_SCANLINES) ) if( IsVideoStyle(VS_HALF_SCANLINES) )
{
g_pAppTitle += " 50% "; g_pAppTitle += " 50% ";
}
g_pAppTitle += g_apVideoModeDesc[ g_eVideoType ]; g_pAppTitle += g_apVideoModeDesc[ g_eVideoType ];
if (g_CardMgr.GetDisk2CardMgr().IsAnyFirmware13Sector())
g_pAppTitle += " (S6-13) ";
if (g_hCustomRomF8 != INVALID_HANDLE_VALUE) if (g_hCustomRomF8 != INVALID_HANDLE_VALUE)
g_pAppTitle += TEXT(" (custom rom)"); g_pAppTitle += TEXT(" (custom rom)");
else if (sg_PropertySheet.GetTheFreezesF8Rom() && IS_APPLE2) else if (sg_PropertySheet.GetTheFreezesF8Rom() && IS_APPLE2)

View File

@ -372,6 +372,11 @@ LanguageCardUnit* GetLanguageCard(void)
return g_pLanguageCard; 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) static BYTE __stdcall IORead_C00x(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nExecutedCycles)

View File

@ -101,3 +101,5 @@ UINT GetRamWorksActiveBank(void);
void SetSaturnMemorySize(UINT banks); void SetSaturnMemorySize(UINT banks);
void SetMemMainLanguageCard(LPBYTE ptr, bool bMemMain=false); void SetMemMainLanguageCard(LPBYTE ptr, bool bMemMain=false);
class LanguageCardUnit* GetLanguageCard(void); class LanguageCardUnit* GetLanguageCard(void);
LPBYTE GetCxRomPeripheral(void);