104 lines
2.3 KiB
C
104 lines
2.3 KiB
C
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#define DEBUG_PRINTF(...) printf(__VA_ARGS__)
|
|
#include "mfm_impl.h"
|
|
|
|
uint8_t flux[] = {
|
|
#include "test_flux.h"
|
|
};
|
|
|
|
enum { sector_count = 18 };
|
|
enum { ibmpc_io_block_size = 512 };
|
|
uint8_t track_buf[sector_count * ibmpc_io_block_size];
|
|
uint8_t validity[sector_count];
|
|
|
|
mfm_io_t io = {
|
|
.T1_nom = 2,
|
|
.T2_max = 5,
|
|
.T3_max = 7,
|
|
.pulses = flux,
|
|
.n_pulses = sizeof(flux),
|
|
.sectors = track_buf,
|
|
.sector_validity = validity,
|
|
.n_sectors = sector_count,
|
|
.n = 2,
|
|
.settings = &standard_mfm,
|
|
.encode_raw = mfm_io_encode_raw_mfm,
|
|
};
|
|
|
|
static void flux_bins(mfm_io_t *io) {
|
|
io->pos = 0;
|
|
int bins[3] = {};
|
|
while (!mfm_io_eof(io)) {
|
|
bins[mfm_io_read_symbol(io)]++;
|
|
}
|
|
printf("Flux bins: %d %d %d\n", bins[0], bins[1], bins[2]);
|
|
}
|
|
|
|
static void dump_flux_compact(const char *filename, mfm_io_t *io) {
|
|
FILE *f = fopen(filename, "w");
|
|
io->pos = 0;
|
|
while (!mfm_io_eof(io)) {
|
|
int b = io->pulses[io->pos++];
|
|
for (int i = 8; i-- > 0;) {
|
|
fputc('0' + ((b >> i) & 1), f);
|
|
};
|
|
fputc(io->pos % 8 == 0 ? '\n' : ' ', f);
|
|
}
|
|
fclose(f);
|
|
}
|
|
static void dump_flux(const char *filename, mfm_io_t *io) {
|
|
FILE *f = fopen(filename, "w");
|
|
io->pos = 0;
|
|
uint32_t state = 0;
|
|
while (!mfm_io_eof(io)) {
|
|
int s = mfm_io_read_symbol(io);
|
|
state = ((state << 2) | s) & mfm_io_triple_mark_mask;
|
|
fprintf(f, "10");
|
|
if (s > mfm_io_pulse_10) {
|
|
fprintf(f, "0");
|
|
}
|
|
if (s > mfm_io_pulse_100) {
|
|
fprintf(f, "0");
|
|
}
|
|
if (state == mfm_io_triple_mark_magic) {
|
|
DEBUG_PRINTF("triple mark @%zd\n", io->pos);
|
|
fprintf(f, "\n");
|
|
}
|
|
}
|
|
fclose(f);
|
|
}
|
|
|
|
int main() {
|
|
flux_bins(&io);
|
|
printf("Decoded %zd sectors\n", decode_track_mfm(&io));
|
|
|
|
dump_flux("flux0", &io);
|
|
|
|
memset(flux, 0, sizeof(flux));
|
|
|
|
#if 0
|
|
for (size_t i = 0; i < sizeof(track_buf); i++)
|
|
track_buf[i] = i & 0xff;
|
|
#endif
|
|
|
|
printf("Create new flux data\n");
|
|
encode_track_mfm(&io);
|
|
dump_flux("flux1", &io);
|
|
|
|
memset(track_buf, 0, sizeof(track_buf));
|
|
|
|
io.n_valid = 0;
|
|
memset(validity, 0, sizeof(validity));
|
|
flux_bins(&io);
|
|
size_t decoded = decode_track_mfm(&io);
|
|
printf("Decoded %zd sectors\n", decoded);
|
|
|
|
io.encode_compact = true;
|
|
encode_track_mfm(&io);
|
|
dump_flux_compact("flux2", &io);
|
|
|
|
return decoded != 18;
|
|
}
|