Skip to content

Commit 5865160

Browse files
committed
Cleanup
1 parent 69964cc commit 5865160

1 file changed

Lines changed: 23 additions & 43 deletions

File tree

SOS_Unpacker.cpp

Lines changed: 23 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,6 @@ UDWORD readLEDWord(const void *buffer) {
4242
return *dwordBytes;
4343
}
4444

45-
UDWORD readDWord(const void *buffer) {
46-
const byte *dwordNext = (const byte *)buffer;
47-
return (dwordNext[0] << 24) + (dwordNext[1] << 16) + (dwordNext[2] << 8) + (dwordNext[3]);
48-
}
49-
5045
UDWORD swapDWord(UDWORD buffer) {
5146
const UWORD *DW = (UWORD*)&buffer;
5247
return (DW[0] << 16) + (DW[1]);
@@ -97,7 +92,7 @@ int sectorFindSync(byte **pBuffer, byte *pBufferEnd) {
9792
UDWORD current = swapDWord(readLEDWord(*pBuffer));
9893

9994
for (bits_shifted = 0; bits_shifted < 16; ++bits_shifted) {
100-
if (gTrackSyncMarker == (UWORD)current) {
95+
if (gTrackSyncMarker == (current & 0xFFFF)) {
10196
found = true;
10297
break;
10398
}
@@ -116,27 +111,20 @@ int sectorFindSync(byte **pBuffer, byte *pBufferEnd) {
116111
return (16 - bits_shifted);
117112
}
118113

119-
void mfmcopy(UINT16 *mfm, UINT8 *data, int len) {
120-
int memlen = (len + 7) / 8;
121-
for (int i = 0; i < memlen; i += 2) {
122-
if (i + 1 < memlen)
123-
*mfm++ = (data[i] << 8) + data[i + 1];
124-
else
125-
*mfm++ = (data[i] << 8);
126-
}
127-
}
114+
UDWORD sos_ReadUDWord(byte*&pEven, byte*& pOdd) {
115+
UDWORD D0 = *(UDWORD*)pEven;
116+
UDWORD D1 = *(UDWORD*)pOdd;
128117

129-
UDWORD sos_ReadUDWord(UDWORD *pEven, UDWORD* pOdd) {
130-
UDWORD D0 = *pEven;
131-
UDWORD D1 = *pOdd;
118+
pEven += 4;
119+
pOdd += 4;
132120

133121
D0 &= 0x55555555;
134122
D1 &= 0x55555555;
135123

136-
D1 += D1;
124+
D1 <<= 1;
137125
D0 += D1;
138126

139-
return D0;
127+
return swapDWord(D0);
140128
}
141129

142130
void tool_EndianSwap(UINT8 *pBuffer, size_t pSize) {
@@ -186,7 +174,8 @@ std::vector<std::string> GetSOSTracks(const std::string& pFilename) {
186174
auto Data = CapsLockTrack((PCAPSTRACKINFO)&TrackInfo, CapsID, Track / 2, (Track & 1) ? 0 : 1, gCapsFlags);
187175

188176
FullTrack.resize(TrackInfo.tracklen / 8);
189-
mfmcopy((UINT16*)FullTrack.data(), TrackInfo.trackbuf, TrackInfo.tracklen);
177+
memcpy((UINT16*)FullTrack.data(), TrackInfo.trackbuf, TrackInfo.tracklen / 8);
178+
tool_EndianSwap((UINT8*)FullTrack.data(), FullTrack.size());
190179

191180
byte* Ptr = (byte*)FullTrack.data();
192181
byte* PtrEnd = (byte*)FullTrack.data() + FullTrack.size();
@@ -204,30 +193,22 @@ std::vector<std::string> GetSOSTracks(const std::string& pFilename) {
204193
std::cout << "Skipping Track " << Track << "\n";
205194
continue;
206195
}
207-
SDWORD Checksum = sos_ReadUDWord((UDWORD*)Ptr, (UDWORD*)PtrOdd);
208-
Ptr += 4; PtrOdd += 4;
196+
SDWORD Checksum = sos_ReadUDWord(Ptr, PtrOdd);
209197

210198
// Check for Sensible Software marker
211-
if (swapDWord(Checksum) != 'SOS6') {
199+
if (Checksum != 'SOS6') {
212200
std::cout << "Skipping Track " << Track << " (Invalid SOS6 Marker)\n";
213201
continue;
214202
}
215-
Checksum = -((SDWORD)swapDWord(Checksum));
216-
217-
SDWORD data = sos_ReadUDWord((UDWORD*)Ptr, (UDWORD*)PtrOdd);
218-
Ptr += 4; PtrOdd += 4;
219-
Checksum += swapDWord(data);
220-
221-
data = sos_ReadUDWord((UDWORD*)Ptr, (UDWORD*)PtrOdd);
222-
Ptr += 4; PtrOdd += 4;
223-
Checksum -= swapDWord(data);
203+
Checksum = -Checksum;
204+
Checksum += sos_ReadUDWord(Ptr, PtrOdd);
205+
Checksum -= sos_ReadUDWord(Ptr, PtrOdd);
224206

225207
std::vector<UDWORD> TrackDecodedBuffer;
226208
for (int count = 0x1800 / 4 - 1; count >= 0; --count) {
227-
UDWORD NewData = sos_ReadUDWord((UDWORD*)Ptr, (UDWORD*)PtrOdd);
228-
Ptr += 4; PtrOdd += 4;
229-
Checksum -= swapDWord(NewData);
230-
TrackDecodedBuffer.push_back(NewData);
209+
UDWORD NewData = sos_ReadUDWord(Ptr, PtrOdd);
210+
Checksum -= NewData;
211+
TrackDecodedBuffer.push_back(swapDWord(NewData));
231212
}
232213

233214
if (Checksum) {
@@ -251,31 +232,30 @@ void ExtractFiles(const std::vector<std::string> pTrackBuffers, const std::strin
251232

252233
// Track3 is the directory listing
253234
byte* TrackPtr = (byte*)pTrackBuffers[2].data();
254-
UDWORD FileCount = readDWord(TrackPtr + 0x18);
235+
UDWORD FileCount = readBEDWord(TrackPtr + 0x18);
255236

256237
// Move to first file entry
257238
TrackPtr += 0x20;
258239
for (UDWORD Count = 0; Count < FileCount; ++Count) {
259240
std::string Filename((char*)TrackPtr);
260-
UDWORD Filesize = readDWord(TrackPtr + 0x1C);
261-
241+
UDWORD Filesize = readBEDWord(TrackPtr + 0x1C);
262242
UBYTE FileTrack = *(TrackPtr + 0x1A);
263243
UBYTE FileBlock = *(TrackPtr + 0x1B);
264244

265-
std::string FileData;
266-
267245
std::cout << std::setw(15) << Filename << " Track: ";
268246
std::cout << std::setw(4) << ((size_t)FileTrack) << " Block: ";
269247
std::cout << std::setw(3) << ((size_t)FileBlock) << " Size: ";
270248
std::cout << std::setw(6) << ((size_t)Filesize) << " bytes\n";
271249

250+
std::string FileData;
251+
// Read each block
272252
SDWORD FileRemaining = Filesize;
273253
while (FileRemaining > 0) {
274254
byte* FileTrackPtr = (byte*)pTrackBuffers[FileTrack].data();
275255
byte *FileTrackPtrEnd = (byte*)pTrackBuffers[FileTrack].data() + pTrackBuffers[FileTrack].size();
276256
FileTrackPtr += (FileBlock * 512);
277257

278-
if (FileTrackPtr > FileTrackPtrEnd || FileTrackPtr + 510 >= FileTrackPtrEnd) {
258+
if (FileTrackPtr > FileTrackPtrEnd || (FileTrackPtr + 512) > FileTrackPtrEnd) {
279259
std::cout << " Track: " << ((size_t)FileTrack) << ": Read past end of available track data.\n\n";
280260
break;
281261
}

0 commit comments

Comments
 (0)