mirror of
https://github.com/AppleWin/AppleWin.git
synced 2025-01-10 13:29:56 +00:00
Small refactor for WOZ2 write track
This commit is contained in:
parent
d978a1789b
commit
ad599680d2
@ -620,7 +620,7 @@ ImageError_e Disk2InterfaceCard::InsertDisk(const int drive, LPCTSTR pszImageFil
|
|||||||
|
|
||||||
const DWORD dwAttributes = GetFileAttributes(pszImageFilename);
|
const DWORD dwAttributes = GetFileAttributes(pszImageFilename);
|
||||||
if (dwAttributes == INVALID_FILE_ATTRIBUTES)
|
if (dwAttributes == INVALID_FILE_ATTRIBUTES)
|
||||||
pFloppy->m_bWriteProtected = false; // Assume this is a new file to create
|
pFloppy->m_bWriteProtected = false; // Assume this is a new file to create (so it must be write-enabled to allow it to be formatted)
|
||||||
else
|
else
|
||||||
pFloppy->m_bWriteProtected = bForceWriteProtected ? true : (dwAttributes & FILE_ATTRIBUTE_READONLY);
|
pFloppy->m_bWriteProtected = bForceWriteProtected ? true : (dwAttributes & FILE_ATTRIBUTE_READONLY);
|
||||||
|
|
||||||
|
@ -1134,7 +1134,8 @@ public:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT extendedSize = 0;
|
UINT hdrExtendedSize = 0;
|
||||||
|
const UINT trkExtendedSize = CWOZHelper::WOZ1_TRACK_SIZE;
|
||||||
BYTE* pTrackMap = ((CWOZHelper::Tmap*)pImageInfo->pWOZTrackMap)->tmap;
|
BYTE* pTrackMap = ((CWOZHelper::Tmap*)pImageInfo->pWOZTrackMap)->tmap;
|
||||||
|
|
||||||
BYTE indexFromTMAP = pTrackMap[(UINT)(phase * 2)];
|
BYTE indexFromTMAP = pTrackMap[(UINT)(phase * 2)];
|
||||||
@ -1154,8 +1155,7 @@ public:
|
|||||||
if (track-1 >= 0) pTrackMap[track-1] = indexFromTMAP; // WOZ spec: track is also visible from neighboring quarter tracks
|
if (track-1 >= 0) pTrackMap[track-1] = indexFromTMAP; // WOZ spec: track is also visible from neighboring quarter tracks
|
||||||
if (track+1 < CWOZHelper::MAX_QUARTER_TRACKS_5_25) pTrackMap[track+1] = indexFromTMAP;
|
if (track+1 < CWOZHelper::MAX_QUARTER_TRACKS_5_25) pTrackMap[track+1] = indexFromTMAP;
|
||||||
|
|
||||||
const UINT trackSizeRoundedUp = CWOZHelper::WOZ1_TRACK_SIZE;
|
const UINT newImageSize = pImageInfo->uImageSize + trkExtendedSize;
|
||||||
const UINT newImageSize = pImageInfo->uImageSize + trackSizeRoundedUp;
|
|
||||||
BYTE* pNewImageBuffer = new BYTE[newImageSize];
|
BYTE* pNewImageBuffer = new BYTE[newImageSize];
|
||||||
memcpy(pNewImageBuffer, pImageInfo->pImageBuffer, pImageInfo->uImageSize);
|
memcpy(pNewImageBuffer, pImageInfo->pImageBuffer, pImageInfo->uImageSize);
|
||||||
|
|
||||||
@ -1173,9 +1173,9 @@ public:
|
|||||||
pTRK->bitCount = nNibbles * 8;
|
pTRK->bitCount = nNibbles * 8;
|
||||||
|
|
||||||
CWOZHelper::WOZChunkHdr* pTrksHdr = (CWOZHelper::WOZChunkHdr*) &pImageInfo->pImageBuffer[pImageInfo->uOffset - sizeof(CWOZHelper::WOZChunkHdr)];
|
CWOZHelper::WOZChunkHdr* pTrksHdr = (CWOZHelper::WOZChunkHdr*) &pImageInfo->pImageBuffer[pImageInfo->uOffset - sizeof(CWOZHelper::WOZChunkHdr)];
|
||||||
pTrksHdr->size += trackSizeRoundedUp;
|
pTrksHdr->size += trkExtendedSize;
|
||||||
|
|
||||||
extendedSize = pImageInfo->uOffset - sizeof(CWOZHelper::WOZHeader);
|
hdrExtendedSize = pImageInfo->uOffset - sizeof(CWOZHelper::WOZHeader);
|
||||||
}
|
}
|
||||||
|
|
||||||
// NB. pTrackImageBuffer[] is at least WOZ1_TRACK_SIZE in size
|
// NB. pTrackImageBuffer[] is at least WOZ1_TRACK_SIZE in size
|
||||||
@ -1192,7 +1192,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!WriteTrack(pImageInfo, indexFromTMAP, pTrackImageBuffer, CWOZHelper::WOZ1_TRACK_SIZE))
|
if (!WriteTrack(pImageInfo, indexFromTMAP, pTrackImageBuffer, trkExtendedSize))
|
||||||
{
|
{
|
||||||
_ASSERT(0);
|
_ASSERT(0);
|
||||||
LogFileOutput("WOZ1 Write Track: failed to write track (phase=%f) for file: %s\n", phase, pImageInfo->szFilename.c_str());
|
LogFileOutput("WOZ1 Write Track: failed to write track (phase=%f) for file: %s\n", phase, pImageInfo->szFilename.c_str());
|
||||||
@ -1200,7 +1200,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: zip/gzip: combine the track & hdr writes so that the file is only compressed & written once
|
// TODO: zip/gzip: combine the track & hdr writes so that the file is only compressed & written once
|
||||||
if (!UpdateWOZHeaderCRC(pImageInfo, this, extendedSize))
|
if (!UpdateWOZHeaderCRC(pImageInfo, this, hdrExtendedSize))
|
||||||
{
|
{
|
||||||
_ASSERT(0);
|
_ASSERT(0);
|
||||||
LogFileOutput("WOZ1 Write Track: failed to write header CRC for file: %s\n", pImageInfo->szFilename.c_str());
|
LogFileOutput("WOZ1 Write Track: failed to write header CRC for file: %s\n", pImageInfo->szFilename.c_str());
|
||||||
@ -1258,7 +1258,8 @@ public:
|
|||||||
// TODO: support writing a bitCount (ie. fractional nibbles)
|
// TODO: support writing a bitCount (ie. fractional nibbles)
|
||||||
virtual void Write(ImageInfo* pImageInfo, const float phase, LPBYTE pTrackImageBuffer, int nNibbles)
|
virtual void Write(ImageInfo* pImageInfo, const float phase, LPBYTE pTrackImageBuffer, int nNibbles)
|
||||||
{
|
{
|
||||||
UINT extendedSize = 0;
|
UINT hdrExtendedSize = 0;
|
||||||
|
UINT trkExtendedSize = nNibbles;
|
||||||
BYTE* pTrackMap = ((CWOZHelper::Tmap*)pImageInfo->pWOZTrackMap)->tmap;
|
BYTE* pTrackMap = ((CWOZHelper::Tmap*)pImageInfo->pWOZTrackMap)->tmap;
|
||||||
|
|
||||||
BYTE indexFromTMAP = pTrackMap[(BYTE)(phase * 2)];
|
BYTE indexFromTMAP = pTrackMap[(BYTE)(phase * 2)];
|
||||||
@ -1278,12 +1279,12 @@ public:
|
|||||||
if (track-1 >= 0) pTrackMap[track-1] = indexFromTMAP; // WOZ spec: track is also visible from neighboring quarter tracks
|
if (track-1 >= 0) pTrackMap[track-1] = indexFromTMAP; // WOZ spec: track is also visible from neighboring quarter tracks
|
||||||
if (track+1 < CWOZHelper::MAX_QUARTER_TRACKS_5_25) pTrackMap[track+1] = indexFromTMAP;
|
if (track+1 < CWOZHelper::MAX_QUARTER_TRACKS_5_25) pTrackMap[track+1] = indexFromTMAP;
|
||||||
|
|
||||||
const UINT trackSizeRoundedUp = (nNibbles + CWOZHelper::BLOCK_SIZE-1) & ~(CWOZHelper::BLOCK_SIZE-1);
|
trkExtendedSize = (nNibbles + CWOZHelper::BLOCK_SIZE-1) & ~(CWOZHelper::BLOCK_SIZE-1);
|
||||||
const UINT newImageSize = pImageInfo->uImageSize + trackSizeRoundedUp;
|
const UINT newImageSize = pImageInfo->uImageSize + trkExtendedSize;
|
||||||
BYTE* pNewImageBuffer = new BYTE[newImageSize];
|
BYTE* pNewImageBuffer = new BYTE[newImageSize];
|
||||||
|
|
||||||
memcpy(pNewImageBuffer, pImageInfo->pImageBuffer, pImageInfo->uImageSize);
|
memcpy(pNewImageBuffer, pImageInfo->pImageBuffer, pImageInfo->uImageSize);
|
||||||
memset(pNewImageBuffer+pImageInfo->uImageSize, 0, trackSizeRoundedUp);
|
memset(pNewImageBuffer+pImageInfo->uImageSize, 0, trkExtendedSize);
|
||||||
|
|
||||||
// NB. delete old pImageBuffer: pWOZTrackMap updated in WOZUpdateInfo() by parent function
|
// NB. delete old pImageBuffer: pWOZTrackMap updated in WOZUpdateInfo() by parent function
|
||||||
|
|
||||||
@ -1294,29 +1295,18 @@ 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];
|
||||||
pTRK->blockCount = trackSizeRoundedUp / CWOZHelper::BLOCK_SIZE;
|
pTRK->blockCount = trkExtendedSize / CWOZHelper::BLOCK_SIZE;
|
||||||
pTRK->startBlock = 3;
|
pTRK->startBlock = 3;
|
||||||
for (UINT i=0; i<indexFromTMAP; i++)
|
for (UINT i=0; i<indexFromTMAP; i++)
|
||||||
pTRK->startBlock += pTRKS[i].blockCount;
|
pTRK->startBlock += pTRKS[i].blockCount;
|
||||||
pTRK->bitCount = nNibbles * 8;
|
pTRK->bitCount = nNibbles * 8;
|
||||||
|
|
||||||
CWOZHelper::WOZChunkHdr* pTrksHdr = (CWOZHelper::WOZChunkHdr*) (&pImageInfo->pImageBuffer[pImageInfo->uOffset] - sizeof(CWOZHelper::WOZChunkHdr));
|
CWOZHelper::WOZChunkHdr* pTrksHdr = (CWOZHelper::WOZChunkHdr*) (&pImageInfo->pImageBuffer[pImageInfo->uOffset] - sizeof(CWOZHelper::WOZChunkHdr));
|
||||||
pTrksHdr->size += trackSizeRoundedUp;
|
pTrksHdr->size += trkExtendedSize;
|
||||||
|
|
||||||
const long offset = pTRK->startBlock * CWOZHelper::BLOCK_SIZE;
|
hdrExtendedSize = ((BYTE*)pTRKS + sizeof(CWOZHelper::Trks) - pNewImageBuffer) - sizeof(CWOZHelper::WOZHeader);
|
||||||
memcpy(&pImageInfo->pImageBuffer[offset], pTrackImageBuffer, nNibbles);
|
|
||||||
|
|
||||||
if (!WriteImageData(pImageInfo, &pImageInfo->pImageBuffer[offset], trackSizeRoundedUp, offset)) // write rounded-up track data
|
|
||||||
{
|
|
||||||
_ASSERT(0);
|
|
||||||
LogFileOutput("WOZ2 Write Track: failed to write track (phase=%f) for file: %s\n", phase, pImageInfo->szFilename.c_str());
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extendedSize = ((BYTE*)pTRKS + sizeof(CWOZHelper::Trks) - pNewImageBuffer) - sizeof(CWOZHelper::WOZHeader);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
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];
|
||||||
{
|
{
|
||||||
@ -1334,16 +1324,15 @@ public:
|
|||||||
const long offset = pTRK->startBlock * CWOZHelper::BLOCK_SIZE;
|
const long offset = pTRK->startBlock * CWOZHelper::BLOCK_SIZE;
|
||||||
memcpy(&pImageInfo->pImageBuffer[offset], pTrackImageBuffer, nNibbles);
|
memcpy(&pImageInfo->pImageBuffer[offset], pTrackImageBuffer, nNibbles);
|
||||||
|
|
||||||
if (!WriteImageData(pImageInfo, pTrackImageBuffer, nNibbles, offset))
|
if (!WriteImageData(pImageInfo, &pImageInfo->pImageBuffer[offset], trkExtendedSize, offset))
|
||||||
{
|
{
|
||||||
_ASSERT(0);
|
_ASSERT(0);
|
||||||
LogFileOutput("WOZ2 Write Track: failed to write track (phase=%f) for file: %s\n", phase, pImageInfo->szFilename.c_str());
|
LogFileOutput("WOZ2 Write Track: failed to write track (phase=%f) for file: %s\n", phase, pImageInfo->szFilename.c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: zip/gzip: combine the track & hdr writes so that the file is only compressed & written once
|
// TODO: zip/gzip: combine the track & hdr writes so that the file is only compressed & written once
|
||||||
if (!UpdateWOZHeaderCRC(pImageInfo, this, extendedSize))
|
if (!UpdateWOZHeaderCRC(pImageInfo, this, hdrExtendedSize))
|
||||||
{
|
{
|
||||||
_ASSERT(0);
|
_ASSERT(0);
|
||||||
LogFileOutput("WOZ2 Write Track: failed to write header CRC for file: %s\n", pImageInfo->szFilename.c_str());
|
LogFileOutput("WOZ2 Write Track: failed to write header CRC for file: %s\n", pImageInfo->szFilename.c_str());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user