From 54ebde9fec48c3b08aa781fbee74450b3b3a6544 Mon Sep 17 00:00:00 2001 From: tomcw Date: Fri, 15 Sep 2023 21:17:34 +0100 Subject: [PATCH] Read() pass 'Extra' struct with isFluxTrack --- source/DiskImage.cpp | 5 ++++- source/DiskImageHelper.cpp | 24 ++++++++++++------------ source/DiskImageHelper.h | 15 +++++++++++++-- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/source/DiskImage.cpp b/source/DiskImage.cpp index 7851f53b..9fa215a4 100644 --- a/source/DiskImage.cpp +++ b/source/DiskImage.cpp @@ -127,7 +127,10 @@ void ImageReadTrack( ImageInfo* const pImageInfo, if (pImageInfo->pImageType->AllowRW()) { - pImageInfo->pImageType->Read(pImageInfo, phase, pTrackImageBuffer, pNibbles, pBitCount, enhanceDisk); + Extra extra; + extra.enhanceDisk = enhanceDisk; + extra.isFluxTrack = false; + pImageInfo->pImageType->Read(pImageInfo, phase, pTrackImageBuffer, pNibbles, pBitCount, extra); } else { diff --git a/source/DiskImageHelper.cpp b/source/DiskImageHelper.cpp index 5b60918d..04b80059 100644 --- a/source/DiskImageHelper.cpp +++ b/source/DiskImageHelper.cpp @@ -658,12 +658,12 @@ public: return ePossibleMatch; } - virtual void Read(ImageInfo* pImageInfo, const float phase, LPBYTE pTrackImageBuffer, int* pNibbles, UINT* pBitCount, bool enhanceDisk) + virtual void Read(ImageInfo* pImageInfo, const float phase, LPBYTE pTrackImageBuffer, int* pNibbles, UINT* pBitCount, Extra& extra) { const UINT track = PhaseToTrack(phase); ReadTrack(pImageInfo, track, m_pWorkBuffer, TRACK_DENIBBLIZED_SIZE); *pNibbles = NibblizeTrack(pTrackImageBuffer, eDOSOrder, track); - if (!enhanceDisk) + if (!extra.enhanceDisk) SkewTrack(track, *pNibbles, pTrackImageBuffer); } @@ -726,12 +726,12 @@ public: return ePossibleMatch; } - virtual void Read(ImageInfo* pImageInfo, const float phase, LPBYTE pTrackImageBuffer, int* pNibbles, UINT* pBitCount, bool enhanceDisk) + virtual void Read(ImageInfo* pImageInfo, const float phase, LPBYTE pTrackImageBuffer, int* pNibbles, UINT* pBitCount, Extra& extra) { const UINT track = PhaseToTrack(phase); ReadTrack(pImageInfo, track, m_pWorkBuffer, TRACK_DENIBBLIZED_SIZE); *pNibbles = NibblizeTrack(pTrackImageBuffer, eProDOSOrder, track); - if (!enhanceDisk) + if (!extra.enhanceDisk) SkewTrack(track, *pNibbles, pTrackImageBuffer); } @@ -792,7 +792,7 @@ public: return eMatch; } - virtual void Read(ImageInfo* pImageInfo, const float phase, LPBYTE pTrackImageBuffer, int* pNibbles, UINT* pBitCount, bool enhanceDisk) + virtual void Read(ImageInfo* pImageInfo, const float phase, LPBYTE pTrackImageBuffer, int* pNibbles, UINT* pBitCount, Extra& extra) { const UINT track = PhaseToTrack(phase); ReadTrack(pImageInfo, track, pTrackImageBuffer, NIB1_TRACK_SIZE); @@ -834,7 +834,7 @@ public: return eMatch; } - virtual void Read(ImageInfo* pImageInfo, const float phase, LPBYTE pTrackImageBuffer, int* pNibbles, UINT* pBitCount, bool enhanceDisk) + virtual void Read(ImageInfo* pImageInfo, const float phase, LPBYTE pTrackImageBuffer, int* pNibbles, UINT* pBitCount, Extra& extra) { const UINT track = PhaseToTrack(phase); ReadTrack(pImageInfo, track, pTrackImageBuffer, NIB2_TRACK_SIZE); @@ -912,7 +912,7 @@ public: return eMatch; } - virtual void Read(ImageInfo* pImageInfo, const float phase, LPBYTE pTrackImageBuffer, int* pNibbles, UINT* pBitCount, bool enhanceDisk) + virtual void Read(ImageInfo* pImageInfo, const float phase, LPBYTE pTrackImageBuffer, int* pNibbles, UINT* pBitCount, Extra& extra) { UINT track = PhaseToTrack(phase); @@ -1147,7 +1147,7 @@ public: return eMatch; } - virtual void Read(ImageInfo* pImageInfo, const float phase, LPBYTE pTrackImageBuffer, int* pNibbles, UINT* pBitCount, bool enhanceDisk) + virtual void Read(ImageInfo* pImageInfo, const float phase, LPBYTE pTrackImageBuffer, int* pNibbles, UINT* pBitCount, Extra& extra) { BYTE* pTrackMap = ((CWOZHelper::Tmap*)pImageInfo->pWOZTrackMap)->tmap; @@ -1268,22 +1268,22 @@ public: return eMatch; } - virtual void Read(ImageInfo* pImageInfo, const float phase, LPBYTE pTrackImageBuffer, int* pNibbles, UINT* pBitCount, bool enhanceDisk) + virtual void Read(ImageInfo* pImageInfo, const float phase, LPBYTE pTrackImageBuffer, int* pNibbles, UINT* pBitCount, Extra& extra) { BYTE indexFromTMAP = CWOZHelper::TMAP_TRACK_EMPTY; - bool isFluxTrack = false; if (pImageInfo->pWOZTrackMapFlux) { BYTE* pTrackMapFlux = ((CWOZHelper::Tmap*)pImageInfo->pWOZTrackMapFlux)->tmap; indexFromTMAP = pTrackMapFlux[(BYTE)(phase * 2)]; - isFluxTrack = (indexFromTMAP != CWOZHelper::TMAP_TRACK_EMPTY); + extra.isFluxTrack = (indexFromTMAP != CWOZHelper::TMAP_TRACK_EMPTY); } if (indexFromTMAP == CWOZHelper::TMAP_TRACK_EMPTY) { BYTE* pTrackMap = ((CWOZHelper::Tmap*)pImageInfo->pWOZTrackMap)->tmap; indexFromTMAP = pTrackMap[(BYTE)(phase * 2)]; + extra.isFluxTrack = false; } if (indexFromTMAP == CWOZHelper::TMAP_TRACK_EMPTY) @@ -1292,7 +1292,7 @@ public: CWOZHelper::TRKv2* pTRKS = (CWOZHelper::TRKv2*) &pImageInfo->pImageBuffer[pImageInfo->uOffset]; CWOZHelper::TRKv2* pTRK = &pTRKS[indexFromTMAP]; - if (isFluxTrack) + if (extra.isFluxTrack) { *pBitCount = 0; // NB. use as a "flag" to callee that this is flux data *pNibbles = pTRK->bitCount; // byte count of flux data diff --git a/source/DiskImageHelper.h b/source/DiskImageHelper.h index 0161e281..5a059ebd 100644 --- a/source/DiskImageHelper.h +++ b/source/DiskImageHelper.h @@ -54,6 +54,12 @@ struct ImageInfo #define DEFAULT_VOLUME_NUMBER 254 +struct Extra +{ + bool enhanceDisk; + bool isFluxTrack; +}; + class CImageBase { public: @@ -62,7 +68,7 @@ public: virtual bool Boot(ImageInfo* pImageInfo) { return false; } virtual eDetectResult Detect(const LPBYTE pImage, const DWORD dwImageSize, const TCHAR* pszExt) = 0; - virtual void Read(ImageInfo* pImageInfo, const float phase, LPBYTE pTrackImageBuffer, int* pNibbles, UINT* pBitCount, bool enhanceDisk) { } + virtual void Read(ImageInfo* pImageInfo, const float phase, LPBYTE pTrackImageBuffer, int* pNibbles, UINT* pBitCount, Extra& extra) { } virtual bool Read(ImageInfo* pImageInfo, UINT nBlock, LPBYTE pBlockBuffer) { return false; } virtual void Write(ImageInfo* pImageInfo, const float phase, LPBYTE pTrackImageBuffer, int nNibbles) { } virtual bool Write(ImageInfo* pImageInfo, UINT nBlock, LPBYTE pBlockBuffer) { return false; } @@ -212,7 +218,12 @@ public: eDetectResult ProcessChunks(ImageInfo* pImageInfo, DWORD& dwOffset); bool IsWriteProtected(void) { return m_pInfo->v2.v1.writeProtected == 1; } BYTE GetOptimalBitTiming(void) { return (m_pInfo->v2.v1.version >= 2) ? m_pInfo->v2.optimalBitTiming : InfoChunkv2::optimalBitTiming5_25; } - UINT GetMaxNibblesPerTrack(void) { return (m_pInfo->v2.v1.version >= 2) ? max(m_pInfo->largestFluxTrack,m_pInfo->v2.largestTrack)*CWOZHelper::BLOCK_SIZE : WOZ1_TRACK_SIZE; } + UINT GetMaxNibblesPerTrack(void) + { + return (m_pInfo->v2.v1.version >= 3) ? max(m_pInfo->largestFluxTrack, m_pInfo->v2.largestTrack) * CWOZHelper::BLOCK_SIZE + : (m_pInfo->v2.v1.version == 2) ? m_pInfo->v2.largestTrack * CWOZHelper::BLOCK_SIZE + : WOZ1_TRACK_SIZE; + } BYTE GetBootSectorFormat(void) { return (m_pInfo->v2.v1.version >= 2) ? m_pInfo->v2.bootSectorFormat : bootUnknown; } void InvalidateInfo(void) { m_pInfo = NULL; } BYTE* CreateEmptyDisk(DWORD& size);