@@ -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-
5045UDWORD 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
142130void 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