Update fdi2raw
This commit is contained in:
@@ -20,7 +20,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright 2001-2004 Toni Wilen.
|
* Copyright 2001-2004 Toni Wilen.
|
||||||
* Copyright 2001-2004 Vincent Joguin.
|
* Copyright 2001-2004 Vincent Joguin.
|
||||||
* Copyright 2001 Thomas Harte.
|
* Copyright 2001-2016 Thomas Harte.
|
||||||
*/
|
*/
|
||||||
#define STATIC_INLINE
|
#define STATIC_INLINE
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
@@ -65,7 +65,7 @@ fdi2raw_log(const char *fmt, ...)
|
|||||||
#ifdef ENABLE_FDI2RAW_LOG
|
#ifdef ENABLE_FDI2RAW_LOG
|
||||||
# ifdef DEBUG
|
# ifdef DEBUG
|
||||||
static char *
|
static char *
|
||||||
datalog(uae_u8 *src, int len)
|
datalog(uint8_t *src, int len)
|
||||||
{
|
{
|
||||||
static char buf[1000];
|
static char buf[1000];
|
||||||
static int offset;
|
static int offset;
|
||||||
@@ -88,7 +88,7 @@ datalog(uae_u8 *src, int len)
|
|||||||
}
|
}
|
||||||
# else
|
# else
|
||||||
static char *
|
static char *
|
||||||
datalog(uae_u8 *src, int len)
|
datalog(uint8_t *src, int len)
|
||||||
{
|
{
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
@@ -130,37 +130,38 @@ fdi_malloc(int size)
|
|||||||
#define MAX_TRACKS 166
|
#define MAX_TRACKS 166
|
||||||
|
|
||||||
struct fdi_cache {
|
struct fdi_cache {
|
||||||
uae_u32 *avgp, *minp, *maxp;
|
uint32_t *avgp, *minp, *maxp;
|
||||||
uae_u8 *idxp;
|
uint8_t *idxp;
|
||||||
int avg_free, idx_free, min_free, max_free;
|
int avg_free, idx_free, min_free, max_free;
|
||||||
uae_u32 totalavg, pulses, maxidx, indexoffset;
|
uint32_t totalavg, pulses, maxidx, indexoffset;
|
||||||
int weakbits;
|
int weakbits;
|
||||||
int lowlevel;
|
int lowlevel;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct fdi {
|
struct fdi {
|
||||||
uae_u8 *track_src_buffer;
|
uint8_t *track_src_buffer;
|
||||||
uae_u8 *track_src;
|
uint8_t *track_src;
|
||||||
int track_src_len;
|
int32_t track_src_len;
|
||||||
uae_u8 *track_dst_buffer;
|
uint8_t *track_dst_buffer;
|
||||||
uae_u8 *track_dst;
|
uint8_t *track_dst;
|
||||||
uae_u16 *track_dst_buffer_timing;
|
uint16_t *track_dst_buffer_timing;
|
||||||
uae_u8 track_len;
|
uint8_t track_len;
|
||||||
uae_u8 track_type;
|
uint8_t track_type;
|
||||||
int current_track;
|
int current_track;
|
||||||
int last_track;
|
int last_track;
|
||||||
int last_head;
|
int last_head;
|
||||||
int rotation_speed;
|
int rotation_speed;
|
||||||
int bit_rate;
|
int bit_rate;
|
||||||
int disk_type;
|
int disk_type;
|
||||||
int write_protect;
|
bool write_protect;
|
||||||
int err;
|
int reversed_side;
|
||||||
uae_u8 header[2048];
|
int err;
|
||||||
int track_offsets[MAX_TRACKS];
|
uint8_t header[2048];
|
||||||
FILE *file;
|
int32_t track_offsets[MAX_TRACKS];
|
||||||
int out;
|
FILE *file;
|
||||||
int mfmsync_offset;
|
int out;
|
||||||
int *mfmsync_buffer;
|
int mfmsync_offset;
|
||||||
|
int *mfmsync_buffer;
|
||||||
/* sector described only */
|
/* sector described only */
|
||||||
int index_offset;
|
int index_offset;
|
||||||
int encoding_type;
|
int encoding_type;
|
||||||
@@ -172,7 +173,7 @@ struct fdi {
|
|||||||
#define get_u32(x) ((((x)[0]) << 24) | (((x)[1]) << 16) | (((x)[2]) << 8) | ((x)[3]))
|
#define get_u32(x) ((((x)[0]) << 24) | (((x)[1]) << 16) | (((x)[2]) << 8) | ((x)[3]))
|
||||||
#define get_u24(x) ((((x)[0]) << 16) | (((x)[1]) << 8) | ((x)[2]))
|
#define get_u24(x) ((((x)[0]) << 16) | (((x)[1]) << 8) | ((x)[2]))
|
||||||
STATIC_INLINE void
|
STATIC_INLINE void
|
||||||
put_u32(uae_u8 *d, uae_u32 v)
|
put_u32(uint8_t *d, uint32_t v)
|
||||||
{
|
{
|
||||||
d[0] = v >> 24;
|
d[0] = v >> 24;
|
||||||
d[1] = v >> 16;
|
d[1] = v >> 16;
|
||||||
@@ -181,16 +182,16 @@ put_u32(uae_u8 *d, uae_u32 v)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct node {
|
struct node {
|
||||||
uae_u16 v;
|
uint16_t v;
|
||||||
struct node *left;
|
struct node *left;
|
||||||
struct node *right;
|
struct node *right;
|
||||||
};
|
};
|
||||||
typedef struct node NODE;
|
typedef struct node NODE;
|
||||||
|
|
||||||
static uae_u8 temp, temp2;
|
static uint8_t temp, temp2;
|
||||||
|
|
||||||
static uae_u8 *
|
static uint8_t *
|
||||||
expand_tree(uae_u8 *stream, NODE *node)
|
expand_tree(uint8_t *stream, NODE *node)
|
||||||
{
|
{
|
||||||
if (temp & temp2) {
|
if (temp & temp2) {
|
||||||
if (node->left) {
|
if (node->left) {
|
||||||
@@ -208,7 +209,7 @@ expand_tree(uae_u8 *stream, NODE *node)
|
|||||||
}
|
}
|
||||||
return stream;
|
return stream;
|
||||||
} else {
|
} else {
|
||||||
uae_u8 *stream_temp;
|
uint8_t *stream_temp;
|
||||||
temp2 >>= 1;
|
temp2 >>= 1;
|
||||||
if (!temp2) {
|
if (!temp2) {
|
||||||
temp = *stream++;
|
temp = *stream++;
|
||||||
@@ -223,27 +224,27 @@ expand_tree(uae_u8 *stream, NODE *node)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static uae_u8 *
|
static uint8_t *
|
||||||
values_tree8(uae_u8 *stream, NODE *node)
|
values_tree8(uint8_t *stream, NODE *node)
|
||||||
{
|
{
|
||||||
if (node->left == 0) {
|
if (node->left == 0) {
|
||||||
node->v = *stream++;
|
node->v = *stream++;
|
||||||
return stream;
|
return stream;
|
||||||
} else {
|
} else {
|
||||||
uae_u8 *stream_temp = values_tree8(stream, node->left);
|
uint8_t *stream_temp = values_tree8(stream, node->left);
|
||||||
return values_tree8(stream_temp, node->right);
|
return values_tree8(stream_temp, node->right);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static uae_u8 *
|
static uint8_t *
|
||||||
values_tree16(uae_u8 *stream, NODE *node)
|
values_tree16(uint8_t *stream, NODE *node)
|
||||||
{
|
{
|
||||||
if (node->left == 0) {
|
if (node->left == 0) {
|
||||||
uae_u16 high_8_bits = (*stream++) << 8;
|
uint16_t high_8_bits = (*stream++) << 8;
|
||||||
node->v = high_8_bits | (*stream++);
|
node->v = high_8_bits | (*stream++);
|
||||||
return stream;
|
return stream;
|
||||||
} else {
|
} else {
|
||||||
uae_u8 *stream_temp = values_tree16(stream, node->left);
|
uint8_t *stream_temp = values_tree16(stream, node->left);
|
||||||
return values_tree16(stream_temp, node->right);
|
return values_tree16(stream_temp, node->right);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -258,16 +259,18 @@ free_nodes(NODE *node)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static uae_u32
|
/// @returns the 32-bit sign extended version of the 16-bit value in the low part of @c v.
|
||||||
sign_extend16(uae_u32 v)
|
static uint32_t
|
||||||
|
sign_extend16(uint32_t v)
|
||||||
{
|
{
|
||||||
if (v & 0x8000)
|
if (v & 0x8000)
|
||||||
v |= 0xffff0000;
|
v |= 0xffff0000;
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uae_u32
|
/// @returns the 32-bit sign extended version of the 8-bit value in the low part of @c v.
|
||||||
sign_extend8(uae_u32 v)
|
static uint32_t
|
||||||
|
sign_extend8(uint32_t v)
|
||||||
{
|
{
|
||||||
if (v & 0x80)
|
if (v & 0x80)
|
||||||
v |= 0xffffff00;
|
v |= 0xffffff00;
|
||||||
@@ -275,12 +278,12 @@ sign_extend8(uae_u32 v)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fdi_decode(uae_u8 *stream, int size, uae_u8 *out)
|
fdi_decode(uint8_t *stream, int size, uint8_t *out)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
uae_u8 sign_extend, sixteen_bit, sub_stream_shift;
|
uint8_t sign_extend, sixteen_bit, sub_stream_shift;
|
||||||
NODE root;
|
NODE root;
|
||||||
NODE *current_node;
|
NODE *current_node;
|
||||||
|
|
||||||
memset(out, 0, size * 4);
|
memset(out, 0, size * 4);
|
||||||
sub_stream_shift = 1;
|
sub_stream_shift = 1;
|
||||||
@@ -308,9 +311,9 @@ fdi_decode(uae_u8 *stream, int size, uae_u8 *out)
|
|||||||
/* sub-stream data decode */
|
/* sub-stream data decode */
|
||||||
temp2 = 0;
|
temp2 = 0;
|
||||||
for (i = 0; i < size; i++) {
|
for (i = 0; i < size; i++) {
|
||||||
uae_u32 v;
|
uint32_t v;
|
||||||
uae_u8 decode = 1;
|
uint8_t decode = 1;
|
||||||
current_node = &root;
|
current_node = &root;
|
||||||
while (decode) {
|
while (decode) {
|
||||||
if (current_node->left == 0) {
|
if (current_node->left == 0) {
|
||||||
decode = 0;
|
decode = 0;
|
||||||
@@ -326,7 +329,7 @@ fdi_decode(uae_u8 *stream, int size, uae_u8 *out)
|
|||||||
current_node = current_node->left;
|
current_node = current_node->left;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
v = ((uae_u32 *) out)[i];
|
v = ((uint32_t *) out)[i];
|
||||||
if (sign_extend) {
|
if (sign_extend) {
|
||||||
if (sixteen_bit)
|
if (sixteen_bit)
|
||||||
v |= sign_extend16(current_node->v) << sub_stream_shift;
|
v |= sign_extend16(current_node->v) << sub_stream_shift;
|
||||||
@@ -335,7 +338,7 @@ fdi_decode(uae_u8 *stream, int size, uae_u8 *out)
|
|||||||
} else {
|
} else {
|
||||||
v |= current_node->v << sub_stream_shift;
|
v |= current_node->v << sub_stream_shift;
|
||||||
}
|
}
|
||||||
((uae_u32 *) out)[i] = v;
|
((uint32_t *) out)[i] = v;
|
||||||
}
|
}
|
||||||
free_nodes(root.left);
|
free_nodes(root.left);
|
||||||
root.left = 0;
|
root.left = 0;
|
||||||
@@ -457,7 +460,7 @@ bit_dedrop(FDI *fdi)
|
|||||||
|
|
||||||
/* add one byte */
|
/* add one byte */
|
||||||
static void
|
static void
|
||||||
byte_add(FDI *fdi, uae_u8 v)
|
byte_add(FDI *fdi, uint8_t v)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 7; i >= 0; i--)
|
for (i = 7; i >= 0; i--)
|
||||||
@@ -465,14 +468,14 @@ byte_add(FDI *fdi, uae_u8 v)
|
|||||||
}
|
}
|
||||||
/* add one word */
|
/* add one word */
|
||||||
static void
|
static void
|
||||||
word_add(FDI *fdi, uae_u16 v)
|
word_add(FDI *fdi, uint16_t v)
|
||||||
{
|
{
|
||||||
byte_add(fdi, (uae_u8) (v >> 8));
|
byte_add(fdi, (uint8_t) (v >> 8));
|
||||||
byte_add(fdi, (uae_u8) v);
|
byte_add(fdi, (uint8_t) v);
|
||||||
}
|
}
|
||||||
/* add one byte and mfm encode it */
|
/* add one byte and mfm encode it */
|
||||||
static void
|
static void
|
||||||
byte_mfm_add(FDI *fdi, uae_u8 v)
|
byte_mfm_add(FDI *fdi, uint8_t v)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 7; i >= 0; i--)
|
for (i = 7; i >= 0; i--)
|
||||||
@@ -480,7 +483,7 @@ byte_mfm_add(FDI *fdi, uae_u8 v)
|
|||||||
}
|
}
|
||||||
/* add multiple bytes and mfm encode them */
|
/* add multiple bytes and mfm encode them */
|
||||||
static void
|
static void
|
||||||
bytes_mfm_add(FDI *fdi, uae_u8 v, int len)
|
bytes_mfm_add(FDI *fdi, uint8_t v, int len)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < len; i++)
|
for (i = 0; i < len; i++)
|
||||||
@@ -488,7 +491,7 @@ bytes_mfm_add(FDI *fdi, uae_u8 v, int len)
|
|||||||
}
|
}
|
||||||
/* add one mfm encoded word and re-mfm encode it */
|
/* add one mfm encoded word and re-mfm encode it */
|
||||||
static void
|
static void
|
||||||
word_post_mfm_add(FDI *fdi, uae_u16 v)
|
word_post_mfm_add(FDI *fdi, uint16_t v)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 14; i >= 0; i -= 2)
|
for (i = 14; i >= 0; i -= 2)
|
||||||
@@ -529,8 +532,8 @@ s04(FDI *fdi)
|
|||||||
static void
|
static void
|
||||||
s08(FDI *fdi)
|
s08(FDI *fdi)
|
||||||
{
|
{
|
||||||
int bytes = *fdi->track_src++;
|
int bytes = *fdi->track_src++;
|
||||||
uae_u8 byte = *fdi->track_src++;
|
uint8_t byte = *fdi->track_src++;
|
||||||
if (bytes == 0)
|
if (bytes == 0)
|
||||||
bytes = 256;
|
bytes = 256;
|
||||||
fdi2raw_log("s08:len=%d,data=%02.2X", bytes, byte);
|
fdi2raw_log("s08:len=%d,data=%02.2X", bytes, byte);
|
||||||
@@ -541,8 +544,8 @@ s08(FDI *fdi)
|
|||||||
static void
|
static void
|
||||||
s09(FDI *fdi)
|
s09(FDI *fdi)
|
||||||
{
|
{
|
||||||
int bytes = *fdi->track_src++;
|
int bytes = *fdi->track_src++;
|
||||||
uae_u8 byte = *fdi->track_src++;
|
uint8_t byte = *fdi->track_src++;
|
||||||
if (bytes == 0)
|
if (bytes == 0)
|
||||||
bytes = 256;
|
bytes = 256;
|
||||||
bit_drop_next(fdi);
|
bit_drop_next(fdi);
|
||||||
@@ -554,8 +557,8 @@ s09(FDI *fdi)
|
|||||||
static void
|
static void
|
||||||
s0a(FDI *fdi)
|
s0a(FDI *fdi)
|
||||||
{
|
{
|
||||||
int i, bits = (fdi->track_src[0] << 8) | fdi->track_src[1];
|
int i, bits = (fdi->track_src[0] << 8) | fdi->track_src[1];
|
||||||
uae_u8 b;
|
uint8_t b;
|
||||||
fdi->track_src += 2;
|
fdi->track_src += 2;
|
||||||
fdi2raw_log("s0a:bits=%d,data=%s", bits, datalog(fdi->track_src, (bits + 7) / 8));
|
fdi2raw_log("s0a:bits=%d,data=%s", bits, datalog(fdi->track_src, (bits + 7) / 8));
|
||||||
while (bits >= 8) {
|
while (bits >= 8) {
|
||||||
@@ -575,8 +578,8 @@ s0a(FDI *fdi)
|
|||||||
static void
|
static void
|
||||||
s0b(FDI *fdi)
|
s0b(FDI *fdi)
|
||||||
{
|
{
|
||||||
int i, bits = ((fdi->track_src[0] << 8) | fdi->track_src[1]) + 65536;
|
int i, bits = ((fdi->track_src[0] << 8) | fdi->track_src[1]) + 65536;
|
||||||
uae_u8 b;
|
uint8_t b;
|
||||||
fdi->track_src += 2;
|
fdi->track_src += 2;
|
||||||
fdi2raw_log("s0b:bits=%d,data=%s", bits, datalog(fdi->track_src, (bits + 7) / 8));
|
fdi2raw_log("s0b:bits=%d,data=%s", bits, datalog(fdi->track_src, (bits + 7) / 8));
|
||||||
while (bits >= 8) {
|
while (bits >= 8) {
|
||||||
@@ -596,8 +599,8 @@ s0b(FDI *fdi)
|
|||||||
static void
|
static void
|
||||||
s0c(FDI *fdi)
|
s0c(FDI *fdi)
|
||||||
{
|
{
|
||||||
int i, bits = (fdi->track_src[0] << 8) | fdi->track_src[1];
|
int i, bits = (fdi->track_src[0] << 8) | fdi->track_src[1];
|
||||||
uae_u8 b;
|
uint8_t b;
|
||||||
fdi->track_src += 2;
|
fdi->track_src += 2;
|
||||||
bit_drop_next(fdi);
|
bit_drop_next(fdi);
|
||||||
fdi2raw_log("s0c:bits=%d,data=%s", bits, datalog(fdi->track_src, (bits + 7) / 8));
|
fdi2raw_log("s0c:bits=%d,data=%s", bits, datalog(fdi->track_src, (bits + 7) / 8));
|
||||||
@@ -618,8 +621,8 @@ s0c(FDI *fdi)
|
|||||||
static void
|
static void
|
||||||
s0d(FDI *fdi)
|
s0d(FDI *fdi)
|
||||||
{
|
{
|
||||||
int i, bits = ((fdi->track_src[0] << 8) | fdi->track_src[1]) + 65536;
|
int i, bits = ((fdi->track_src[0] << 8) | fdi->track_src[1]) + 65536;
|
||||||
uae_u8 b;
|
uint8_t b;
|
||||||
fdi->track_src += 2;
|
fdi->track_src += 2;
|
||||||
bit_drop_next(fdi);
|
bit_drop_next(fdi);
|
||||||
fdi2raw_log("s0d:bits=%d,data=%s", bits, datalog(fdi->track_src, (bits + 7) / 8));
|
fdi2raw_log("s0d:bits=%d,data=%s", bits, datalog(fdi->track_src, (bits + 7) / 8));
|
||||||
@@ -643,7 +646,7 @@ s0d(FDI *fdi)
|
|||||||
|
|
||||||
/* just for testing integrity of Amiga sectors */
|
/* just for testing integrity of Amiga sectors */
|
||||||
|
|
||||||
/*static void rotateonebit (uae_u8 *start, uae_u8 *end, int shift)
|
/*static void rotateonebit (uint8_t *start, uint8_t *end, int shift)
|
||||||
{
|
{
|
||||||
if (shift == 0)
|
if (shift == 0)
|
||||||
return;
|
return;
|
||||||
@@ -654,21 +657,21 @@ s0d(FDI *fdi)
|
|||||||
}
|
}
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
/*static uae_u16 getmfmword (uae_u8 *mbuf)
|
/*static uint16_t getmfmword (uint8_t *mbuf)
|
||||||
{
|
{
|
||||||
uae_u32 v;
|
uint32_t v;
|
||||||
|
|
||||||
v = (mbuf[0] << 8) | (mbuf[1] << 0);
|
v = (mbuf[0] << 8) | (mbuf[1] << 0);
|
||||||
if (check_offset == 0)
|
if (check_offset == 0)
|
||||||
return v;
|
return (uint16_t)v;
|
||||||
v <<= 8;
|
v <<= 8;
|
||||||
v |= mbuf[2];
|
v |= mbuf[2];
|
||||||
v >>= check_offset;
|
v >>= check_offset;
|
||||||
return v;
|
return (uint16_t)v;
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
#define MFMMASK 0x55555555
|
#define MFMMASK 0x55555555
|
||||||
/*static uae_u32 getmfmlong (uae_u8 * mbuf)
|
/*static uint32_t getmfmlong (uint8_t * mbuf)
|
||||||
{
|
{
|
||||||
return ((getmfmword (mbuf) << 16) | getmfmword (mbuf + 2)) & MFMMASK;
|
return ((getmfmword (mbuf) << 16) | getmfmword (mbuf + 2)) & MFMMASK;
|
||||||
}*/
|
}*/
|
||||||
@@ -680,13 +683,13 @@ static int amiga_check_track (FDI *fdi)
|
|||||||
int fwlen = fdi->out / 8;
|
int fwlen = fdi->out / 8;
|
||||||
int length = 2 * fwlen;
|
int length = 2 * fwlen;
|
||||||
int drvsec = 11;
|
int drvsec = 11;
|
||||||
uae_u32 odd, even, chksum, id, dlong;
|
uint32_t odd, even, chksum, id, dlong;
|
||||||
uae_u8 *secdata;
|
uint8_t *secdata;
|
||||||
uae_u8 secbuf[544];
|
uint8_t secbuf[544];
|
||||||
uae_u8 bigmfmbuf[60000];
|
uint8_t bigmfmbuf[60000];
|
||||||
uae_u8 *mbuf, *mbuf2, *mend;
|
uint8_t *mbuf, *mbuf2, *mend;
|
||||||
char sectable[22];
|
char sectable[22];
|
||||||
uae_u8 *raw = fdi->track_dst_buffer;
|
uint8_t *raw = fdi->track_dst_buffer;
|
||||||
int slabel, off;
|
int slabel, off;
|
||||||
int ok = 1;
|
int ok = 1;
|
||||||
|
|
||||||
@@ -782,7 +785,7 @@ static int amiga_check_track (FDI *fdi)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
fdi2raw_log("sector %d header crc ok\n", trackoffs);
|
fdi2raw_log("sector %d header crc ok\n", trackoffs);
|
||||||
if (((id & 0x00ff0000) >> 16) != (uae_u32)fdi->current_track) {
|
if (((id & 0x00ff0000) >> 16) != (uint32_t)fdi->current_track) {
|
||||||
fdi2raw_log("illegal track number %d <> %d\n",fdi->current_track,(id & 0x00ff0000) >> 16);
|
fdi2raw_log("illegal track number %d <> %d\n",fdi->current_track,(id & 0x00ff0000) >> 16);
|
||||||
ok++;
|
ok++;
|
||||||
mbuf = mbuf2;
|
mbuf = mbuf2;
|
||||||
@@ -798,10 +801,10 @@ static int amiga_check_track (FDI *fdi)
|
|||||||
even = getmfmlong (mbuf + 256 * 2);
|
even = getmfmlong (mbuf + 256 * 2);
|
||||||
mbuf += 2 * 2;
|
mbuf += 2 * 2;
|
||||||
dlong = (odd << 1) | even;
|
dlong = (odd << 1) | even;
|
||||||
*secdata++ = (uae_u8) (dlong >> 24);
|
*secdata++ = (uint8_t) (dlong >> 24);
|
||||||
*secdata++ = (uae_u8) (dlong >> 16);
|
*secdata++ = (uint8_t) (dlong >> 16);
|
||||||
*secdata++ = (uae_u8) (dlong >> 8);
|
*secdata++ = (uint8_t) (dlong >> 8);
|
||||||
*secdata++ = (uae_u8) dlong;
|
*secdata++ = (uint8_t) dlong;
|
||||||
chksum ^= odd ^ even;
|
chksum ^= odd ^ even;
|
||||||
}
|
}
|
||||||
mbuf += 256 * 2;
|
mbuf += 256 * 2;
|
||||||
@@ -831,10 +834,10 @@ static int amiga_check_track (FDI *fdi)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
amiga_data_raw(FDI *fdi, uae_u8 *secbuf, uae_u8 *crc, int len)
|
amiga_data_raw(FDI *fdi, uint8_t *secbuf, uint8_t *crc, int len)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
uae_u8 crcbuf[4];
|
uint8_t crcbuf[4];
|
||||||
|
|
||||||
if (!crc) {
|
if (!crc) {
|
||||||
memset(crcbuf, 0, 4);
|
memset(crcbuf, 0, 4);
|
||||||
@@ -848,11 +851,11 @@ amiga_data_raw(FDI *fdi, uae_u8 *secbuf, uae_u8 *crc, int len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
amiga_data(FDI *fdi, uae_u8 *secbuf)
|
amiga_data(FDI *fdi, uint8_t *secbuf)
|
||||||
{
|
{
|
||||||
uae_u16 mfmbuf[4 + 512];
|
uint16_t mfmbuf[4 + 512];
|
||||||
uae_u32 dodd, deven, dck;
|
uint32_t dodd, deven, dck;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < 512; i += 4) {
|
for (i = 0; i < 512; i += 4) {
|
||||||
deven = ((secbuf[i + 0] << 24) | (secbuf[i + 1] << 16)
|
deven = ((secbuf[i + 0] << 24) | (secbuf[i + 1] << 16)
|
||||||
@@ -860,10 +863,10 @@ amiga_data(FDI *fdi, uae_u8 *secbuf)
|
|||||||
dodd = deven >> 1;
|
dodd = deven >> 1;
|
||||||
deven &= 0x55555555;
|
deven &= 0x55555555;
|
||||||
dodd &= 0x55555555;
|
dodd &= 0x55555555;
|
||||||
mfmbuf[(i >> 1) + 4] = (uae_u16) (dodd >> 16);
|
mfmbuf[(i >> 1) + 4] = (uint16_t) (dodd >> 16);
|
||||||
mfmbuf[(i >> 1) + 5] = (uae_u16) dodd;
|
mfmbuf[(i >> 1) + 5] = (uint16_t) dodd;
|
||||||
mfmbuf[(i >> 1) + 256 + 4] = (uae_u16) (deven >> 16);
|
mfmbuf[(i >> 1) + 256 + 4] = (uint16_t) (deven >> 16);
|
||||||
mfmbuf[(i >> 1) + 256 + 5] = (uae_u16) deven;
|
mfmbuf[(i >> 1) + 256 + 5] = (uint16_t) deven;
|
||||||
}
|
}
|
||||||
dck = 0;
|
dck = 0;
|
||||||
for (i = 4; i < 4 + 512; i += 2)
|
for (i = 4; i < 4 + 512; i += 2)
|
||||||
@@ -872,22 +875,22 @@ amiga_data(FDI *fdi, uae_u8 *secbuf)
|
|||||||
dodd >>= 1;
|
dodd >>= 1;
|
||||||
deven &= 0x55555555;
|
deven &= 0x55555555;
|
||||||
dodd &= 0x55555555;
|
dodd &= 0x55555555;
|
||||||
mfmbuf[0] = (uae_u16) (dodd >> 16);
|
mfmbuf[0] = (uint16_t) (dodd >> 16);
|
||||||
mfmbuf[1] = (uae_u16) dodd;
|
mfmbuf[1] = (uint16_t) dodd;
|
||||||
mfmbuf[2] = (uae_u16) (deven >> 16);
|
mfmbuf[2] = (uint16_t) (deven >> 16);
|
||||||
mfmbuf[3] = (uae_u16) deven;
|
mfmbuf[3] = (uint16_t) deven;
|
||||||
|
|
||||||
for (i = 0; i < 4 + 512; i++)
|
for (i = 0; i < 4 + 512; i++)
|
||||||
word_post_mfm_add(fdi, mfmbuf[i]);
|
word_post_mfm_add(fdi, mfmbuf[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
amiga_sector_header(FDI *fdi, uae_u8 *header, uae_u8 *data, int sector, int untilgap)
|
amiga_sector_header(FDI *fdi, uint8_t *header, uint8_t *data, int sector, int untilgap)
|
||||||
{
|
{
|
||||||
uae_u8 headerbuf[4], databuf[16];
|
uint8_t headerbuf[4], databuf[16];
|
||||||
uae_u32 deven, dodd, hck;
|
uint32_t deven, dodd, hck;
|
||||||
uae_u16 mfmbuf[24];
|
uint16_t mfmbuf[24];
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
byte_mfm_add(fdi, 0);
|
byte_mfm_add(fdi, 0);
|
||||||
byte_mfm_add(fdi, 0);
|
byte_mfm_add(fdi, 0);
|
||||||
@@ -897,9 +900,9 @@ amiga_sector_header(FDI *fdi, uae_u8 *header, uae_u8 *data, int sector, int unti
|
|||||||
memcpy(headerbuf, header, 4);
|
memcpy(headerbuf, header, 4);
|
||||||
} else {
|
} else {
|
||||||
headerbuf[0] = 0xff;
|
headerbuf[0] = 0xff;
|
||||||
headerbuf[1] = (uae_u8) fdi->current_track;
|
headerbuf[1] = (uint8_t) fdi->current_track;
|
||||||
headerbuf[2] = (uae_u8) sector;
|
headerbuf[2] = (uint8_t) sector;
|
||||||
headerbuf[3] = (uae_u8) untilgap;
|
headerbuf[3] = (uint8_t) untilgap;
|
||||||
}
|
}
|
||||||
if (data)
|
if (data)
|
||||||
memcpy(databuf, data, 16);
|
memcpy(databuf, data, 16);
|
||||||
@@ -911,20 +914,20 @@ amiga_sector_header(FDI *fdi, uae_u8 *header, uae_u8 *data, int sector, int unti
|
|||||||
dodd = deven >> 1;
|
dodd = deven >> 1;
|
||||||
deven &= 0x55555555;
|
deven &= 0x55555555;
|
||||||
dodd &= 0x55555555;
|
dodd &= 0x55555555;
|
||||||
mfmbuf[0] = (uae_u16) (dodd >> 16);
|
mfmbuf[0] = (uint16_t) (dodd >> 16);
|
||||||
mfmbuf[1] = (uae_u16) dodd;
|
mfmbuf[1] = (uint16_t) dodd;
|
||||||
mfmbuf[2] = (uae_u16) (deven >> 16);
|
mfmbuf[2] = (uint16_t) (deven >> 16);
|
||||||
mfmbuf[3] = (uae_u16) deven;
|
mfmbuf[3] = (uint16_t) deven;
|
||||||
for (i = 0; i < 16; i += 4) {
|
for (i = 0; i < 16; i += 4) {
|
||||||
deven = ((databuf[i] << 24) | (databuf[i + 1] << 16)
|
deven = ((databuf[i] << 24) | (databuf[i + 1] << 16)
|
||||||
| (databuf[i + 2] << 8) | (databuf[i + 3]));
|
| (databuf[i + 2] << 8) | (databuf[i + 3]));
|
||||||
dodd = deven >> 1;
|
dodd = deven >> 1;
|
||||||
deven &= 0x55555555;
|
deven &= 0x55555555;
|
||||||
dodd &= 0x55555555;
|
dodd &= 0x55555555;
|
||||||
mfmbuf[(i >> 1) + 0 + 4] = (uae_u16) (dodd >> 16);
|
mfmbuf[(i >> 1) + 0 + 4] = (uint16_t) (dodd >> 16);
|
||||||
mfmbuf[(i >> 1) + 0 + 5] = (uae_u16) dodd;
|
mfmbuf[(i >> 1) + 0 + 5] = (uint16_t) dodd;
|
||||||
mfmbuf[(i >> 1) + 8 + 4] = (uae_u16) (deven >> 16);
|
mfmbuf[(i >> 1) + 8 + 4] = (uint16_t) (deven >> 16);
|
||||||
mfmbuf[(i >> 1) + 8 + 5] = (uae_u16) deven;
|
mfmbuf[(i >> 1) + 8 + 5] = (uint16_t) deven;
|
||||||
}
|
}
|
||||||
hck = 0;
|
hck = 0;
|
||||||
for (i = 0; i < 4 + 16; i += 2)
|
for (i = 0; i < 4 + 16; i += 2)
|
||||||
@@ -933,10 +936,10 @@ amiga_sector_header(FDI *fdi, uae_u8 *header, uae_u8 *data, int sector, int unti
|
|||||||
dodd >>= 1;
|
dodd >>= 1;
|
||||||
deven &= 0x55555555;
|
deven &= 0x55555555;
|
||||||
dodd &= 0x55555555;
|
dodd &= 0x55555555;
|
||||||
mfmbuf[20] = (uae_u16) (dodd >> 16);
|
mfmbuf[20] = (uint16_t) (dodd >> 16);
|
||||||
mfmbuf[21] = (uae_u16) dodd;
|
mfmbuf[21] = (uint16_t) dodd;
|
||||||
mfmbuf[22] = (uae_u16) (deven >> 16);
|
mfmbuf[22] = (uint16_t) (deven >> 16);
|
||||||
mfmbuf[23] = (uae_u16) deven;
|
mfmbuf[23] = (uint16_t) deven;
|
||||||
|
|
||||||
for (i = 0; i < 4 + 16 + 4; i++)
|
for (i = 0; i < 4 + 16 + 4; i++)
|
||||||
word_post_mfm_add(fdi, mfmbuf[i]);
|
word_post_mfm_add(fdi, mfmbuf[i]);
|
||||||
@@ -1018,11 +1021,11 @@ s27(FDI *fdi)
|
|||||||
/* IBM */
|
/* IBM */
|
||||||
/* *** */
|
/* *** */
|
||||||
|
|
||||||
static uae_u16
|
static uint16_t
|
||||||
ibm_crc(uae_u8 byte, int reset)
|
ibm_crc(uint8_t byte, int reset)
|
||||||
{
|
{
|
||||||
static uae_u16 crc;
|
static uint16_t crc;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (reset)
|
if (reset)
|
||||||
crc = 0xcdb4;
|
crc = 0xcdb4;
|
||||||
@@ -1042,11 +1045,11 @@ ibm_crc(uae_u8 byte, int reset)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ibm_data(FDI *fdi, uae_u8 *data, uae_u8 *crc, int len)
|
ibm_data(FDI *fdi, uint8_t *data, uint8_t *crc, int len)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
uae_u8 crcbuf[2];
|
uint8_t crcbuf[2];
|
||||||
uae_u16 crcv = 0;
|
uint16_t crcv = 0;
|
||||||
|
|
||||||
word_add(fdi, 0x4489);
|
word_add(fdi, 0x4489);
|
||||||
word_add(fdi, 0x4489);
|
word_add(fdi, 0x4489);
|
||||||
@@ -1059,20 +1062,20 @@ ibm_data(FDI *fdi, uae_u8 *data, uae_u8 *crc, int len)
|
|||||||
}
|
}
|
||||||
if (!crc) {
|
if (!crc) {
|
||||||
crc = crcbuf;
|
crc = crcbuf;
|
||||||
crc[0] = (uae_u8) (crcv >> 8);
|
crc[0] = (uint8_t) (crcv >> 8);
|
||||||
crc[1] = (uae_u8) crcv;
|
crc[1] = (uint8_t) crcv;
|
||||||
}
|
}
|
||||||
byte_mfm_add(fdi, crc[0]);
|
byte_mfm_add(fdi, crc[0]);
|
||||||
byte_mfm_add(fdi, crc[1]);
|
byte_mfm_add(fdi, crc[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ibm_sector_header(FDI *fdi, uae_u8 *data, uae_u8 *crc, int secnum, int pre)
|
ibm_sector_header(FDI *fdi, uint8_t *data, uint8_t *crc, int secnum, int pre)
|
||||||
{
|
{
|
||||||
uae_u8 secbuf[5];
|
uint8_t secbuf[5];
|
||||||
uae_u8 crcbuf[2];
|
uint8_t crcbuf[2];
|
||||||
uae_u16 crcv;
|
uint16_t crcv;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (pre)
|
if (pre)
|
||||||
bytes_mfm_add(fdi, 0, 12);
|
bytes_mfm_add(fdi, 0, 12);
|
||||||
@@ -1081,9 +1084,9 @@ ibm_sector_header(FDI *fdi, uae_u8 *data, uae_u8 *crc, int secnum, int pre)
|
|||||||
word_add(fdi, 0x4489);
|
word_add(fdi, 0x4489);
|
||||||
secbuf[0] = 0xfe;
|
secbuf[0] = 0xfe;
|
||||||
if (secnum >= 0) {
|
if (secnum >= 0) {
|
||||||
secbuf[1] = (uae_u8) (fdi->current_track / 2);
|
secbuf[1] = (uint8_t) (fdi->current_track / 2);
|
||||||
secbuf[2] = (uae_u8) (fdi->current_track % 2);
|
secbuf[2] = (uint8_t) (fdi->current_track % 2);
|
||||||
secbuf[3] = (uae_u8) secnum;
|
secbuf[3] = (uint8_t) secnum;
|
||||||
secbuf[4] = 2;
|
secbuf[4] = 2;
|
||||||
} else {
|
} else {
|
||||||
memcpy(secbuf + 1, data, 4);
|
memcpy(secbuf + 1, data, 4);
|
||||||
@@ -1096,8 +1099,8 @@ ibm_sector_header(FDI *fdi, uae_u8 *data, uae_u8 *crc, int secnum, int pre)
|
|||||||
if (crc) {
|
if (crc) {
|
||||||
memcpy(crcbuf, crc, 2);
|
memcpy(crcbuf, crc, 2);
|
||||||
} else {
|
} else {
|
||||||
crcbuf[0] = (uae_u8) (crcv >> 8);
|
crcbuf[0] = (uint8_t) (crcv >> 8);
|
||||||
crcbuf[1] = (uae_u8) crcv;
|
crcbuf[1] = (uint8_t) crcv;
|
||||||
}
|
}
|
||||||
/* data */
|
/* data */
|
||||||
for (i = 0; i < 5; i++)
|
for (i = 0; i < 5; i++)
|
||||||
@@ -1276,8 +1279,8 @@ track_amiga(struct fdi *fdi, int first_sector, int max_sector)
|
|||||||
static void
|
static void
|
||||||
track_atari_st(struct fdi *fdi, int max_sector)
|
track_atari_st(struct fdi *fdi, int max_sector)
|
||||||
{
|
{
|
||||||
int i, gap3 = 0;
|
int i, gap3 = 0;
|
||||||
uae_u8 *p = fdi->track_src;
|
uint8_t *p = fdi->track_src;
|
||||||
|
|
||||||
switch (max_sector) {
|
switch (max_sector) {
|
||||||
case 9:
|
case 9:
|
||||||
@@ -1301,8 +1304,8 @@ track_atari_st(struct fdi *fdi, int max_sector)
|
|||||||
static void
|
static void
|
||||||
track_pc(struct fdi *fdi, int max_sector)
|
track_pc(struct fdi *fdi, int max_sector)
|
||||||
{
|
{
|
||||||
int i, gap3;
|
int i, gap3;
|
||||||
uae_u8 *p = fdi->track_src;
|
uint8_t *p = fdi->track_src;
|
||||||
|
|
||||||
switch (max_sector) {
|
switch (max_sector) {
|
||||||
case 8:
|
case 8:
|
||||||
@@ -1331,7 +1334,7 @@ track_pc(struct fdi *fdi, int max_sector)
|
|||||||
static void
|
static void
|
||||||
track_amiga_dd(struct fdi *fdi)
|
track_amiga_dd(struct fdi *fdi)
|
||||||
{
|
{
|
||||||
uae_u8 *p = fdi->track_src;
|
uint8_t *p = fdi->track_src;
|
||||||
track_amiga(fdi, fdi->track_len >> 4, 11);
|
track_amiga(fdi, fdi->track_len >> 4, 11);
|
||||||
fdi->track_src = p + (fdi->track_len & 15) * 512;
|
fdi->track_src = p + (fdi->track_len & 15) * 512;
|
||||||
}
|
}
|
||||||
@@ -1339,7 +1342,7 @@ track_amiga_dd(struct fdi *fdi)
|
|||||||
static void
|
static void
|
||||||
track_amiga_hd(struct fdi *fdi)
|
track_amiga_hd(struct fdi *fdi)
|
||||||
{
|
{
|
||||||
uae_u8 *p = fdi->track_src;
|
uint8_t *p = fdi->track_src;
|
||||||
track_amiga(fdi, 0, 22);
|
track_amiga(fdi, 0, 22);
|
||||||
fdi->track_src = p + fdi->track_len * 256;
|
fdi->track_src = p + fdi->track_len * 256;
|
||||||
}
|
}
|
||||||
@@ -1420,8 +1423,8 @@ static int
|
|||||||
handle_sectors_described_track(FDI *fdi)
|
handle_sectors_described_track(FDI *fdi)
|
||||||
{
|
{
|
||||||
#ifdef ENABLE_FDI2RAW_LOG
|
#ifdef ENABLE_FDI2RAW_LOG
|
||||||
int oldout;
|
int oldout;
|
||||||
uae_u8 *start_src = fdi->track_src;
|
uint8_t *start_src = fdi->track_src;
|
||||||
#endif
|
#endif
|
||||||
fdi->encoding_type = *fdi->track_src++;
|
fdi->encoding_type = *fdi->track_src++;
|
||||||
fdi->index_offset = get_u32(fdi->track_src);
|
fdi->index_offset = get_u32(fdi->track_src);
|
||||||
@@ -1454,20 +1457,20 @@ handle_sectors_described_track(FDI *fdi)
|
|||||||
return fdi->out;
|
return fdi->out;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uae_u8 *
|
static uint8_t *
|
||||||
fdi_decompress(int pulses, uae_u8 *sizep, uae_u8 *src, int *dofree)
|
fdi_decompress(int pulses, uint8_t *sizep, uint8_t *src, int *dofree)
|
||||||
{
|
{
|
||||||
uae_u32 size = get_u24(sizep);
|
uint32_t size = get_u24(sizep);
|
||||||
uae_u32 *dst2;
|
uint32_t *dst2;
|
||||||
int len = size & 0x3fffff;
|
int len = size & 0x3fffff;
|
||||||
uae_u8 *dst;
|
uint8_t *dst;
|
||||||
int mode = size >> 22, i;
|
int mode = size >> 22, i;
|
||||||
|
|
||||||
*dofree = 0;
|
*dofree = 0;
|
||||||
if (mode == 0 && pulses * 2 > len)
|
if (mode == 0 && pulses * 2 > len)
|
||||||
mode = 1;
|
mode = 1;
|
||||||
if (mode == 0) {
|
if (mode == 0) {
|
||||||
dst2 = (uae_u32 *) src;
|
dst2 = (uint32_t *) src;
|
||||||
dst = src;
|
dst = src;
|
||||||
for (i = 0; i < pulses; i++) {
|
for (i = 0; i < pulses; i++) {
|
||||||
*dst2++ = get_u32(src);
|
*dst2++ = get_u32(src);
|
||||||
@@ -1484,7 +1487,7 @@ fdi_decompress(int pulses, uae_u8 *sizep, uae_u8 *src, int *dofree)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dumpstream(int track, uae_u8 *stream, int len)
|
dumpstream(int track, uint8_t *stream, int len)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
char name[100];
|
char name[100];
|
||||||
@@ -1499,8 +1502,8 @@ dumpstream(int track, uae_u8 *stream, int len)
|
|||||||
|
|
||||||
static int bitoffset;
|
static int bitoffset;
|
||||||
|
|
||||||
STATIC_INLINE void
|
static inline void
|
||||||
addbit(uae_u8 *p, int bit)
|
addbit(uint8_t *p, int bit)
|
||||||
{
|
{
|
||||||
int off1 = bitoffset / 8;
|
int off1 = bitoffset / 8;
|
||||||
int off2 = bitoffset % 8;
|
int off2 = bitoffset % 8;
|
||||||
@@ -1517,7 +1520,7 @@ struct pulse_sample {
|
|||||||
static int pulse_limitval = 15; /* tolerance of 15% */
|
static int pulse_limitval = 15; /* tolerance of 15% */
|
||||||
static struct pulse_sample psarray[FDI_MAX_ARRAY];
|
static struct pulse_sample psarray[FDI_MAX_ARRAY];
|
||||||
static int array_index;
|
static int array_index;
|
||||||
static unsigned long total;
|
static uint32_t total;
|
||||||
static int totaldiv;
|
static int totaldiv;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1536,7 +1539,7 @@ init_array(uint32_t standard_MFM_2_bit_cell_size, int nb_of_bits)
|
|||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
|
||||||
static void fdi2_decode (FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 *maxp, uae_u8 *idx, int maxidx, int *indexoffsetp, int pulses, int mfm)
|
static void fdi2_decode (FDI *fdi, uint32_t totalavg, uint32_t *avgp, uint32_t *minp, uint32_t *maxp, uint8_t *idx, int maxidx, int *indexoffsetp, int pulses, int mfm)
|
||||||
{
|
{
|
||||||
uint32_t adjust;
|
uint32_t adjust;
|
||||||
uint32_t adjusted_pulse;
|
uint32_t adjusted_pulse;
|
||||||
@@ -1544,9 +1547,9 @@ static void fdi2_decode (FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *mi
|
|||||||
uint32_t standard_MFM_8_bit_cell_size = totalavg / 12500;
|
uint32_t standard_MFM_8_bit_cell_size = totalavg / 12500;
|
||||||
int real_size, i, j, eodat, outstep;
|
int real_size, i, j, eodat, outstep;
|
||||||
int indexoffset = *indexoffsetp;
|
int indexoffset = *indexoffsetp;
|
||||||
uae_u8 *d = fdi->track_dst_buffer;
|
uint8_t *d = fdi->track_dst_buffer;
|
||||||
uae_u16 *pt = fdi->track_dst_buffer_timing;
|
uint16_t *pt = fdi->track_dst_buffer_timing;
|
||||||
uae_u32 ref_pulse, pulse;
|
uint32_t ref_pulse, pulse;
|
||||||
|
|
||||||
/* detects a long-enough stable pulse coming just after another stable pulse */
|
/* detects a long-enough stable pulse coming just after another stable pulse */
|
||||||
i = 1;
|
i = 1;
|
||||||
@@ -1570,8 +1573,8 @@ static void fdi2_decode (FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *mi
|
|||||||
while (outstep < 2) {
|
while (outstep < 2) {
|
||||||
|
|
||||||
/* calculates the current average bitrate from previous decoded data */
|
/* calculates the current average bitrate from previous decoded data */
|
||||||
uae_u32 avg_size = (total << 3) / totaldiv; /* this is the new average size for one MFM bit */
|
uint32_t avg_size = (total << 3) / totaldiv; /* this is the new average size for one MFM bit */
|
||||||
/* uae_u32 avg_size = (uae_u32)((((float)total)*8.0) / ((float)totaldiv)); */
|
/* uint32_t avg_size = (uint32_t)((((float)total)*8.0) / ((float)totaldiv)); */
|
||||||
/* you can try tighter ranges than 25%, or wider ranges. I would probably go for tighter... */
|
/* you can try tighter ranges than 25%, or wider ranges. I would probably go for tighter... */
|
||||||
if ((avg_size < (standard_MFM_8_bit_cell_size - (pulse_limitval * standard_MFM_8_bit_cell_size / 100))) ||
|
if ((avg_size < (standard_MFM_8_bit_cell_size - (pulse_limitval * standard_MFM_8_bit_cell_size / 100))) ||
|
||||||
(avg_size > (standard_MFM_8_bit_cell_size + (pulse_limitval * standard_MFM_8_bit_cell_size / 100)))) {
|
(avg_size > (standard_MFM_8_bit_cell_size + (pulse_limitval * standard_MFM_8_bit_cell_size / 100)))) {
|
||||||
@@ -1641,7 +1644,7 @@ static void fdi2_decode (FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *mi
|
|||||||
addbit (d, 0);
|
addbit (d, 0);
|
||||||
addbit (d, 1);
|
addbit (d, 1);
|
||||||
for (j = 0; j < real_size; j++)
|
for (j = 0; j < real_size; j++)
|
||||||
*pt++ = (uae_u16)(pulse / real_size);
|
*pt++ = (uint16_t)(pulse / real_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* prepares for the next pulse */
|
/* prepares for the next pulse */
|
||||||
@@ -1663,18 +1666,18 @@ static void fdi2_decode (FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *mi
|
|||||||
#else
|
#else
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 *maxp, uae_u8 *idx, int maxidx, int *indexoffsetp, int pulses, int mfm)
|
fdi2_decode(FDI *fdi, uint32_t totalavg, uint32_t *avgp, uint32_t *minp, uint32_t *maxp, uint8_t *idx, int maxidx, int *indexoffsetp, int pulses, int mfm)
|
||||||
{
|
{
|
||||||
uint32_t adjust;
|
uint32_t adjust;
|
||||||
uint32_t adjusted_pulse;
|
uint32_t adjusted_pulse;
|
||||||
uint32_t standard_MFM_2_bit_cell_size = totalavg / 50000;
|
uint32_t standard_MFM_2_bit_cell_size = totalavg / 50000;
|
||||||
uint32_t standard_MFM_8_bit_cell_size = totalavg / 12500;
|
uint32_t standard_MFM_8_bit_cell_size = totalavg / 12500;
|
||||||
int real_size, i, j, nexti, eodat, outstep, randval;
|
int real_size, i, j, nexti, eodat, outstep, randval;
|
||||||
int indexoffset = *indexoffsetp;
|
int indexoffset = *indexoffsetp;
|
||||||
uae_u8 *d = fdi->track_dst_buffer;
|
uint8_t *d = fdi->track_dst_buffer;
|
||||||
uae_u16 *pt = fdi->track_dst_buffer_timing;
|
uint16_t *pt = fdi->track_dst_buffer_timing;
|
||||||
uae_u32 ref_pulse, pulse;
|
uint32_t ref_pulse, pulse;
|
||||||
long jitter;
|
int32_t jitter;
|
||||||
|
|
||||||
/* detects a long-enough stable pulse coming just after another stable pulse */
|
/* detects a long-enough stable pulse coming just after another stable pulse */
|
||||||
i = 1;
|
i = 1;
|
||||||
@@ -1698,8 +1701,8 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 *
|
|||||||
while (outstep < 2) {
|
while (outstep < 2) {
|
||||||
|
|
||||||
/* calculates the current average bitrate from previous decoded data */
|
/* calculates the current average bitrate from previous decoded data */
|
||||||
uae_u32 avg_size = (total << (2 + mfm)) / totaldiv; /* this is the new average size for one MFM bit */
|
uint32_t avg_size = (uint32_t) ((total << (2 + mfm)) / totaldiv); /* this is the new average size for one MFM bit */
|
||||||
/* uae_u32 avg_size = (uae_u32)((((float)total)*((float)(mfm+1))*4.0) / ((float)totaldiv)); */
|
/* uint32_t avg_size = (uint32_t)((((float)total)*((float)(mfm+1))*4.0) / ((float)totaldiv)); */
|
||||||
/* you can try tighter ranges than 25%, or wider ranges. I would probably go for tighter... */
|
/* you can try tighter ranges than 25%, or wider ranges. I would probably go for tighter... */
|
||||||
if ((avg_size < (standard_MFM_8_bit_cell_size - (pulse_limitval * standard_MFM_8_bit_cell_size / 100))) || (avg_size > (standard_MFM_8_bit_cell_size + (pulse_limitval * standard_MFM_8_bit_cell_size / 100)))) {
|
if ((avg_size < (standard_MFM_8_bit_cell_size - (pulse_limitval * standard_MFM_8_bit_cell_size / 100))) || (avg_size > (standard_MFM_8_bit_cell_size + (pulse_limitval * standard_MFM_8_bit_cell_size / 100)))) {
|
||||||
avg_size = standard_MFM_8_bit_cell_size;
|
avg_size = standard_MFM_8_bit_cell_size;
|
||||||
@@ -1711,7 +1714,7 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 *
|
|||||||
/* gets the next long-enough pulse (this may require more than one pulse) */
|
/* gets the next long-enough pulse (this may require more than one pulse) */
|
||||||
pulse = 0;
|
pulse = 0;
|
||||||
while (pulse < ((avg_size / 4) - (avg_size / 16))) {
|
while (pulse < ((avg_size / 4) - (avg_size / 16))) {
|
||||||
uae_u32 avg_pulse, min_pulse, max_pulse;
|
uint32_t avg_pulse, min_pulse, max_pulse;
|
||||||
i++;
|
i++;
|
||||||
if (i >= pulses)
|
if (i >= pulses)
|
||||||
i = 0;
|
i = 0;
|
||||||
@@ -1739,7 +1742,7 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 *
|
|||||||
randval = rand();
|
randval = rand();
|
||||||
if (randval < (RAND_MAX / 2)) {
|
if (randval < (RAND_MAX / 2)) {
|
||||||
if (randval > (RAND_MAX / 4)) {
|
if (randval > (RAND_MAX / 4)) {
|
||||||
if (randval <= (((3LL * RAND_MAX) / 8)))
|
if (randval <= (((3LL * (uint64_t) RAND_MAX) / 8)))
|
||||||
randval = (2 * randval) - (RAND_MAX / 4);
|
randval = (2 * randval) - (RAND_MAX / 4);
|
||||||
else
|
else
|
||||||
randval = (4 * randval) - RAND_MAX;
|
randval = (4 * randval) - RAND_MAX;
|
||||||
@@ -1748,7 +1751,7 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 *
|
|||||||
} else {
|
} else {
|
||||||
randval -= RAND_MAX / 2;
|
randval -= RAND_MAX / 2;
|
||||||
if (randval > (RAND_MAX / 4)) {
|
if (randval > (RAND_MAX / 4)) {
|
||||||
if (randval <= (((3LL * RAND_MAX) / 8)))
|
if (randval <= (((3LL * (uint64_t) RAND_MAX) / 8)))
|
||||||
randval = (2 * randval) - (RAND_MAX / 4);
|
randval = (2 * randval) - (RAND_MAX / 4);
|
||||||
else
|
else
|
||||||
randval = (4 * randval) - RAND_MAX;
|
randval = (4 * randval) - RAND_MAX;
|
||||||
@@ -1774,7 +1777,7 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 *
|
|||||||
randval = rand();
|
randval = rand();
|
||||||
if (randval < (RAND_MAX / 2)) {
|
if (randval < (RAND_MAX / 2)) {
|
||||||
if (randval > (RAND_MAX / 4)) {
|
if (randval > (RAND_MAX / 4)) {
|
||||||
if (randval <= (((3LL * RAND_MAX) / 8)))
|
if (randval <= (((3LL * (uint64_t) RAND_MAX) / 8)))
|
||||||
randval = (2 * randval) - (RAND_MAX / 4);
|
randval = (2 * randval) - (RAND_MAX / 4);
|
||||||
else
|
else
|
||||||
randval = (4 * randval) - RAND_MAX;
|
randval = (4 * randval) - RAND_MAX;
|
||||||
@@ -1783,7 +1786,7 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 *
|
|||||||
} else {
|
} else {
|
||||||
randval -= RAND_MAX / 2;
|
randval -= RAND_MAX / 2;
|
||||||
if (randval > (RAND_MAX / 4)) {
|
if (randval > (RAND_MAX / 4)) {
|
||||||
if (randval <= (((3LL * RAND_MAX) / 8)))
|
if (randval <= (((3LL * (uint64_t) RAND_MAX) / 8)))
|
||||||
randval = (2 * randval) - (RAND_MAX / 4);
|
randval = (2 * randval) - (RAND_MAX / 4);
|
||||||
else
|
else
|
||||||
randval = (4 * randval) - RAND_MAX;
|
randval = (4 * randval) - RAND_MAX;
|
||||||
@@ -1872,7 +1875,7 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 *
|
|||||||
addbit(d, 0);
|
addbit(d, 0);
|
||||||
addbit(d, 1);
|
addbit(d, 1);
|
||||||
for (j = 0; j < real_size; j++)
|
for (j = 0; j < real_size; j++)
|
||||||
*pt++ = (uae_u16) (pulse / real_size);
|
*pt++ = (uint16_t) (pulse / real_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* prepares for the next pulse */
|
/* prepares for the next pulse */
|
||||||
@@ -1894,11 +1897,11 @@ fdi2_decode(FDI *fdi, uint32_t totalavg, uae_u32 *avgp, uae_u32 *minp, uae_u32 *
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fdi2_celltiming(FDI *fdi, uint32_t totalavg, int bitoffset, uae_u16 *out)
|
fdi2_celltiming(FDI *fdi, uint32_t totalavg, int bitoffset, uint16_t *out)
|
||||||
{
|
{
|
||||||
uae_u16 *pt2, *pt;
|
uint16_t *pt2, *pt;
|
||||||
double avg_bit_len;
|
double avg_bit_len;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
avg_bit_len = (double) totalavg / (double) bitoffset;
|
avg_bit_len = (double) totalavg / (double) bitoffset;
|
||||||
pt2 = fdi->track_dst_buffer_timing;
|
pt2 = fdi->track_dst_buffer_timing;
|
||||||
@@ -1906,7 +1909,7 @@ fdi2_celltiming(FDI *fdi, uint32_t totalavg, int bitoffset, uae_u16 *out)
|
|||||||
for (i = 0; i < bitoffset / 8; i++) {
|
for (i = 0; i < bitoffset / 8; i++) {
|
||||||
double v = (pt2[0] + pt2[1] + pt2[2] + pt2[3] + pt2[4] + pt2[5] + pt2[6] + pt2[7]) / 8.0;
|
double v = (pt2[0] + pt2[1] + pt2[2] + pt2[3] + pt2[4] + pt2[5] + pt2[6] + pt2[7]) / 8.0;
|
||||||
v = 1000.0 * v / avg_bit_len;
|
v = 1000.0 * v / avg_bit_len;
|
||||||
*pt++ = (uae_u16) v;
|
*pt++ = (uint16_t) v;
|
||||||
pt2 += 8;
|
pt2 += 8;
|
||||||
}
|
}
|
||||||
*pt++ = out[0];
|
*pt++ = out[0];
|
||||||
@@ -1916,14 +1919,14 @@ fdi2_celltiming(FDI *fdi, uint32_t totalavg, int bitoffset, uae_u16 *out)
|
|||||||
static int
|
static int
|
||||||
decode_lowlevel_track(FDI *fdi, int track, struct fdi_cache *cache)
|
decode_lowlevel_track(FDI *fdi, int track, struct fdi_cache *cache)
|
||||||
{
|
{
|
||||||
uae_u8 *p1;
|
uint8_t *p1;
|
||||||
uae_u32 *p2;
|
uint32_t *p2;
|
||||||
uae_u32 *avgp, *minp = 0, *maxp = 0;
|
uint32_t *avgp, *minp = 0, *maxp = 0;
|
||||||
uae_u8 *idxp = 0;
|
uint8_t *idxp = 0;
|
||||||
uae_u32 maxidx, totalavg, weakbits;
|
uint32_t maxidx, totalavg, weakbits;
|
||||||
int i, j, len, pulses, indexoffset;
|
int i, j, len, pulses, indexoffset;
|
||||||
int avg_free, min_free = 0, max_free = 0, idx_free;
|
int avg_free, min_free = 0, max_free = 0, idx_free;
|
||||||
int idx_off1 = 0, idx_off2 = 0, idx_off3 = 0;
|
int idx_off1 = 0, idx_off2 = 0, idx_off3 = 0;
|
||||||
|
|
||||||
p1 = fdi->track_src;
|
p1 = fdi->track_src;
|
||||||
pulses = get_u32(p1);
|
pulses = get_u32(p1);
|
||||||
@@ -1931,15 +1934,15 @@ decode_lowlevel_track(FDI *fdi, int track, struct fdi_cache *cache)
|
|||||||
return -1;
|
return -1;
|
||||||
p1 += 4;
|
p1 += 4;
|
||||||
len = 12;
|
len = 12;
|
||||||
avgp = (uae_u32 *) fdi_decompress(pulses, p1 + 0, p1 + len, &avg_free);
|
avgp = (uint32_t *) fdi_decompress(pulses, p1 + 0, p1 + len, &avg_free);
|
||||||
dumpstream(track, (uae_u8 *) avgp, pulses);
|
dumpstream(track, (uint8_t *) avgp, pulses);
|
||||||
len += get_u24(p1 + 0) & 0x3fffff;
|
len += get_u24(p1 + 0) & 0x3fffff;
|
||||||
if (!avgp)
|
if (!avgp)
|
||||||
return -1;
|
return -1;
|
||||||
if (get_u24(p1 + 3) && get_u24(p1 + 6)) {
|
if (get_u24(p1 + 3) && get_u24(p1 + 6)) {
|
||||||
minp = (uae_u32 *) fdi_decompress(pulses, p1 + 3, p1 + len, &min_free);
|
minp = (uint32_t *) fdi_decompress(pulses, p1 + 3, p1 + len, &min_free);
|
||||||
len += get_u24(p1 + 3) & 0x3fffff;
|
len += get_u24(p1 + 3) & 0x3fffff;
|
||||||
maxp = (uae_u32 *) fdi_decompress(pulses, p1 + 6, p1 + len, &max_free);
|
maxp = (uint32_t *) fdi_decompress(pulses, p1 + 6, p1 + len, &max_free);
|
||||||
len += get_u24(p1 + 6) & 0x3fffff;
|
len += get_u24(p1 + 6) & 0x3fffff;
|
||||||
/* Computes the real min and max values */
|
/* Computes the real min and max values */
|
||||||
for (i = 0; i < pulses; i++) {
|
for (i = 0; i < pulses; i++) {
|
||||||
@@ -2048,7 +2051,7 @@ decode_lowlevel_track(FDI *fdi, int track, struct fdi_cache *cache)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static unsigned char fdiid[] = { "Formatted Disk Image file" };
|
static unsigned char fdiid[] = { "Formatted Disk Image file" };
|
||||||
static int bit_rate_table[16] = { 125, 150, 250, 300, 500, 1000 };
|
static int bit_rate_table[16] = { 125, 150, 250, 300, 500, 1000 };
|
||||||
|
|
||||||
void
|
void
|
||||||
fdi2raw_header_free(FDI *fdi)
|
fdi2raw_header_free(FDI *fdi)
|
||||||
@@ -2106,13 +2109,13 @@ fdi2raw_get_bit_rate(FDI *fdi)
|
|||||||
return fdi->bit_rate;
|
return fdi->bit_rate;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
FDI2RawDiskType
|
||||||
fdi2raw_get_type(FDI *fdi)
|
fdi2raw_get_type(FDI *fdi)
|
||||||
{
|
{
|
||||||
return fdi->disk_type;
|
return fdi->disk_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
bool
|
||||||
fdi2raw_get_write_protect(FDI *fdi)
|
fdi2raw_get_write_protect(FDI *fdi)
|
||||||
{
|
{
|
||||||
return fdi->write_protect;
|
return fdi->write_protect;
|
||||||
@@ -2127,9 +2130,9 @@ fdi2raw_get_tpi(FDI *fdi)
|
|||||||
FDI *
|
FDI *
|
||||||
fdi2raw_header(FILE *f)
|
fdi2raw_header(FILE *f)
|
||||||
{
|
{
|
||||||
int i, offset, oldseek;
|
long i, offset, oldseek;
|
||||||
uae_u8 type, size;
|
uint8_t type, size;
|
||||||
FDI *fdi;
|
FDI *fdi;
|
||||||
|
|
||||||
fdi2raw_log("ALLOC: memory allocated %d\n", fdi_allocated);
|
fdi2raw_log("ALLOC: memory allocated %d\n", fdi_allocated);
|
||||||
fdi = fdi_malloc(sizeof(FDI));
|
fdi = fdi_malloc(sizeof(FDI));
|
||||||
@@ -2167,7 +2170,7 @@ fdi2raw_header(FILE *f)
|
|||||||
fdi->last_head = fdi->header[144];
|
fdi->last_head = fdi->header[144];
|
||||||
fdi->disk_type = fdi->header[145];
|
fdi->disk_type = fdi->header[145];
|
||||||
fdi->rotation_speed = fdi->header[146] + 128;
|
fdi->rotation_speed = fdi->header[146] + 128;
|
||||||
fdi->write_protect = fdi->header[147] & 1;
|
fdi->write_protect = !!(fdi->header[147] & 1);
|
||||||
fdi2raw_log("FDI version %d.%d\n", fdi->header[140], fdi->header[141]);
|
fdi2raw_log("FDI version %d.%d\n", fdi->header[140], fdi->header[141]);
|
||||||
fdi2raw_log("last_track=%d rotation_speed=%d\n", fdi->last_track, fdi->rotation_speed);
|
fdi2raw_log("last_track=%d rotation_speed=%d\n", fdi->last_track, fdi->rotation_speed);
|
||||||
|
|
||||||
@@ -2197,8 +2200,8 @@ fdi2raw_header(FILE *f)
|
|||||||
return fdi;
|
return fdi;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
static int
|
||||||
fdi2raw_loadrevolution_2(FDI *fdi, uae_u16 *mfmbuf, uae_u16 *tracktiming, int track, int *tracklength, int *indexoffsetp, int *multirev, int mfm)
|
fdi2raw_loadrevolution_2(FDI *fdi, uint16_t *mfmbuf, uint16_t *tracktiming, int track, int *tracklength, int *indexoffsetp, int *multirev, int mfm)
|
||||||
{
|
{
|
||||||
struct fdi_cache *cache = &fdi->cache[track];
|
struct fdi_cache *cache = &fdi->cache[track];
|
||||||
int len, i, idx;
|
int len, i, idx;
|
||||||
@@ -2216,8 +2219,8 @@ fdi2raw_loadrevolution_2(FDI *fdi, uae_u16 *mfmbuf, uae_u16 *tracktiming, int tr
|
|||||||
*tracklength = len;
|
*tracklength = len;
|
||||||
|
|
||||||
for (i = 0; i < (len + 15) / (2 * 8); i++) {
|
for (i = 0; i < (len + 15) / (2 * 8); i++) {
|
||||||
uae_u8 *data = fdi->track_dst_buffer + i * 2;
|
uint8_t *data = fdi->track_dst_buffer + i * 2;
|
||||||
*mfmbuf++ = 256 * *data + *(data + 1);
|
*mfmbuf++ = 256 * *data + *(data + 1);
|
||||||
}
|
}
|
||||||
fdi2_celltiming(fdi, cache->totalavg, len, tracktiming);
|
fdi2_celltiming(fdi, cache->totalavg, len, tracktiming);
|
||||||
if (indexoffsetp)
|
if (indexoffsetp)
|
||||||
@@ -2226,18 +2229,20 @@ fdi2raw_loadrevolution_2(FDI *fdi, uae_u16 *mfmbuf, uae_u16 *tracktiming, int tr
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
fdi2raw_loadrevolution(FDI *fdi, uae_u16 *mfmbuf, uae_u16 *tracktiming, int track, int *tracklength, int mfm)
|
fdi2raw_loadrevolution(FDI *fdi, uint16_t *mfmbuf, uint16_t *tracktiming, int track, int *tracklength, int mfm)
|
||||||
{
|
{
|
||||||
|
track ^= fdi->reversed_side;
|
||||||
return fdi2raw_loadrevolution_2(fdi, mfmbuf, tracktiming, track, tracklength, 0, 0, mfm);
|
return fdi2raw_loadrevolution_2(fdi, mfmbuf, tracktiming, track, tracklength, 0, 0, mfm);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
fdi2raw_loadtrack(FDI *fdi, uae_u16 *mfmbuf, uae_u16 *tracktiming, int track, int *tracklength, int *indexoffsetp, int *multirev, int mfm)
|
fdi2raw_loadtrack(FDI *fdi, uint16_t *mfmbuf, uint16_t *tracktiming, int track, int *tracklength, int *indexoffsetp, int *multirev, int mfm)
|
||||||
{
|
{
|
||||||
uae_u8 *p;
|
uint8_t *p;
|
||||||
int outlen, i;
|
int outlen, i;
|
||||||
struct fdi_cache *cache = &fdi->cache[track];
|
struct fdi_cache *cache = &fdi->cache[track];
|
||||||
|
|
||||||
|
track ^= fdi->reversed_side;
|
||||||
if (cache->lowlevel)
|
if (cache->lowlevel)
|
||||||
return fdi2raw_loadrevolution_2(fdi, mfmbuf, tracktiming, track, tracklength, indexoffsetp, multirev, mfm);
|
return fdi2raw_loadrevolution_2(fdi, mfmbuf, tracktiming, track, tracklength, indexoffsetp, multirev, mfm);
|
||||||
|
|
||||||
@@ -2305,8 +2310,8 @@ fdi2raw_loadtrack(FDI *fdi, uae_u16 *mfmbuf, uae_u16 *tracktiming, int track, in
|
|||||||
return fdi2raw_loadrevolution_2(fdi, mfmbuf, tracktiming, track, tracklength, indexoffsetp, multirev, mfm);
|
return fdi2raw_loadrevolution_2(fdi, mfmbuf, tracktiming, track, tracklength, indexoffsetp, multirev, mfm);
|
||||||
*tracklength = fdi->out;
|
*tracklength = fdi->out;
|
||||||
for (i = 0; i < ((*tracklength) + 15) / (2 * 8); i++) {
|
for (i = 0; i < ((*tracklength) + 15) / (2 * 8); i++) {
|
||||||
uae_u8 *data = fdi->track_dst_buffer + i * 2;
|
uint8_t *data = fdi->track_dst_buffer + i * 2;
|
||||||
*mfmbuf++ = 256 * *data + *(data + 1);
|
*mfmbuf++ = 256 * *data + *(data + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return outlen;
|
return outlen;
|
||||||
|
@@ -16,36 +16,66 @@
|
|||||||
*
|
*
|
||||||
* Copyright 2001-2004 Toni Wilen.
|
* Copyright 2001-2004 Toni Wilen.
|
||||||
* Copyright 2001-2004 Vincent Joguin.
|
* Copyright 2001-2004 Vincent Joguin.
|
||||||
* Copyright 2001 Thomas Harte.
|
* Copyright 2001-2016 Thomas Harte.
|
||||||
*/
|
*/
|
||||||
#ifndef __FDI2RAW_H
|
#ifndef __FDI2RAW_H
|
||||||
#define __FDI2RAW_H
|
#define __FDI2RAW_H
|
||||||
|
|
||||||
#define uae_u8 uint8_t
|
#include <stdint.h>
|
||||||
#define uae_u16 uint16_t
|
#include <stdbool.h>
|
||||||
#define uae_u32 uint32_t
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
typedef struct fdi FDI;
|
typedef struct fdi FDI;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern int fdi2raw_loadtrack(FDI *, uae_u16 *mfmbuf, uae_u16 *tracktiming, int track, int *tracklength, int *indexoffset, int *multirev, int mfm);
|
/*!
|
||||||
|
Attempts to parse and return an FDI header from the file @c file.
|
||||||
|
|
||||||
extern int fdi2raw_loadrevolution(FDI *, uae_u16 *mfmbuf, uae_u16 *tracktiming, int track, int *tracklength, int mfm);
|
@parameter file the file from which to attempt to read the FDI.
|
||||||
|
@returns a newly-allocated `FDI` if parsing succeeded; @c NULL otherwise.
|
||||||
|
*/
|
||||||
|
extern FDI *fdi2raw_header(FILE *file);
|
||||||
|
|
||||||
extern FDI *fdi2raw_header(FILE *f);
|
/*!
|
||||||
extern void fdi2raw_header_free(FDI *);
|
Release all memory associated with @c file.
|
||||||
extern int fdi2raw_get_last_track(FDI *);
|
*/
|
||||||
extern int fdi2raw_get_num_sector(FDI *);
|
extern void fdi2raw_header_free(FDI *file);
|
||||||
extern int fdi2raw_get_last_head(FDI *);
|
|
||||||
extern int fdi2raw_get_type(FDI *);
|
extern int fdi2raw_loadtrack(FDI *, uint16_t *mfmbuf, uint16_t *tracktiming, int track, int *tracklength, int *indexoffset, int *multirev, int mfm);
|
||||||
extern int fdi2raw_get_bit_rate(FDI *);
|
extern int fdi2raw_loadrevolution(FDI *, uint16_t *mfmbuf, uint16_t *tracktiming, int track, int *tracklength, int mfm);
|
||||||
extern int fdi2raw_get_rotation(FDI *);
|
|
||||||
extern int fdi2raw_get_write_protect(FDI *);
|
typedef enum {
|
||||||
extern int fdi2raw_get_tpi(FDI *);
|
FDI2RawDiskType8Inch = 0,
|
||||||
|
FDI2RawDiskType5_25Inch = 1,
|
||||||
|
FDI2RawDiskType3_5Inch = 2,
|
||||||
|
FDI2RawDiskType3Inch = 3,
|
||||||
|
} FDI2RawDiskType;
|
||||||
|
|
||||||
|
/// @returns the disk type described by @c fdi.
|
||||||
|
extern FDI2RawDiskType fdi2raw_get_type(FDI *fdi);
|
||||||
|
|
||||||
|
/// @returns the bit rate at which @c fdi is sampled if spinning at the intended rate, in Kbit/s.
|
||||||
|
extern int fdi2raw_get_bit_rate(FDI *fdi);
|
||||||
|
|
||||||
|
/// @returns the intended rotation speed of @c fdi, in rotations per minute.
|
||||||
|
extern int fdi2raw_get_rotation(FDI *fdi);
|
||||||
|
|
||||||
|
/// @returns whether the imaged disk was write protected.
|
||||||
|
extern bool fdi2raw_get_write_protect(FDI *fdi);
|
||||||
|
|
||||||
|
/// @returns the final enumerated track represented in @c fdi.
|
||||||
|
extern int fdi2raw_get_last_track(FDI *fdi);
|
||||||
|
|
||||||
|
/// @returns the final enumerated head represented in @c fdi.
|
||||||
|
extern int fdi2raw_get_last_head(FDI *fdi);
|
||||||
|
|
||||||
|
/// @returns @c 22 if track 0 is a standard Amiga high-density; @c 11 otherwise.
|
||||||
|
extern int fdi2raw_get_num_sector(FDI *fdi);
|
||||||
|
|
||||||
|
extern int fdi2raw_get_tpi(FDI *fdi);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user