summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib
diff options
context:
space:
mode:
author Curt Coder <curtcoder@mail.com>2013-01-08 17:57:56 +0000
committer Curt Coder <curtcoder@mail.com>2013-01-08 17:57:56 +0000
commite29bf515c4a2e4be4349f25a3aca9b908c55da95 (patch)
tree6a32321c95e246d87e2dfb8925031d4d6c608f2c /src/lib
parent732a6d11f547ce49bfa93a8cec6f43ccad57b7a4 (diff)
Added FM encoding support to upd765_dsk. [Curt Coder]
(MESS) bw2: Fixed floppy loading. [Curt Coder]
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/formats/a5105_dsk.c2
-rw-r--r--src/lib/formats/apollo_dsk.c2
-rw-r--r--src/lib/formats/bw12_dsk.c10
-rw-r--r--src/lib/formats/bw2_dsk.c4
-rw-r--r--src/lib/formats/iq151_dsk.c2
-rw-r--r--src/lib/formats/kc85_dsk.c6
-rw-r--r--src/lib/formats/m5_dsk.c2
-rw-r--r--src/lib/formats/mm_dsk.c6
-rw-r--r--src/lib/formats/nanos_dsk.c2
-rw-r--r--src/lib/formats/pc_dsk.c22
-rw-r--r--src/lib/formats/pyldin_dsk.c2
-rw-r--r--src/lib/formats/sf7000_dsk.c2
-rw-r--r--src/lib/formats/upd765_dsk.c108
-rw-r--r--src/lib/formats/upd765_dsk.h3
-rw-r--r--src/lib/formats/xdf_dsk.c2
15 files changed, 131 insertions, 44 deletions
diff --git a/src/lib/formats/a5105_dsk.c b/src/lib/formats/a5105_dsk.c
index 832e1ffa4c6..23317488f8f 100644
--- a/src/lib/formats/a5105_dsk.c
+++ b/src/lib/formats/a5105_dsk.c
@@ -64,7 +64,7 @@ const char *a5105_format::extensions() const
// Unverified gap sizes
const a5105_format::format a5105_format::formats[] = {
{
- floppy_image::FF_525, floppy_image::DSQD,
+ floppy_image::FF_525, floppy_image::DSQD, floppy_image::MFM,
2000, // 2us, 300rpm
5, 80, 2,
1024, {},
diff --git a/src/lib/formats/apollo_dsk.c b/src/lib/formats/apollo_dsk.c
index 588b4062cf4..4d2d74371d4 100644
--- a/src/lib/formats/apollo_dsk.c
+++ b/src/lib/formats/apollo_dsk.c
@@ -64,7 +64,7 @@ const char *apollo_format::extensions() const
// Unverified gap sizes
const apollo_format::format apollo_format::formats[] = {
{
- floppy_image::FF_525, floppy_image::DSHD,
+ floppy_image::FF_525, floppy_image::DSHD, floppy_image::MFM,
1200, // 1us, 360rpm
8, 77, 2,
1024, {},
diff --git a/src/lib/formats/bw12_dsk.c b/src/lib/formats/bw12_dsk.c
index 8008e8e6457..96e73fbdd14 100644
--- a/src/lib/formats/bw12_dsk.c
+++ b/src/lib/formats/bw12_dsk.c
@@ -64,7 +64,7 @@ const char *bw12_format::extensions() const
// Unverified gap sizes
const bw12_format::format bw12_format::formats[] = {
{ // 180KB BW 12
- floppy_image::FF_525, floppy_image::SSDD,
+ floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
2000, // 2us, 300rpm
18, 40, 1,
256, {},
@@ -72,7 +72,7 @@ const bw12_format::format bw12_format::formats[] = {
80, 50, 22, 80
},
{ // 360KB BW 12
- floppy_image::FF_525, floppy_image::DSDD,
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
2000, // 2us, 300rpm
18, 40, 2,
256, {},
@@ -80,7 +80,7 @@ const bw12_format::format bw12_format::formats[] = {
80, 50, 22, 80
},
{ // SVI-328
- floppy_image::FF_525, floppy_image::SSDD,
+ floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
2000, // 2us, 300rpm
17, 40, 1,
256, {},
@@ -88,7 +88,7 @@ const bw12_format::format bw12_format::formats[] = {
80, 50, 22, 80
},
{ // SVI-328
- floppy_image::FF_525, floppy_image::DSDD,
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
2000, // 2us, 300rpm
17, 40, 2,
256, {},
@@ -96,7 +96,7 @@ const bw12_format::format bw12_format::formats[] = {
80, 50, 22, 80
},
{ // Kaypro II
- floppy_image::FF_525, floppy_image::SSDD,
+ floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
2000, // 2us, 300rpm
10, 40, 1,
512, {},
diff --git a/src/lib/formats/bw2_dsk.c b/src/lib/formats/bw2_dsk.c
index 6cd81359c1a..2019e9cf2bd 100644
--- a/src/lib/formats/bw2_dsk.c
+++ b/src/lib/formats/bw2_dsk.c
@@ -63,11 +63,11 @@ const char *bw2_format::extensions() const
const bw2_format::format bw2_format::formats[] = {
{ // 340K 3 1/2 inch double density
- floppy_image::FF_35, floppy_image::SSDD,
+ floppy_image::FF_35, floppy_image::SSDD, floppy_image::MFM,
2000, 17, 80, 1, 256, {}, 0, {}, 80, 20, 22, 14
},
{ // 360K 3 1/2 inch double density
- floppy_image::FF_35, floppy_image::SSDD,
+ floppy_image::FF_35, floppy_image::SSDD, floppy_image::MFM,
2000, 18, 80, 1, 256, {}, 0, {}, 80, 20, 22, 14
},
{}
diff --git a/src/lib/formats/iq151_dsk.c b/src/lib/formats/iq151_dsk.c
index 0f886a9d6bb..57dbfd14dc2 100644
--- a/src/lib/formats/iq151_dsk.c
+++ b/src/lib/formats/iq151_dsk.c
@@ -64,7 +64,7 @@ const char *iq151_format::extensions() const
// Unverified gap sizes. May be FM.
const iq151_format::format iq151_format::formats[] = {
{
- floppy_image::FF_8, floppy_image::SSSD,
+ floppy_image::FF_8, floppy_image::SSSD, floppy_image::MFM,
2000, // maybe
26, 77, 1,
128, {},
diff --git a/src/lib/formats/kc85_dsk.c b/src/lib/formats/kc85_dsk.c
index a8d2fadf092..1da0bb66597 100644
--- a/src/lib/formats/kc85_dsk.c
+++ b/src/lib/formats/kc85_dsk.c
@@ -65,7 +65,7 @@ const char *kc85_format::extensions() const
// 640-800K on HD which handles 1.2M, really?
const kc85_format::format kc85_format::formats[] = {
{
- floppy_image::FF_525, floppy_image::DSHD,
+ floppy_image::FF_525, floppy_image::DSHD, floppy_image::MFM,
1200, // 1us, 360rpm
5, 80, 2,
1024, {},
@@ -73,7 +73,7 @@ const kc85_format::format kc85_format::formats[] = {
80, 50, 22, 80
},
{
- floppy_image::FF_525, floppy_image::DSHD,
+ floppy_image::FF_525, floppy_image::DSHD, floppy_image::MFM,
1200, // 1us, 360rpm
9, 80, 2,
512, {},
@@ -81,7 +81,7 @@ const kc85_format::format kc85_format::formats[] = {
80, 50, 22, 80
},
{
- floppy_image::FF_525, floppy_image::DSHD,
+ floppy_image::FF_525, floppy_image::DSHD, floppy_image::MFM,
1200, // 1us, 360rpm
16, 80, 2,
256, {},
diff --git a/src/lib/formats/m5_dsk.c b/src/lib/formats/m5_dsk.c
index 2e1895cf155..3c25582d287 100644
--- a/src/lib/formats/m5_dsk.c
+++ b/src/lib/formats/m5_dsk.c
@@ -64,7 +64,7 @@ const char *m5_format::extensions() const
// Unverified gap sizes
const m5_format::format m5_format::formats[] = {
{
- floppy_image::FF_525, floppy_image::DSDD,
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
2000, // 2us, 300rpm
18, 40, 2,
256, {},
diff --git a/src/lib/formats/mm_dsk.c b/src/lib/formats/mm_dsk.c
index 7ee9bc10505..4502ff1ca8e 100644
--- a/src/lib/formats/mm_dsk.c
+++ b/src/lib/formats/mm_dsk.c
@@ -83,7 +83,7 @@ const char *mm2_format::extensions() const
// Unverified gap sizes
const mm1_format::format mm1_format::formats[] = {
{
- floppy_image::FF_525, floppy_image::DSQD,
+ floppy_image::FF_525, floppy_image::DSQD, floppy_image::MFM,
2000, // 2us, 300rpm
8, 80, 2,
512, {},
@@ -96,7 +96,7 @@ const mm1_format::format mm1_format::formats[] = {
// Unverified gap sizes
const mm2_format::format mm2_format::formats[] = {
{
- floppy_image::FF_525, floppy_image::DSDD,
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
2000, // 2us, 300rpm
9, 40, 2,
512, {},
@@ -106,7 +106,7 @@ const mm2_format::format mm2_format::formats[] = {
// 40 tracks but 18 sectors implying HD density at 300rpm, i.e. on
// 3.5" media? That makes no sense
{
- floppy_image::FF_525, floppy_image::DSHD,
+ floppy_image::FF_525, floppy_image::DSHD, floppy_image::MFM,
1000, // 1us, 300rpm, otherwise it just won't fit
18, 40, 2, // That line is just nonsense
512, {},
diff --git a/src/lib/formats/nanos_dsk.c b/src/lib/formats/nanos_dsk.c
index 8adf182426b..df2b9fe24e5 100644
--- a/src/lib/formats/nanos_dsk.c
+++ b/src/lib/formats/nanos_dsk.c
@@ -65,7 +65,7 @@ const char *nanos_format::extensions() const
// 800K on HD which handles 1.2M, really?
const nanos_format::format nanos_format::formats[] = {
{
- floppy_image::FF_525, floppy_image::DSHD,
+ floppy_image::FF_525, floppy_image::DSHD, floppy_image::MFM,
1200, // 1us, 360rpm
5, 80, 2,
1024, {},
diff --git a/src/lib/formats/pc_dsk.c b/src/lib/formats/pc_dsk.c
index 28e9bdc1de4..f50e58fd9a5 100644
--- a/src/lib/formats/pc_dsk.c
+++ b/src/lib/formats/pc_dsk.c
@@ -158,47 +158,47 @@ const char *pc_format::extensions() const
const pc_format::format pc_format::formats[] = {
{ /* 160K 5 1/4 inch double density single sided */
- floppy_image::FF_525, floppy_image::SSDD,
+ floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
2000, 8, 40, 1, 512, {}, 1, {}, 80, 50, 22, 80
},
{ /* 320K 5 1/4 inch double density */
- floppy_image::FF_525, floppy_image::DSDD,
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
2000, 8, 40, 2, 512, {}, 1, {}, 80, 50, 22, 80
},
{ /* 180K 5 1/4 inch double density single sided */
- floppy_image::FF_525, floppy_image::SSDD,
+ floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
2000, 9, 40, 1, 512, {}, 1, {}, 80, 50, 22, 80
},
{ /* 360K 5 1/4 inch double density */
- floppy_image::FF_525, floppy_image::DSDD,
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
2000, 9, 40, 2, 512, {}, 1, {}, 80, 50, 22, 80
},
{ /* 400K 5 1/4 inch double density - gaps unverified */
- floppy_image::FF_525, floppy_image::DSDD,
+ floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
2000, 10, 40, 2, 512, {}, 1, {}, 80, 50, 22, 80
},
{ /* 720K 5 1/4 inch quad density - gaps unverified */
- floppy_image::FF_525, floppy_image::DSQD,
+ floppy_image::FF_525, floppy_image::DSQD, floppy_image::MFM,
2000, 9, 80, 2, 512, {}, 1, {}, 80, 50, 22, 80
},
{ /* 1200K 5 1/4 inch high density */
- floppy_image::FF_525, floppy_image::DSHD,
+ floppy_image::FF_525, floppy_image::DSHD, floppy_image::MFM,
1200, 15, 40, 2, 512, {}, 1, {}, 80, 50, 22, 84
},
{ /* 720K 3 1/2 inch double density */
- floppy_image::FF_35, floppy_image::DSDD,
+ floppy_image::FF_35, floppy_image::DSDD, floppy_image::MFM,
2000, 9, 80, 2, 512, {}, 1, {}, 80, 50, 22, 80
},
{ /* 1200K 3 1/2 inch high density (japanese variant) - gaps unverified */
- floppy_image::FF_35, floppy_image::DSHD,
+ floppy_image::FF_35, floppy_image::DSHD, floppy_image::MFM,
1200, 15, 40, 2, 512, {}, 1, {}, 80, 50, 22, 84
},
{ /* 1440K 3 1/2 inch high density */
- floppy_image::FF_35, floppy_image::DSHD,
+ floppy_image::FF_35, floppy_image::DSHD, floppy_image::MFM,
1000, 18, 80, 2, 512, {}, 1, {}, 80, 50, 22, 108
},
{ /* 2880K 3 1/2 inch extended density - gaps unverified */
- floppy_image::FF_35, floppy_image::DSED,
+ floppy_image::FF_35, floppy_image::DSED, floppy_image::MFM,
500, 36, 80, 2, 512, {}, 1, {}, 80, 50, 41, 80
},
{}
diff --git a/src/lib/formats/pyldin_dsk.c b/src/lib/formats/pyldin_dsk.c
index 53d6e9e172a..83cebf1638a 100644
--- a/src/lib/formats/pyldin_dsk.c
+++ b/src/lib/formats/pyldin_dsk.c
@@ -65,7 +65,7 @@ const char *pyldin_format::extensions() const
// 720K on HD which handles 1.2M, really?
const pyldin_format::format pyldin_format::formats[] = {
{
- floppy_image::FF_525, floppy_image::DSHD,
+ floppy_image::FF_525, floppy_image::DSHD, floppy_image::MFM,
1200, // 1us, 360rpm
9, 80, 2,
512, {},
diff --git a/src/lib/formats/sf7000_dsk.c b/src/lib/formats/sf7000_dsk.c
index ae088158f96..bc2369895a3 100644
--- a/src/lib/formats/sf7000_dsk.c
+++ b/src/lib/formats/sf7000_dsk.c
@@ -64,7 +64,7 @@ const char *sf7000_format::extensions() const
const sf7000_format::format sf7000_format::formats[] = {
{
// mfm h=00 n=01 sc=10 gpl=2a d=ff
- floppy_image::FF_3, floppy_image::SSDD,
+ floppy_image::FF_3, floppy_image::SSDD, floppy_image::MFM,
2000, // 2us, 300rpm
16, 40, 1,
256, {},
diff --git a/src/lib/formats/upd765_dsk.c b/src/lib/formats/upd765_dsk.c
index b4a2c121fcc..0762f274ad7 100644
--- a/src/lib/formats/upd765_dsk.c
+++ b/src/lib/formats/upd765_dsk.c
@@ -106,15 +106,54 @@ void upd765_format::build_sector_description(const format &f, UINT8 *sectdata, d
}
}
-bool upd765_format::load(io_generic *io, UINT32 form_factor, floppy_image *image)
+floppy_image_format_t::desc_e* upd765_format::get_desc_fm(const format &f, int &current_size, int &end_gap_index)
{
- int type = find_size(io, form_factor);
- if(type == -1)
- return false;
+ static floppy_image_format_t::desc_e desc[29] = {
+ /* 00 */ { FM, 0xff, f.gap_4a },
+ /* 01 */ { FM, 0x00, 6 },
+ /* 02 */ { RAW, 0xf77a, 1 },
+ /* 03 */ { FM, 0xff, f.gap_1 },
+ /* 04 */ { SECTOR_LOOP_START, 0, f.sector_count-1 },
+ /* 05 */ { FM, 0x00, 12 },
+ /* 06 */ { CRC_CCITT_FM_START, 1 },
+ /* 07 */ { RAW, 0xf57e, 1 },
+ /* 08 */ { TRACK_ID_FM },
+ /* 09 */ { HEAD_ID_FM },
+ /* 10 */ { SECTOR_ID_FM },
+ /* 11 */ { SIZE_ID_FM },
+ /* 12 */ { CRC_END, 1 },
+ /* 13 */ { CRC, 1 },
+ /* 14 */ { FM, 0xff, f.gap_2 },
+ /* 15 */ { FM, 0x00, 6 },
+ /* 16 */ { CRC_CCITT_FM_START, 2 },
+ /* 17 */ { RAW, 0xf56f, 1 },
+ /* 18 */ { SECTOR_DATA_FM, -1 },
+ /* 19 */ { CRC_END, 2 },
+ /* 20 */ { CRC, 2 },
+ /* 21 */ { FM, 0xff, f.gap_3 },
+ /* 22 */ { SECTOR_LOOP_END },
+ /* 23 */ { FM, 0xff, 0 },
+ /* 24 */ { RAWBITS, 0xffff, 0 },
+ /* 25 */ { END }
+ };
- const format &f = formats[type];
+ current_size = (f.gap_4a+6+1+f.gap_1)*16;
+ if(f.sector_base_size)
+ current_size += f.sector_base_size * f.sector_count * 16;
+ else {
+ for(int j=0; j != f.sector_count; j++)
+ current_size += f.per_sector_size[j] * 16;
+ }
+ current_size += (12+1+4+2+f.gap_2+6+1+2+f.gap_3) * f.sector_count * 16;
+
+ end_gap_index = 23;
+
+ return desc;
+}
- floppy_image_format_t::desc_e desc[] = {
+floppy_image_format_t::desc_e* upd765_format::get_desc_mfm(const format &f, int &current_size, int &end_gap_index)
+{
+ static floppy_image_format_t::desc_e desc[29] = {
/* 00 */ { MFM, 0x4e, f.gap_4a },
/* 01 */ { MFM, 0x00, 12 },
/* 02 */ { RAW, 0x5224, 3 },
@@ -146,7 +185,7 @@ bool upd765_format::load(io_generic *io, UINT32 form_factor, floppy_image *image
/* 28 */ { END }
};
- int current_size = (f.gap_4a+12+3+1+f.gap_1)*16;
+ current_size = (f.gap_4a+12+3+1+f.gap_1)*16;
if(f.sector_base_size)
current_size += f.sector_base_size * f.sector_count * 16;
else {
@@ -155,15 +194,42 @@ bool upd765_format::load(io_generic *io, UINT32 form_factor, floppy_image *image
}
current_size += (12+3+1+4+2+f.gap_2+12+3+1+2+f.gap_3) * f.sector_count * 16;
+ end_gap_index = 26;
+
+ return desc;
+}
+
+bool upd765_format::load(io_generic *io, UINT32 form_factor, floppy_image *image)
+{
+ int type = find_size(io, form_factor);
+ if(type == -1)
+ return false;
+
+ const format &f = formats[type];
+ floppy_image_format_t::desc_e *desc;
+ int current_size;
+ int end_gap_index;
+
+ switch (f.encoding)
+ {
+ case floppy_image::FM:
+ desc = get_desc_fm(f, current_size, end_gap_index);
+ break;
+ case floppy_image::MFM:
+ default:
+ desc = get_desc_mfm(f, current_size, end_gap_index);
+ break;
+ }
+
int total_size = 200000000/f.cell_size;
int remaining_size = total_size - current_size;
if(remaining_size < 0)
throw emu_fatalerror("upd765_format: Incorrect track layout, max_size=%d, current_size=%d", total_size, current_size);
// Fixup the end gap
- desc[26].p2 = remaining_size / 16;
- desc[27].p2 = remaining_size & 15;
- desc[27].p1 >>= 16-(remaining_size & 15);
+ desc[end_gap_index].p2 = remaining_size / 16;
+ desc[end_gap_index + 1].p2 = remaining_size & 15;
+ desc[end_gap_index + 1].p1 >>= 16-(remaining_size & 15);
int track_size = compute_track_size(f);
@@ -312,7 +378,16 @@ void upd765_format::check_compatibility(floppy_image *image, int *candidates, in
// Extract the sectors
generate_bitstream_from_track(0, 0, formats[candidates[0]].cell_size, bitstream, track_size, image);
- extract_sectors_from_bitstream_mfm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata));
+
+ switch (formats[candidates[0]].encoding)
+ {
+ case floppy_image::FM:
+ extract_sectors_from_bitstream_fm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata));
+ break;
+ case floppy_image::MFM:
+ extract_sectors_from_bitstream_mfm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata));
+ break;
+ }
// Check compatibility with every candidate, copy in-place
int *ok_cands = candidates;
@@ -357,7 +432,16 @@ void upd765_format::extract_sectors(floppy_image *image, const format &f, desc_s
// Extract the sectors
generate_bitstream_from_track(track, head, f.cell_size, bitstream, track_size, image);
- extract_sectors_from_bitstream_mfm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata));
+
+ switch (f.encoding)
+ {
+ case floppy_image::FM:
+ extract_sectors_from_bitstream_fm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata));
+ break;
+ case floppy_image::MFM:
+ extract_sectors_from_bitstream_mfm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata));
+ break;
+ }
for(int i=0; i<f.sector_count; i++) {
desc_s &ds = sdesc[i];
diff --git a/src/lib/formats/upd765_dsk.h b/src/lib/formats/upd765_dsk.h
index 39eec721956..35f32a07a57 100644
--- a/src/lib/formats/upd765_dsk.h
+++ b/src/lib/formats/upd765_dsk.h
@@ -17,6 +17,7 @@ public:
struct format {
UINT32 form_factor; // See floppy_image for possible values
UINT32 variant; // See floppy_image for possible values
+ UINT32 encoding; // See floppy_image for possible values
int cell_size; // See floppy_image_format_t for details
int sector_count;
@@ -42,6 +43,8 @@ public:
private:
const format *formats;
+ floppy_image_format_t::desc_e* get_desc_fm(const format &f, int &current_size, int &end_gap_index);
+ floppy_image_format_t::desc_e* get_desc_mfm(const format &f, int &current_size, int &end_gap_index);
int find_size(io_generic *io, UINT32 form_factor);
int compute_track_size(const format &f) const;
void build_sector_description(const format &d, UINT8 *sectdata, desc_s *sectors) const;
diff --git a/src/lib/formats/xdf_dsk.c b/src/lib/formats/xdf_dsk.c
index fce84bd9736..fed41606bef 100644
--- a/src/lib/formats/xdf_dsk.c
+++ b/src/lib/formats/xdf_dsk.c
@@ -64,7 +64,7 @@ const char *xdf_format::extensions() const
// Unverified gap sizes
const xdf_format::format xdf_format::formats[] = {
{
- floppy_image::FF_525, floppy_image::DSHD,
+ floppy_image::FF_525, floppy_image::DSHD, floppy_image::MFM,
1200, // 1us, 360rpm
8, 77, 2,
1024, {},