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())
{
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
{

View File

@ -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

View File

@ -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);