Read() pass 'Extra' struct with isFluxTrack

This commit is contained in:
tomcw 2023-09-15 21:17:34 +01:00
parent 9686a6e3ae
commit 54ebde9fec
3 changed files with 29 additions and 15 deletions

View File

@ -127,7 +127,10 @@ void ImageReadTrack( ImageInfo* const pImageInfo,
if (pImageInfo->pImageType->AllowRW()) 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 else
{ {

View File

@ -658,12 +658,12 @@ public:
return ePossibleMatch; 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); const UINT track = PhaseToTrack(phase);
ReadTrack(pImageInfo, track, m_pWorkBuffer, TRACK_DENIBBLIZED_SIZE); ReadTrack(pImageInfo, track, m_pWorkBuffer, TRACK_DENIBBLIZED_SIZE);
*pNibbles = NibblizeTrack(pTrackImageBuffer, eDOSOrder, track); *pNibbles = NibblizeTrack(pTrackImageBuffer, eDOSOrder, track);
if (!enhanceDisk) if (!extra.enhanceDisk)
SkewTrack(track, *pNibbles, pTrackImageBuffer); SkewTrack(track, *pNibbles, pTrackImageBuffer);
} }
@ -726,12 +726,12 @@ public:
return ePossibleMatch; 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); const UINT track = PhaseToTrack(phase);
ReadTrack(pImageInfo, track, m_pWorkBuffer, TRACK_DENIBBLIZED_SIZE); ReadTrack(pImageInfo, track, m_pWorkBuffer, TRACK_DENIBBLIZED_SIZE);
*pNibbles = NibblizeTrack(pTrackImageBuffer, eProDOSOrder, track); *pNibbles = NibblizeTrack(pTrackImageBuffer, eProDOSOrder, track);
if (!enhanceDisk) if (!extra.enhanceDisk)
SkewTrack(track, *pNibbles, pTrackImageBuffer); SkewTrack(track, *pNibbles, pTrackImageBuffer);
} }
@ -792,7 +792,7 @@ public:
return eMatch; 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); const UINT track = PhaseToTrack(phase);
ReadTrack(pImageInfo, track, pTrackImageBuffer, NIB1_TRACK_SIZE); ReadTrack(pImageInfo, track, pTrackImageBuffer, NIB1_TRACK_SIZE);
@ -834,7 +834,7 @@ public:
return eMatch; 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); const UINT track = PhaseToTrack(phase);
ReadTrack(pImageInfo, track, pTrackImageBuffer, NIB2_TRACK_SIZE); ReadTrack(pImageInfo, track, pTrackImageBuffer, NIB2_TRACK_SIZE);
@ -912,7 +912,7 @@ public:
return eMatch; 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); UINT track = PhaseToTrack(phase);
@ -1147,7 +1147,7 @@ public:
return eMatch; 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; BYTE* pTrackMap = ((CWOZHelper::Tmap*)pImageInfo->pWOZTrackMap)->tmap;
@ -1268,22 +1268,22 @@ public:
return eMatch; 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; BYTE indexFromTMAP = CWOZHelper::TMAP_TRACK_EMPTY;
bool isFluxTrack = false;
if (pImageInfo->pWOZTrackMapFlux) if (pImageInfo->pWOZTrackMapFlux)
{ {
BYTE* pTrackMapFlux = ((CWOZHelper::Tmap*)pImageInfo->pWOZTrackMapFlux)->tmap; BYTE* pTrackMapFlux = ((CWOZHelper::Tmap*)pImageInfo->pWOZTrackMapFlux)->tmap;
indexFromTMAP = pTrackMapFlux[(BYTE)(phase * 2)]; indexFromTMAP = pTrackMapFlux[(BYTE)(phase * 2)];
isFluxTrack = (indexFromTMAP != CWOZHelper::TMAP_TRACK_EMPTY); extra.isFluxTrack = (indexFromTMAP != CWOZHelper::TMAP_TRACK_EMPTY);
} }
if (indexFromTMAP == CWOZHelper::TMAP_TRACK_EMPTY) if (indexFromTMAP == CWOZHelper::TMAP_TRACK_EMPTY)
{ {
BYTE* pTrackMap = ((CWOZHelper::Tmap*)pImageInfo->pWOZTrackMap)->tmap; BYTE* pTrackMap = ((CWOZHelper::Tmap*)pImageInfo->pWOZTrackMap)->tmap;
indexFromTMAP = pTrackMap[(BYTE)(phase * 2)]; indexFromTMAP = pTrackMap[(BYTE)(phase * 2)];
extra.isFluxTrack = false;
} }
if (indexFromTMAP == CWOZHelper::TMAP_TRACK_EMPTY) if (indexFromTMAP == CWOZHelper::TMAP_TRACK_EMPTY)
@ -1292,7 +1292,7 @@ public:
CWOZHelper::TRKv2* pTRKS = (CWOZHelper::TRKv2*) &pImageInfo->pImageBuffer[pImageInfo->uOffset]; CWOZHelper::TRKv2* pTRKS = (CWOZHelper::TRKv2*) &pImageInfo->pImageBuffer[pImageInfo->uOffset];
CWOZHelper::TRKv2* pTRK = &pTRKS[indexFromTMAP]; CWOZHelper::TRKv2* pTRK = &pTRKS[indexFromTMAP];
if (isFluxTrack) if (extra.isFluxTrack)
{ {
*pBitCount = 0; // NB. use as a "flag" to callee that this is flux data *pBitCount = 0; // NB. use as a "flag" to callee that this is flux data
*pNibbles = pTRK->bitCount; // byte count of flux data *pNibbles = pTRK->bitCount; // byte count of flux data

View File

@ -54,6 +54,12 @@ struct ImageInfo
#define DEFAULT_VOLUME_NUMBER 254 #define DEFAULT_VOLUME_NUMBER 254
struct Extra
{
bool enhanceDisk;
bool isFluxTrack;
};
class CImageBase class CImageBase
{ {
public: public:
@ -62,7 +68,7 @@ public:
virtual bool Boot(ImageInfo* pImageInfo) { return false; } virtual bool Boot(ImageInfo* pImageInfo) { return false; }
virtual eDetectResult Detect(const LPBYTE pImage, const DWORD dwImageSize, const TCHAR* pszExt) = 0; 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 bool Read(ImageInfo* pImageInfo, UINT nBlock, LPBYTE pBlockBuffer) { return false; }
virtual void Write(ImageInfo* pImageInfo, const float phase, LPBYTE pTrackImageBuffer, int nNibbles) { } virtual void Write(ImageInfo* pImageInfo, const float phase, LPBYTE pTrackImageBuffer, int nNibbles) { }
virtual bool Write(ImageInfo* pImageInfo, UINT nBlock, LPBYTE pBlockBuffer) { return false; } virtual bool Write(ImageInfo* pImageInfo, UINT nBlock, LPBYTE pBlockBuffer) { return false; }
@ -212,7 +218,12 @@ public:
eDetectResult ProcessChunks(ImageInfo* pImageInfo, DWORD& dwOffset); eDetectResult ProcessChunks(ImageInfo* pImageInfo, DWORD& dwOffset);
bool IsWriteProtected(void) { return m_pInfo->v2.v1.writeProtected == 1; } 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; } 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; } BYTE GetBootSectorFormat(void) { return (m_pInfo->v2.v1.version >= 2) ? m_pInfo->v2.bootSectorFormat : bootUnknown; }
void InvalidateInfo(void) { m_pInfo = NULL; } void InvalidateInfo(void) { m_pInfo = NULL; }
BYTE* CreateEmptyDisk(DWORD& size); BYTE* CreateEmptyDisk(DWORD& size);