summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author tim lindner <tlindner@macmess.org>2022-02-16 18:50:18 -0800
committer GitHub <noreply@github.com>2022-02-17 13:50:18 +1100
commit33d6e9c9cd8f74554a05d2f79c6779b73b8c6261 (patch)
treef3a064133014c6d1ab6b0aa5fdeea176ffb68558
parent8da1c539662bd567f3881fa1118f11bdeffeb31e (diff)
formats/jvc_disk: Changed code to verify image geometry against floppy drive geometry. (#9238)
-rw-r--r--src/devices/bus/coco/coco_fdc.cpp12
-rw-r--r--src/lib/formats/jvc_dsk.cpp27
-rw-r--r--src/lib/formats/os9_dsk.cpp10
3 files changed, 33 insertions, 16 deletions
diff --git a/src/devices/bus/coco/coco_fdc.cpp b/src/devices/bus/coco/coco_fdc.cpp
index 6635b8c84d3..1c17df8bc7f 100644
--- a/src/devices/bus/coco/coco_fdc.cpp
+++ b/src/devices/bus/coco/coco_fdc.cpp
@@ -84,11 +84,13 @@
//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already
#define LOG_WDFDC (1U << 1) // Shows register setup
+#define LOG_WDIO (1U << 2) // Shows Data read and write
-//#define VERBOSE (LOG_GENERAL )
+//#define VERBOSE (LOG_GENERAL | LOG_WDFDC)
#include "logmacro.h"
#define LOGWDFDC(...) LOGMASKED(LOG_WDFDC, __VA_ARGS__)
+#define LOGWDIO(...) LOGMASKED(LOG_WDIO, __VA_ARGS__)
/***************************************************************************
PARAMETERS
@@ -185,6 +187,8 @@ void coco_fdc_device_base::device_add_mconfig(machine_config &config)
WD1773(config, m_wd17xx, 8_MHz_XTAL);
m_wd17xx->intrq_wr_callback().set(FUNC(coco_fdc_device_base::fdc_intrq_w));
m_wd17xx->drq_wr_callback().set(FUNC(coco_fdc_device_base::fdc_drq_w));
+ m_wd17xx->set_disable_motor_control(true);
+ m_wd17xx->set_force_ready(true);
FLOPPY_CONNECTOR(config, m_floppies[0], coco_fdc_floppies, "525dd", coco_fdc_device_base::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppies[1], coco_fdc_floppies, "525dd", coco_fdc_device_base::floppy_formats).enable_sound(true);
@@ -418,7 +422,7 @@ void coco_fdc_device_base::update_lines()
else if( (m_cache_controler & 0x07) == 0x06 ) /* Copy Write cache to controller */
{
u8 data = m_cache_buffer->read(m_cache_pointer++);
- LOG("Cached drq write: %2.2x\n", data );
+ LOG("Cached copy drq write: %2.2x\n", data );
m_wd17xx->data_w(data);
}
else
@@ -537,7 +541,7 @@ u8 coco_fdc_device_base::scs_read(offs_t offset)
break;
case 11:
result = m_wd17xx->data_r();
- LOGWDFDC("m_wd17xx->data_r: %2.2x\n", result );
+ LOGWDIO("m_wd17xx->data_r: %2.2x\n", result );
break;
}
@@ -594,7 +598,7 @@ void coco_fdc_device_base::scs_write(offs_t offset, u8 data)
m_wd17xx->sector_w(data);
break;
case 11:
- LOGWDFDC("m_wd17xx->data_w: %2.2x\n", data );
+ LOGWDIO("m_wd17xx->data_w: %2.2x\n", data );
m_wd17xx->data_w(data);
break;
};
diff --git a/src/lib/formats/jvc_dsk.cpp b/src/lib/formats/jvc_dsk.cpp
index d63f11751bb..3192aef5871 100644
--- a/src/lib/formats/jvc_dsk.cpp
+++ b/src/lib/formats/jvc_dsk.cpp
@@ -105,10 +105,8 @@
***************************************************************************/
#include "jvc_dsk.h"
-
#include "ioprocs.h"
-
-#include "osdcore.h" // osd_printf_*
+#include "imageutl.h"
jvc_format::jvc_format()
@@ -156,7 +154,7 @@ bool jvc_format::parse_header(util::random_read &io, int &header_size, int &trac
switch (header_size)
{
case 5:
- osd_printf_info("jvc_format: sector attribute flag unsupported\n");
+ LOG_FORMATS("jvc_format: sector attribute flag unsupported\n");
return false;
case 4: base_sector_id = header[3];
[[fallthrough]];
@@ -170,7 +168,7 @@ bool jvc_format::parse_header(util::random_read &io, int &header_size, int &trac
break;
}
- osd_printf_verbose("Floppy disk image geometry: %d tracks, %d head(s), %d sectors with %d bytes.\n", tracks, heads, sectors, sector_size);
+ LOG_FORMATS("jvc_format: Floppy disk image geometry: %d tracks, %d head(s), %d sectors with %d bytes.\n", tracks, heads, sectors, sector_size);
return tracks * heads * sectors * sector_size == (size - header_size);
}
@@ -184,6 +182,7 @@ int jvc_format::identify(util::random_read &io, uint32_t form_factor, const std:
bool jvc_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image *image)
{
int header_size, track_count, head_count, sector_count, sector_size, sector_base_id;
+ int max_tracks, max_heads;
if (!parse_header(io, header_size, track_count, head_count, sector_count, sector_size, sector_base_id))
return false;
@@ -191,7 +190,21 @@ bool jvc_format::load(util::random_read &io, uint32_t form_factor, const std::ve
// safety check
if (sector_count * sector_size > 10000)
{
- osd_printf_error("jvc_format: incorrect track layout\n");
+ LOG_FORMATS("jvc_format: incorrect track layout\n");
+ return false;
+ }
+
+ image->get_maximal_geometry(max_tracks, max_heads);
+
+ if (track_count > max_tracks)
+ {
+ LOG_FORMATS("jvc_format: Floppy disk has too many tracks for this drive (floppy tracks=%d, drive tracks=%d).\n", track_count, max_tracks);
+ return false;
+ }
+
+ if (head_count > max_heads)
+ {
+ LOG_FORMATS("jvc_format: Floppy disk has too many sides for this drive (floppy sides=%d, drive sides=%d).\n", head_count, max_heads);
return false;
}
@@ -261,7 +274,7 @@ bool jvc_format::save(util::random_read_write &io, const std::vector<uint32_t> &
{
if (sectors[1 + i].size() != 256)
{
- osd_printf_error("jvc_format: invalid sector size: %d\n", sectors[1 + i].size());
+ LOG_FORMATS("jvc_format: invalid sector size: %d\n", sectors[1 + i].size());
return false;
}
diff --git a/src/lib/formats/os9_dsk.cpp b/src/lib/formats/os9_dsk.cpp
index ba1b2427811..d0267f80815 100644
--- a/src/lib/formats/os9_dsk.cpp
+++ b/src/lib/formats/os9_dsk.cpp
@@ -67,7 +67,7 @@ const char *os9_format::description() const
const char *os9_format::extensions() const
{
- return "dsk,os9";
+ return "os9,dsk";
}
int os9_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants)
@@ -218,7 +218,7 @@ int os9_format::find_size(util::random_read &io, uint32_t form_factor, const std
continue;
}
- LOG_FORMATS("OS9 matching format index %d\n", i);
+ LOG_FORMATS("os9_dsk: matching format index %d: tracks %d, sectors %d, sides: %d\n", i, f.track_count, f.sector_count, f.head_count);
return i;
}
return -1;
@@ -236,17 +236,17 @@ const wd177x_format::format &os9_format::get_track_format(const format &f, int h
}
if (n < 0) {
- LOG_FORMATS("Error format not found\n");
+ LOG_FORMATS("os9_dsk: Error format not found\n");
return f;
}
if (head >= f.head_count) {
- LOG_FORMATS("Error invalid head %d\n", head);
+ LOG_FORMATS("os9_dsk: Error invalid head %d\n", head);
return f;
}
if (track >= f.track_count) {
- LOG_FORMATS("Error invalid track %d\n", track);
+ LOG_FORMATS("os9_dsk: Error invalid track %d\n", track);
return f;
}