mirror of
https://github.com/davidgiven/fluxengine.git
synced 2025-10-31 11:17:01 -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