summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/coco/dragon_fdc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/coco/dragon_fdc.cpp')
-rw-r--r--src/devices/bus/coco/dragon_fdc.cpp191
1 files changed, 165 insertions, 26 deletions
diff --git a/src/devices/bus/coco/dragon_fdc.cpp b/src/devices/bus/coco/dragon_fdc.cpp
index 97f4cb325ac..02cf92bd9ac 100644
--- a/src/devices/bus/coco/dragon_fdc.cpp
+++ b/src/devices/bus/coco/dragon_fdc.cpp
@@ -83,6 +83,7 @@
***************************************************************************/
#define LOG_FDC 0
+#define WD2791_TAG "wd2791"
#define WD2797_TAG "wd2797"
@@ -112,6 +113,27 @@ namespace
// methods
void dskreg_w(uint8_t data);
};
+
+ class premier_fdc_device_base : public coco_family_fdc_device_base
+ {
+ protected:
+ // construction/destruction
+ premier_fdc_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ // device-level overrides
+ virtual DECLARE_READ8_MEMBER(scs_read) override;
+ virtual DECLARE_WRITE8_MEMBER(scs_write) override;
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual void update_lines() override;
+
+ private:
+ // device references
+ required_device<wd2791_device> m_wd2791;
+ required_device_array<floppy_connector, 4> m_floppies;
+
+ // methods
+ void dskreg_w(uint8_t data);
+ };
}
/***************************************************************************
@@ -124,9 +146,10 @@ SLOT_INTERFACE_END
MACHINE_CONFIG_MEMBER(dragon_fdc_device_base::device_add_mconfig)
- MCFG_WD2797_ADD(WD2797_TAG, XTAL_1MHz)
+ MCFG_WD2797_ADD(WD2797_TAG, XTAL_4MHz / 4)
MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(dragon_fdc_device_base, fdc_intrq_w))
MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(dragon_fdc_device_base, fdc_drq_w))
+ MCFG_WD_FDC_FORCE_READY
MCFG_FLOPPY_DRIVE_ADD(WD2797_TAG ":0", dragon_fdc_device_base, "qd", dragon_fdc_device_base::floppy_formats)
MCFG_FLOPPY_DRIVE_SOUND(true)
@@ -139,6 +162,21 @@ MACHINE_CONFIG_MEMBER(dragon_fdc_device_base::device_add_mconfig)
MACHINE_CONFIG_END
+MACHINE_CONFIG_MEMBER(premier_fdc_device_base::device_add_mconfig)
+ MCFG_WD2791_ADD(WD2791_TAG, XTAL_2MHz / 2)
+ MCFG_WD_FDC_FORCE_READY
+
+ MCFG_FLOPPY_DRIVE_ADD(WD2791_TAG ":0", dragon_fdc_device_base, "qd", dragon_fdc_device_base::floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+ MCFG_FLOPPY_DRIVE_ADD(WD2791_TAG ":1", dragon_fdc_device_base, "qd", dragon_fdc_device_base::floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+ MCFG_FLOPPY_DRIVE_ADD(WD2791_TAG ":2", dragon_fdc_device_base, "", dragon_fdc_device_base::floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+ MCFG_FLOPPY_DRIVE_ADD(WD2791_TAG ":3", dragon_fdc_device_base, "", dragon_fdc_device_base::floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+MACHINE_CONFIG_END
+
+
//**************************************************************************
// IMPLEMENTATION
//**************************************************************************
@@ -154,6 +192,14 @@ dragon_fdc_device_base::dragon_fdc_device_base(const machine_config &mconfig, de
}
+premier_fdc_device_base::premier_fdc_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : coco_family_fdc_device_base(mconfig, type, tag, owner, clock)
+ , m_wd2791(*this, WD2791_TAG)
+ , m_floppies(*this, WD2791_TAG ":%u", 0)
+{
+}
+
+
//-------------------------------------------------
// update_lines - Dragon specific disk
// controller lines
@@ -169,6 +215,11 @@ void dragon_fdc_device_base::update_lines()
}
+void premier_fdc_device_base::update_lines()
+{
+}
+
+
//-------------------------------------------------
// dskreg_w - function to write to
// Dragon dskreg
@@ -179,14 +230,14 @@ void dragon_fdc_device_base::dskreg_w(uint8_t data)
if (LOG_FDC)
{
logerror("fdc_dragon_dskreg_w(): %c%c%c%c%c%c%c%c ($%02x)\n",
- data & 0x80 ? 'X' : 'x',
- data & 0x40 ? 'X' : 'x',
- data & 0x20 ? 'N' : 'n',
- data & 0x10 ? 'P' : 'p',
- data & 0x08 ? 'S' : 'D',
- data & 0x04 ? 'M' : 'm',
- data & 0x02 ? '1' : '0',
- data & 0x01 ? '1' : '0',
+ BIT(data, 7) ? 'X' : 'x',
+ BIT(data, 6) ? 'X' : 'x',
+ BIT(data, 5) ? 'N' : 'n',
+ BIT(data, 4) ? 'P' : 'p',
+ BIT(data, 3) ? 'S' : 'D',
+ BIT(data, 2) ? 'M' : 'm',
+ BIT(data, 1) ? '1' : '0',
+ BIT(data, 0) ? '1' : '0',
data);
}
@@ -195,7 +246,7 @@ void dragon_fdc_device_base::dskreg_w(uint8_t data)
{
floppy_image_device *floppy = m_floppies[i]->get_device();
if (floppy)
- floppy->mon_w((data & 0x04) && (i == (data & 0x03)) ? CLEAR_LINE : ASSERT_LINE);
+ floppy->mon_w(BIT(data,2) && (i == (data & 0x03)) ? CLEAR_LINE : ASSERT_LINE);
}
// manipulate the WD2797
@@ -206,6 +257,44 @@ void dragon_fdc_device_base::dskreg_w(uint8_t data)
}
+void premier_fdc_device_base::dskreg_w(uint8_t data)
+{
+ if (LOG_FDC)
+ {
+ logerror("fdc_premier_dskreg_w(): %c%c%c%c%c%c%c%c ($%02x)\n",
+ BIT(data, 7) ? 'X' : 'x',
+ BIT(data, 6) ? 'X' : 'x',
+ BIT(data, 5) ? 'X' : 'x',
+ BIT(data, 4) ? 'D' : 'S',
+ BIT(data, 3) ? '8' : '5',
+ BIT(data, 2) ? '1' : '0',
+ BIT(data, 1) ? '1' : '0',
+ BIT(data, 0) ? '1' : '0',
+ data);
+ }
+ floppy_image_device *floppy = nullptr;
+
+ // update the motor on each floppy
+ for (int i = 0; i < 4; i++)
+ {
+ floppy = m_floppies[i]->get_device();
+ if (floppy)
+ floppy->mon_w((i == (data & 0x03)) ? CLEAR_LINE : ASSERT_LINE );
+ }
+ floppy = m_floppies[data & 0x03]->get_device();
+
+ // manipulate the WD2791
+ m_wd2791->set_floppy(floppy);
+
+ if (floppy)
+ floppy->ss_w(BIT(data, 2));
+
+ m_wd2791->dden_w(!BIT(data, 4));
+
+ set_dskreg(data);
+}
+
+
//-------------------------------------------------
// scs_read
//-------------------------------------------------
@@ -213,25 +302,34 @@ void dragon_fdc_device_base::dskreg_w(uint8_t data)
READ8_MEMBER(dragon_fdc_device_base::scs_read)
{
uint8_t result = 0;
- switch (offset & 0xEF)
+ switch (offset & 0xef)
{
case 0:
- result = m_wd2797->status_r(space, 0);
- break;
case 1:
- result = m_wd2797->track_r(space, 0);
- break;
case 2:
- result = m_wd2797->sector_r(space, 0);
- break;
case 3:
- result = m_wd2797->data_r(space, 0);
+ result = m_wd2797->read(space, offset & 0xef);
break;
}
return result;
}
+READ8_MEMBER(premier_fdc_device_base::scs_read)
+{
+ uint8_t result = 0;
+ switch (offset)
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ result = m_wd2791->read(space, offset);
+ break;
+ }
+ return result;
+}
+
//-------------------------------------------------
// scs_write
@@ -239,19 +337,13 @@ READ8_MEMBER(dragon_fdc_device_base::scs_read)
WRITE8_MEMBER(dragon_fdc_device_base::scs_write)
{
- switch (offset & 0xEF)
+ switch (offset & 0xef)
{
case 0:
- m_wd2797->cmd_w(space, 0, data);
- break;
case 1:
- m_wd2797->track_w(space, 0, data);
- break;
case 2:
- m_wd2797->sector_w(space, 0, data);
- break;
case 3:
- m_wd2797->data_w(space, 0, data);
+ m_wd2797->write(space, offset & 0xef, data);
break;
case 8: case 9: case 10: case 11:
case 12: case 13: case 14: case 15:
@@ -261,6 +353,21 @@ WRITE8_MEMBER(dragon_fdc_device_base::scs_write)
}
+WRITE8_MEMBER(premier_fdc_device_base::scs_write)
+{
+ switch (offset)
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ m_wd2791->write(space, offset, data);
+ break;
+ case 4:
+ dskreg_w(data);
+ break;
+ };
+}
//**************************************************************************
@@ -296,6 +403,38 @@ DEFINE_DEVICE_TYPE(DRAGON_FDC, dragon_fdc_device, "dragon_fdc", "Dragon FDC")
//**************************************************************************
+// PREMIER FDC
+//**************************************************************************
+
+ROM_START(premier_fdc)
+ ROM_REGION(0x4000, "eprom", ROMREGION_ERASE00)
+ ROM_LOAD_OPTIONAL("deltados.rom", 0x0000, 0x2000, CRC(149eb4dd) SHA1(eb686ce6afe63e4d4011b333a882ca812c69307f))
+ROM_END
+
+namespace
+{
+ class premier_fdc_device : public premier_fdc_device_base
+ {
+ public:
+ // construction/destruction
+ premier_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : premier_fdc_device_base(mconfig, PREMIER_FDC, tag, owner, clock)
+ {
+ }
+
+ protected:
+ // optional information overrides
+ virtual const tiny_rom_entry *device_rom_region() const override
+ {
+ return ROM_NAME(premier_fdc);
+ }
+ };
+};
+
+DEFINE_DEVICE_TYPE(PREMIER_FDC, premier_fdc_device, "premier_fdc", "Premier FDC")
+
+
+//**************************************************************************
// SDTANDY FDC
//**************************************************************************