mirror of
				https://github.com/davidgiven/fluxengine.git
				synced 2025-10-24 11:11:02 -07:00 
			
		
		
		
	Add some helper methods to make decoders easier. Port IBM to the new new
architecture.
This commit is contained in:
		| @@ -66,8 +66,8 @@ AbstractSimplifiedDecoder::RecordType BrotherDecoder::advanceToNextRecord() | ||||
|  | ||||
| void BrotherDecoder::decodeSectorRecord() | ||||
| { | ||||
| 	_fmr->readRawBits(32, _sector->clock); | ||||
| 	const auto& rawbits = _fmr->readRawBits(32, _sector->clock); | ||||
| 	readRawBits(32); | ||||
| 	const auto& rawbits = readRawBits(32); | ||||
| 	const auto& bytes = toBytes(rawbits).slice(0, 4); | ||||
|  | ||||
| 	ByteReader br(bytes); | ||||
| @@ -86,9 +86,9 @@ void BrotherDecoder::decodeSectorRecord() | ||||
|  | ||||
| void BrotherDecoder::decodeDataRecord() | ||||
| { | ||||
| 	_fmr->readRawBits(32, _sector->clock); | ||||
| 	readRawBits(32); | ||||
|  | ||||
| 	const auto& rawbits = _fmr->readRawBits(BROTHER_DATA_RECORD_ENCODED_SIZE*8, _sector->clock); | ||||
| 	const auto& rawbits = readRawBits(BROTHER_DATA_RECORD_ENCODED_SIZE*8); | ||||
| 	const auto& rawbytes = toBytes(rawbits).slice(0, BROTHER_DATA_RECORD_ENCODED_SIZE); | ||||
|  | ||||
| 	Bytes bytes; | ||||
|   | ||||
| @@ -4,6 +4,7 @@ | ||||
| #include "bytes.h" | ||||
| #include "sector.h" | ||||
| #include "record.h" | ||||
| #include "fluxmapreader.h" | ||||
|  | ||||
| class Sector; | ||||
| class Fluxmap; | ||||
| @@ -48,6 +49,15 @@ public: | ||||
|     void decodeToSectors(Track& track) override; | ||||
|     void pushRecord(const Fluxmap::Position& start, const Fluxmap::Position& end); | ||||
|  | ||||
|     std::vector<bool> readRawBits(unsigned count) | ||||
|     { return _fmr->readRawBits(count, _sector->clock); } | ||||
|  | ||||
|     Fluxmap::Position tell() | ||||
|     { return _fmr->tell(); }  | ||||
|  | ||||
|     void seek(const Fluxmap::Position& pos) | ||||
|     { return _fmr->seek(pos); }  | ||||
|  | ||||
| protected: | ||||
|     virtual RecordType advanceToNextRecord() = 0; | ||||
|     virtual void decodeSectorRecord() = 0; | ||||
|   | ||||
| @@ -76,7 +76,7 @@ const FluxPattern FM_TRS80DAM2_PATTERN(16, 0xf56c); | ||||
|  */ | ||||
| const FluxPattern MFM_PATTERN(16, 0x4489); | ||||
|  | ||||
| const FluxMatchers SEPARATOR_PATTERNS( | ||||
| const FluxMatchers ANY_RECORD_PATTERN( | ||||
|     { | ||||
|         &MFM_PATTERN, | ||||
|         &FM_IDAM_PATTERN, | ||||
| @@ -87,77 +87,67 @@ const FluxMatchers SEPARATOR_PATTERNS( | ||||
|     } | ||||
| ); | ||||
|  | ||||
| nanoseconds_t IbmDecoder::findSector(FluxmapReader& fmr, Track& track) | ||||
| AbstractSimplifiedDecoder::RecordType IbmDecoder::advanceToNextRecord() | ||||
| { | ||||
|     for (;;) | ||||
| 	const FluxMatcher* matcher = nullptr; | ||||
| 	_sector->clock = _fmr->seekToPattern(ANY_RECORD_PATTERN, matcher); | ||||
|  | ||||
|     /* If this is the MFM prefix byte, the the decoder is going to expect three | ||||
|      * extra bytes on the front of the header. */ | ||||
|     _currentHeaderLength = (matcher == &MFM_PATTERN) ? 3 : 0; | ||||
|  | ||||
|     Fluxmap::Position here = tell(); | ||||
|     if (_currentHeaderLength > 0) | ||||
|         readRawBits(_currentHeaderLength*16); | ||||
|     auto idbits = readRawBits(16); | ||||
|     uint8_t id = decodeFmMfm(idbits).slice(0, 1)[0]; | ||||
|     seek(here); | ||||
|      | ||||
|     switch (id) | ||||
|     { | ||||
|         nanoseconds_t clock = fmr.seekToPattern(SEPARATOR_PATTERNS); | ||||
|         if (fmr.eof() || !clock) | ||||
|             return 0; | ||||
|         case IBM_IDAM: | ||||
|             return RecordType::SECTOR_RECORD; | ||||
|  | ||||
|         auto here = fmr.tell(); | ||||
|         auto idbits = fmr.readRawBits(16, clock); | ||||
|         uint8_t id = decodeFmMfm(idbits).slice(0, 1)[0]; | ||||
|         fmr.seek(here); | ||||
|         /* If this is the MFM prefix byte, the the decoder is going to expect three | ||||
|          * extra bytes on the front of the header. */ | ||||
|         _currentHeaderLength = (id == IBM_MFM_SYNC) ? 3 : 0; | ||||
|  | ||||
|         switch (id) | ||||
|         { | ||||
|             case IBM_MFM_SYNC: | ||||
|             case IBM_IDAM: | ||||
|             case IBM_DAM1: | ||||
|             case IBM_DAM2: | ||||
|             case IBM_TRS80DAM1: | ||||
|             case IBM_TRS80DAM2: | ||||
|                 return clock; | ||||
|         } | ||||
|  | ||||
|         fmr.readRawBit(clock); | ||||
|         case IBM_DAM1: | ||||
|         case IBM_DAM2: | ||||
|         case IBM_TRS80DAM1: | ||||
|         case IBM_TRS80DAM2: | ||||
|             return RecordType::DATA_RECORD; | ||||
|     } | ||||
|     return RecordType::UNKNOWN_RECORD; | ||||
| } | ||||
|  | ||||
| nanoseconds_t IbmDecoder::findData(FluxmapReader& fmr, Track& track) | ||||
| { | ||||
|     return findSector(fmr, track); | ||||
| } | ||||
|  | ||||
| void IbmDecoder::decodeHeader(FluxmapReader& fmr, Track& track, Sector& sector) | ||||
| void IbmDecoder::decodeSectorRecord() | ||||
| { | ||||
|     unsigned recordSize = _currentHeaderLength + IBM_IDAM_LEN; | ||||
|     auto bits = fmr.readRawBits(recordSize*16, sector.clock); | ||||
|     auto bits = readRawBits(recordSize*16); | ||||
|     auto bytes = decodeFmMfm(bits).slice(0, recordSize); | ||||
|  | ||||
|     ByteReader br(bytes); | ||||
|     br.seek(_currentHeaderLength); | ||||
|     uint8_t id = br.read_8(); | ||||
|     if (id != IBM_IDAM) | ||||
|         return; | ||||
|     sector.logicalTrack = br.read_8(); | ||||
|     sector.logicalSide = br.read_8(); | ||||
|     sector.logicalSector = br.read_8() - _sectorBase; | ||||
|     br.read_8(); /* skip ID byte */ | ||||
|     _sector->logicalTrack = br.read_8(); | ||||
|     _sector->logicalSide = br.read_8(); | ||||
|     _sector->logicalSector = br.read_8() - _sectorBase; | ||||
|     _currentSectorSize = 1 << (br.read_8() + 7); | ||||
|     uint16_t wantCrc = br.read_be16(); | ||||
|     uint16_t gotCrc = crc16(CCITT_POLY, bytes.slice(0, _currentHeaderLength + 5)); | ||||
|     if (wantCrc == gotCrc) | ||||
|         sector.status = Sector::DATA_MISSING; /* correct but unintuitive */ | ||||
|         _sector->status = Sector::DATA_MISSING; /* correct but unintuitive */ | ||||
| } | ||||
|  | ||||
| void IbmDecoder::decodeData(FluxmapReader& fmr, Track& track, Sector& sector) | ||||
| void IbmDecoder::decodeDataRecord() | ||||
| { | ||||
|     unsigned recordLength = _currentHeaderLength + _currentSectorSize + 3; | ||||
|     auto bits = fmr.readRawBits(recordLength*16, sector.clock); | ||||
|     auto bits = readRawBits(recordLength*16); | ||||
|     auto bytes = decodeFmMfm(bits).slice(0, recordLength); | ||||
|  | ||||
|     ByteReader br(bytes); | ||||
|     br.seek(_currentHeaderLength); | ||||
|     uint8_t id = br.read_8(); | ||||
|     if ((id != IBM_DAM1) && (id != IBM_DAM2) && (id != IBM_TRS80DAM1) && (id != IBM_TRS80DAM2)) | ||||
|         return; | ||||
|     br.read_8(); /* skip ID byte */ | ||||
|  | ||||
|     sector.data = br.read(_currentSectorSize); | ||||
|     _sector->data = br.read(_currentSectorSize); | ||||
|     uint16_t wantCrc = br.read_be16(); | ||||
|     uint16_t gotCrc = crc16(CCITT_POLY, bytes.slice(0, recordLength-2)); | ||||
|     sector.status = (wantCrc == gotCrc) ? Sector::OK : Sector::BAD_CHECKSUM; | ||||
|     _sector->status = (wantCrc == gotCrc) ? Sector::OK : Sector::BAD_CHECKSUM; | ||||
| } | ||||
|   | ||||
| @@ -28,17 +28,16 @@ struct IbmIdam | ||||
|     uint8_t crc[2]; | ||||
| }; | ||||
|  | ||||
| class IbmDecoder : public AbstractSplitDecoder | ||||
| class IbmDecoder : public AbstractSimplifiedDecoder | ||||
| { | ||||
| public: | ||||
|     IbmDecoder(unsigned sectorBase): | ||||
|         _sectorBase(sectorBase) | ||||
|     {} | ||||
|  | ||||
|     nanoseconds_t findSector(FluxmapReader& fmr, Track& track) override; | ||||
|     nanoseconds_t findData(FluxmapReader& fmr, Track& track) override; | ||||
|     void decodeHeader(FluxmapReader& fmr, Track& track, Sector& sector) override; | ||||
|     void decodeData(FluxmapReader& fmr, Track& track, Sector& sector) override; | ||||
|     RecordType advanceToNextRecord(); | ||||
|     void decodeSectorRecord(); | ||||
|     void decodeDataRecord(); | ||||
|  | ||||
| private: | ||||
|     unsigned _sectorBase; | ||||
|   | ||||
							
								
								
									
										164
									
								
								meson.build
									
									
									
									
									
								
							
							
						
						
									
										164
									
								
								meson.build
									
									
									
									
									
								
							| @@ -124,32 +124,32 @@ encoderlib = declare_dependency( | ||||
|         ) | ||||
| ) | ||||
|  | ||||
| aeslanierdecoderlib = declare_dependency( | ||||
|    link_with: | ||||
|        shared_library('aeslanierdecoderlib', | ||||
|        [ 'lib/aeslanier/decoder.cc', ], | ||||
|        dependencies: [fmtlib, felib, decoderlib]), | ||||
|    include_directories: | ||||
|        include_directories('lib/aeslanier') | ||||
| ) | ||||
| # aeslanierdecoderlib = declare_dependency( | ||||
| #    link_with: | ||||
| #        shared_library('aeslanierdecoderlib', | ||||
| #        [ 'lib/aeslanier/decoder.cc', ], | ||||
| #        dependencies: [fmtlib, felib, decoderlib]), | ||||
| #    include_directories: | ||||
| #        include_directories('lib/aeslanier') | ||||
| # ) | ||||
|  | ||||
| amigadecoderlib = declare_dependency( | ||||
|    link_with: | ||||
|        shared_library('amigadecoderlib', | ||||
|        [ 'lib/amiga/decoder.cc', ], | ||||
|        dependencies: [fmtlib, felib, decoderlib]), | ||||
|    include_directories: | ||||
|        include_directories('lib/amiga') | ||||
| ) | ||||
| # amigadecoderlib = declare_dependency( | ||||
| #    link_with: | ||||
| #        shared_library('amigadecoderlib', | ||||
| #        [ 'lib/amiga/decoder.cc', ], | ||||
| #        dependencies: [fmtlib, felib, decoderlib]), | ||||
| #    include_directories: | ||||
| #        include_directories('lib/amiga') | ||||
| # ) | ||||
|  | ||||
| apple2decoderlib = declare_dependency( | ||||
|    link_with: | ||||
|        shared_library('apple2decoderlib', | ||||
|        [ 'lib/apple2/decoder.cc', ], | ||||
|        dependencies: [fmtlib, felib, decoderlib]), | ||||
|    include_directories: | ||||
|        include_directories('lib/apple2') | ||||
| ) | ||||
| # apple2decoderlib = declare_dependency( | ||||
| #    link_with: | ||||
| #        shared_library('apple2decoderlib', | ||||
| #        [ 'lib/apple2/decoder.cc', ], | ||||
| #        dependencies: [fmtlib, felib, decoderlib]), | ||||
| #    include_directories: | ||||
| #        include_directories('lib/apple2') | ||||
| # ) | ||||
|  | ||||
| brotherdecoderlib = declare_dependency( | ||||
|    link_with: | ||||
| @@ -169,32 +169,32 @@ brotherdecoderlib = declare_dependency( | ||||
| #        include_directories('lib/brother') | ||||
| #) | ||||
|  | ||||
| c64decoderlib = declare_dependency( | ||||
|    link_with: | ||||
|        shared_library('c64decoderlib', | ||||
|        [ 'lib/c64/decoder.cc', ], | ||||
|        dependencies: [fmtlib, felib, decoderlib]), | ||||
|    include_directories: | ||||
|        include_directories('lib/c64') | ||||
| ) | ||||
| # c64decoderlib = declare_dependency( | ||||
| #    link_with: | ||||
| #        shared_library('c64decoderlib', | ||||
| #        [ 'lib/c64/decoder.cc', ], | ||||
| #        dependencies: [fmtlib, felib, decoderlib]), | ||||
| #    include_directories: | ||||
| #        include_directories('lib/c64') | ||||
| # ) | ||||
|  | ||||
| f85decoderlib = declare_dependency( | ||||
|     link_with: | ||||
|         shared_library('f85decoderlib', | ||||
|         [ 'lib/f85/decoder.cc', ], | ||||
|         dependencies: [fmtlib, felib, decoderlib]), | ||||
|     include_directories: | ||||
|         include_directories('lib/f85') | ||||
| ) | ||||
| # f85decoderlib = declare_dependency( | ||||
| #     link_with: | ||||
| #         shared_library('f85decoderlib', | ||||
| #         [ 'lib/f85/decoder.cc', ], | ||||
| #         dependencies: [fmtlib, felib, decoderlib]), | ||||
| #     include_directories: | ||||
| #         include_directories('lib/f85') | ||||
| # ) | ||||
|  | ||||
| fb100decoderlib = declare_dependency( | ||||
|     link_with: | ||||
|         shared_library('fb100decoderlib', | ||||
|         [ 'lib/fb100/decoder.cc', ], | ||||
|         dependencies: [fmtlib, felib, decoderlib]), | ||||
|     include_directories: | ||||
|         include_directories('lib/fb100') | ||||
| ) | ||||
| # fb100decoderlib = declare_dependency( | ||||
| #     link_with: | ||||
| #         shared_library('fb100decoderlib', | ||||
| #         [ 'lib/fb100/decoder.cc', ], | ||||
| #         dependencies: [fmtlib, felib, decoderlib]), | ||||
| #     include_directories: | ||||
| #         include_directories('lib/fb100') | ||||
| # ) | ||||
|  | ||||
| ibmdecoderlib = declare_dependency( | ||||
|     link_with: | ||||
| @@ -205,49 +205,49 @@ ibmdecoderlib = declare_dependency( | ||||
|         include_directories('lib/ibm') | ||||
| ) | ||||
|  | ||||
| macdecoderlib = declare_dependency( | ||||
|     link_with: | ||||
|         shared_library('macdecoderlib', | ||||
|         [ 'lib/macintosh/decoder.cc', ], | ||||
|         dependencies: [fmtlib, felib, decoderlib]), | ||||
|     include_directories: | ||||
|         include_directories('lib/macintosh') | ||||
| ) | ||||
| # macdecoderlib = declare_dependency( | ||||
| #     link_with: | ||||
| #         shared_library('macdecoderlib', | ||||
| #         [ 'lib/macintosh/decoder.cc', ], | ||||
| #         dependencies: [fmtlib, felib, decoderlib]), | ||||
| #     include_directories: | ||||
| #         include_directories('lib/macintosh') | ||||
| # ) | ||||
|  | ||||
| zilogmczdecoderlib = declare_dependency( | ||||
|     link_with: | ||||
|         shared_library('zilogmczdecoderlib', | ||||
|         [ 'lib/zilogmcz/decoder.cc', ], | ||||
|         dependencies: [fmtlib, felib, decoderlib]), | ||||
|     include_directories: | ||||
|         include_directories('lib/zilogmcz') | ||||
| ) | ||||
| # zilogmczdecoderlib = declare_dependency( | ||||
| #     link_with: | ||||
| #         shared_library('zilogmczdecoderlib', | ||||
| #         [ 'lib/zilogmcz/decoder.cc', ], | ||||
| #         dependencies: [fmtlib, felib, decoderlib]), | ||||
| #     include_directories: | ||||
| #         include_directories('lib/zilogmcz') | ||||
| # ) | ||||
|  | ||||
| victor9kdecoderlib = declare_dependency( | ||||
|     link_with: | ||||
|         shared_library('victor9kdecoderlib', | ||||
|         [ 'lib/victor9k/decoder.cc', ], | ||||
|         dependencies: [fmtlib, felib, decoderlib]), | ||||
|     include_directories: | ||||
|         include_directories('lib/victor9k') | ||||
| ) | ||||
| # victor9kdecoderlib = declare_dependency( | ||||
| #     link_with: | ||||
| #         shared_library('victor9kdecoderlib', | ||||
| #         [ 'lib/victor9k/decoder.cc', ], | ||||
| #         dependencies: [fmtlib, felib, decoderlib]), | ||||
| #     include_directories: | ||||
| #         include_directories('lib/victor9k') | ||||
| # ) | ||||
|  | ||||
| executable('fe-erase',             ['src/fe-erase.cc'],             dependencies: [felib, writerlib]) | ||||
| executable('fe-inspect',           ['src/fe-inspect.cc'],           dependencies: [fmtlib, felib, decoderlib, readerlib]) | ||||
| executable('fe-readadfs',          ['src/fe-readadfs.cc'],          dependencies: [fmtlib, felib, decoderlib, readerlib, ibmdecoderlib]) | ||||
| executable('fe-readaeslanier',     ['src/fe-readaeslanier.cc'],     dependencies: [fmtlib, felib, decoderlib, readerlib, aeslanierdecoderlib]) | ||||
| executable('fe-readamiga',         ['src/fe-readamiga.cc'],         dependencies: [fmtlib, felib, decoderlib, readerlib, amigadecoderlib]) | ||||
| executable('fe-readampro',         ['src/fe-readampro.cc'],         dependencies: [fmtlib, felib, decoderlib, readerlib, ibmdecoderlib]) | ||||
| executable('fe-readapple2',        ['src/fe-readapple2.cc'],        dependencies: [fmtlib, felib, decoderlib, readerlib, apple2decoderlib]) | ||||
| # executable('fe-readaeslanier',     ['src/fe-readaeslanier.cc'],     dependencies: [fmtlib, felib, decoderlib, readerlib, aeslanierdecoderlib]) | ||||
| # executable('fe-readamiga',         ['src/fe-readamiga.cc'],         dependencies: [fmtlib, felib, decoderlib, readerlib, amigadecoderlib]) | ||||
| # executable('fe-readampro',         ['src/fe-readampro.cc'],         dependencies: [fmtlib, felib, decoderlib, readerlib, ibmdecoderlib]) | ||||
| # executable('fe-readapple2',        ['src/fe-readapple2.cc'],        dependencies: [fmtlib, felib, decoderlib, readerlib, apple2decoderlib]) | ||||
| executable('fe-readbrother',       ['src/fe-readbrother.cc'],       dependencies: [fmtlib, felib, decoderlib, readerlib, brotherdecoderlib]) | ||||
| executable('fe-readc64',           ['src/fe-readc64.cc'],           dependencies: [fmtlib, felib, decoderlib, readerlib, c64decoderlib]) | ||||
| # executable('fe-readc64',           ['src/fe-readc64.cc'],           dependencies: [fmtlib, felib, decoderlib, readerlib, c64decoderlib]) | ||||
| executable('fe-readdfs',           ['src/fe-readdfs.cc'],           dependencies: [fmtlib, felib, decoderlib, readerlib, ibmdecoderlib]) | ||||
| executable('fe-readf85',           ['src/fe-readf85.cc'],           dependencies: [fmtlib, felib, decoderlib, readerlib, f85decoderlib]) | ||||
| executable('fe-readfb100',         ['src/fe-readfb100.cc'],         dependencies: [fmtlib, felib, decoderlib, readerlib, fb100decoderlib]) | ||||
| # executable('fe-readf85',           ['src/fe-readf85.cc'],           dependencies: [fmtlib, felib, decoderlib, readerlib, f85decoderlib]) | ||||
| # executable('fe-readfb100',         ['src/fe-readfb100.cc'],         dependencies: [fmtlib, felib, decoderlib, readerlib, fb100decoderlib]) | ||||
| executable('fe-readibm',           ['src/fe-readibm.cc'],           dependencies: [fmtlib, felib, decoderlib, readerlib, ibmdecoderlib]) | ||||
| executable('fe-readmac',           ['src/fe-readmac.cc'],           dependencies: [fmtlib, felib, decoderlib, readerlib, macdecoderlib]) | ||||
| executable('fe-readzilogmcz',      ['src/fe-readzilogmcz.cc'],      dependencies: [fmtlib, felib, decoderlib, readerlib, zilogmczdecoderlib]) | ||||
| executable('fe-readvictor9k',      ['src/fe-readvictor9k.cc'],      dependencies: [fmtlib, felib, decoderlib, readerlib, victor9kdecoderlib]) | ||||
| # executable('fe-readmac',           ['src/fe-readmac.cc'],           dependencies: [fmtlib, felib, decoderlib, readerlib, macdecoderlib]) | ||||
| # executable('fe-readzilogmcz',      ['src/fe-readzilogmcz.cc'],      dependencies: [fmtlib, felib, decoderlib, readerlib, zilogmczdecoderlib]) | ||||
| # executable('fe-readvictor9k',      ['src/fe-readvictor9k.cc'],      dependencies: [fmtlib, felib, decoderlib, readerlib, victor9kdecoderlib]) | ||||
| executable('fe-rpm',               ['src/fe-rpm.cc'],               dependencies: [fmtlib, felib]) | ||||
| executable('fe-seek',              ['src/fe-seek.cc'],              dependencies: [fmtlib, felib]) | ||||
| executable('fe-testbulktransport', ['src/fe-testbulktransport.cc'], dependencies: [fmtlib, felib]) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user