Add a skeleton for the AES Lanier disks.

This commit is contained in:
David Given
2019-03-02 22:40:59 +01:00
parent cf81acd8a5
commit 4eaca91a44
5 changed files with 100 additions and 4 deletions

18
lib/aeslanier/aeslanier.h Normal file
View File

@@ -0,0 +1,18 @@
#ifndef AESLANIER_H
#define AESLANIER_H
class Sector;
class Fluxmap;
class AesLanierDecoder : public AbstractDecoder
{
public:
virtual ~AesLanierDecoder() {}
SectorVector decodeToSectors(
const RawRecordVector& rawRecords, unsigned physicalTrack);
nanoseconds_t guessClock(Fluxmap& fluxmap) const;
int recordMatcher(uint64_t fifo) const;
};
#endif

40
lib/aeslanier/decoder.cc Normal file
View File

@@ -0,0 +1,40 @@
#include "globals.h"
#include "decoders.h"
#include "aeslanier.h"
#include "crc.h"
#include "fluxmap.h"
#include "sector.h"
#include "bytes.h"
#include <string.h>
/* Aaaah, M2FM, the encoding which time forgot! Justly so. It's like MFM, but not.
* Data bits are written in the middle of the cell. Clock bits are written at the
* beginnign of
SectorVector AesLanierDecoder::decodeToSectors(const RawRecordVector& rawRecords, unsigned)
{
std::vector<std::unique_ptr<Sector>> sectors;
for (auto& rawrecord : rawRecords)
{
const auto& rawdata = rawrecord->data;
const auto& rawbytes = toBytes(rawdata);
const auto& bytes = decodeFmMfm(rawdata);
}
return sectors;
}
nanoseconds_t AesLanierDecoder::guessClock(Fluxmap& fluxmap) const
{
return fluxmap.guessClock() / 2;
}
int AesLanierDecoder::recordMatcher(uint64_t fifo) const
{
uint64_t masked = fifo & 0xffffffffffffULL;
// if (masked == AMIGA_SECTOR_RECORD)
// return 64;
return 0;
}

View File

@@ -15,10 +15,10 @@ std::vector<uint8_t> decodeFmMfm(const std::vector<bool> bits)
*
* So we just need to extract all the odd bits.
*
* MFM is slightly more complicated, where the first bit of each pair can
* be either 0 or 1... but the second bit is always the data bit, and at
* this point we simply don't care what the first bit is, so decoding MFM
* uses just the same code!
* MFM and M2FM are slightly more complicated, where the first bit of each
* pair can be either 0 or 1... but the second bit is always the data bit,
* and at this point we simply don't care what the first bit is, so
* decoding MFM uses just the same code!
*/
std::vector<uint8_t> bytes;

View File

@@ -85,6 +85,15 @@ encoderlib = shared_library('encoderlib',
link_with: [felib, fmtlib]
)
aeslanierdecoderlib = shared_library('aeslanierdecoderlib',
[
'lib/aeslanier/decoder.cc',
],
include_directories: [feinc, fmtinc, decoderinc],
link_with: [felib, fmtlib, decoderlib]
)
aeslanierinc = include_directories('lib/aeslanier')
amigadecoderlib = shared_library('amigadecoderlib',
[
'lib/amiga/decoder.cc',
@@ -158,6 +167,7 @@ victor9kinc = include_directories('lib/victor9k')
executable('fe-erase', ['src/fe-erase.cc'], include_directories: [feinc], link_with: [felib, writerlib])
executable('fe-inspect', ['src/fe-inspect.cc'], include_directories: [feinc, fmtinc, decoderinc], link_with: [felib, readerlib, decoderlib, fmtlib])
executable('fe-readadfs', ['src/fe-readadfs.cc'], include_directories: [feinc, fmtinc, decoderinc, ibminc], link_with: [felib, readerlib, decoderlib, ibmdecoderlib, fmtlib])
executable('fe-readaeslanier', ['src/fe-readaeslanier.cc'], include_directories: [feinc, fmtinc, decoderinc, aeslanierinc], link_with: [felib, readerlib, decoderlib, aeslanierdecoderlib, fmtlib])
executable('fe-readamiga', ['src/fe-readamiga.cc'], include_directories: [feinc, fmtinc, decoderinc, amigainc], link_with: [felib, readerlib, decoderlib, amigadecoderlib, fmtlib])
executable('fe-readampro', ['src/fe-readampro.cc'], include_directories: [feinc, fmtinc, decoderinc, ibminc], link_with: [felib, readerlib, decoderlib, ibmdecoderlib, fmtlib])
executable('fe-readapple2', ['src/fe-readapple2.cc'], include_directories: [feinc, fmtinc, decoderinc, apple2inc], link_with: [felib, readerlib, decoderlib, apple2decoderlib, fmtlib])

28
src/fe-readaeslanier.cc Normal file
View File

@@ -0,0 +1,28 @@
#include "globals.h"
#include "flags.h"
#include "reader.h"
#include "fluxmap.h"
#include "decoders.h"
#include "image.h"
#include "sector.h"
#include "sectorset.h"
#include "record.h"
#include "aeslanier.h"
#include <fmt/format.h>
static StringFlag outputFilename(
{ "--output", "-o" },
"The output image file to write to.",
"aeslanier.img");
int main(int argc, const char* argv[])
{
setReaderDefaultSource(":t=0-79:s=0");
setReaderRevolutions(2);
Flag::parseFlags(argc, argv);
AesLanierDecoder decoder;
readDiskCommand(decoder, outputFilename);
return 0;
}