summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Dirk Best <mail@dirk-best.de>2015-05-31 18:10:58 +0200
committer Dirk Best <mail@dirk-best.de>2015-05-31 18:11:26 +0200
commit75b15886e3d8ea223dd3674f0b5020231923a651 (patch)
tree63037ffffa7d97c1c300a6fe6f4281a98e12c4bf
parentb7a823de3f76de9a67835a75cde2ee8f604a01ba (diff)
pk8020: updated to use the new wd fdc. fixes regression booting cp/m.
-rw-r--r--scripts/src/lib.lua2
-rw-r--r--src/lib/formats/pk8020_dsk.c44
-rw-r--r--src/lib/formats/pk8020_dsk.h33
-rw-r--r--src/mess/drivers/pk8020.c40
-rw-r--r--src/mess/includes/pk8020.h14
-rw-r--r--src/mess/machine/pk8020.c59
6 files changed, 133 insertions, 59 deletions
diff --git a/scripts/src/lib.lua b/scripts/src/lib.lua
index e24ff00f438..788aaf18e9d 100644
--- a/scripts/src/lib.lua
+++ b/scripts/src/lib.lua
@@ -313,6 +313,8 @@ project "formats"
MAME_DIR .. "src/lib/formats/pc98fdi_dsk.h",
MAME_DIR .. "src/lib/formats/phc25_cas.c",
MAME_DIR .. "src/lib/formats/phc25_cas.h",
+ MAME_DIR .. "src/lib/formats/pk8020_dsk.c",
+ MAME_DIR .. "src/lib/formats/pk8020_dsk.h",
MAME_DIR .. "src/lib/formats/pmd_cas.c",
MAME_DIR .. "src/lib/formats/pmd_cas.h",
MAME_DIR .. "src/lib/formats/primoptp.c",
diff --git a/src/lib/formats/pk8020_dsk.c b/src/lib/formats/pk8020_dsk.c
new file mode 100644
index 00000000000..e21fdbdb98e
--- /dev/null
+++ b/src/lib/formats/pk8020_dsk.c
@@ -0,0 +1,44 @@
+// license:GPL-2.0+
+// copyright-holders:Dirk Best
+/***************************************************************************
+
+ PK-8020
+
+ Disk image format
+
+ TODO:
+ - Verify gap sizes
+
+***************************************************************************/
+
+#include "pk8020_dsk.h"
+
+pk8020_format::pk8020_format() : wd177x_format(formats)
+{
+}
+
+const char *pk8020_format::name() const
+{
+ return "pk8020";
+}
+
+const char *pk8020_format::description() const
+{
+ return "PK-8020 disk image";
+}
+
+const char *pk8020_format::extensions() const
+{
+ return "kdi";
+}
+
+const pk8020_format::format pk8020_format::formats[] =
+{
+ {
+ floppy_image::FF_525, floppy_image::DSQD, floppy_image::MFM,
+ 2000, 5, 80, 2, 1024, {}, 1, {}, 60, 22, 24
+ },
+ {}
+};
+
+const floppy_format_type FLOPPY_PK8020_FORMAT = &floppy_image_format_creator<pk8020_format>;
diff --git a/src/lib/formats/pk8020_dsk.h b/src/lib/formats/pk8020_dsk.h
new file mode 100644
index 00000000000..1700530c781
--- /dev/null
+++ b/src/lib/formats/pk8020_dsk.h
@@ -0,0 +1,33 @@
+// license:GPL-2.0+
+// copyright-holders:Dirk Best
+/***************************************************************************
+
+ PK-8020
+
+ Disk image format
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __PK8020_DSK_H__
+#define __PK8020_DSK_H__
+
+#include "wd177x_dsk.h"
+
+class pk8020_format : public wd177x_format
+{
+public:
+ pk8020_format();
+
+ virtual const char *name() const;
+ virtual const char *description() const;
+ virtual const char *extensions() const;
+
+private:
+ static const format formats[];
+};
+
+extern const floppy_format_type FLOPPY_PK8020_FORMAT;
+
+#endif // __PK8020_DSK_H__
diff --git a/src/mess/drivers/pk8020.c b/src/mess/drivers/pk8020.c
index e238baf7b3c..49d8faec173 100644
--- a/src/mess/drivers/pk8020.c
+++ b/src/mess/drivers/pk8020.c
@@ -14,7 +14,7 @@
#include "cpu/i8085/i8085.h"
#include "machine/i8255.h"
#include "imagedev/flopdrv.h"
-#include "formats/basicdsk.h"
+#include "formats/pk8020_dsk.h"
#include "includes/pk8020.h"
#include "machine/ram.h"
@@ -141,21 +141,6 @@ static INPUT_PORTS_START( pk8020 )
PORT_BIT(0xFF, IP_ACTIVE_HIGH, IPT_UNUSED)
INPUT_PORTS_END
-static LEGACY_FLOPPY_OPTIONS_START(pk8020)
- LEGACY_FLOPPY_OPTION(pk8020, "kdi", "PK8020 disk image", basicdsk_identify_default, basicdsk_construct_default, NULL,
- HEADS([2])
- TRACKS([80])
- SECTORS([5])
- SECTOR_LENGTH([1024])
- FIRST_SECTOR_ID([1]))
-LEGACY_FLOPPY_OPTIONS_END
-
-static const floppy_interface pk8020_floppy_interface =
-{
- FLOPPY_STANDARD_5_25_DSHD,
- LEGACY_FLOPPY_OPTIONS_NAME(pk8020),
- "floppy_5_25"
-};
/* F4 Character Displayer */
static const gfx_layout pk8020_charlayout =
@@ -176,6 +161,15 @@ static GFXDECODE_START( pk8020 )
GFXDECODE_END
+FLOPPY_FORMATS_MEMBER( pk8020_state::floppy_formats )
+ FLOPPY_PK8020_FORMAT
+FLOPPY_FORMATS_END
+
+static SLOT_INTERFACE_START( pk8020_floppies )
+ SLOT_INTERFACE("qd", FLOPPY_525_QD)
+SLOT_INTERFACE_END
+
+
/* Machine driver */
static MACHINE_CONFIG_START( pk8020, pk8020_state )
/* basic machine hardware */
@@ -221,9 +215,14 @@ static MACHINE_CONFIG_START( pk8020, pk8020_state )
MCFG_DEVICE_ADD("rs232", I8251, 0)
MCFG_DEVICE_ADD("lan", I8251, 0)
- MCFG_DEVICE_ADD("wd1793", FD1793, 0)
- MCFG_WD17XX_DEFAULT_DRIVE4_TAGS
- MCFG_WD17XX_DDEN_CALLBACK(VCC)
+ MCFG_FD1793x_ADD("wd1793", XTAL_20MHz / 20)
+
+ MCFG_FLOPPY_DRIVE_ADD("wd1793:0", pk8020_floppies, "qd", pk8020_state::floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("wd1793:1", pk8020_floppies, "qd", pk8020_state::floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("wd1793:2", pk8020_floppies, "qd", pk8020_state::floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("wd1793:3", pk8020_floppies, "qd", pk8020_state::floppy_formats)
+
+ MCFG_SOFTWARE_LIST_ADD("flop_list", "korvet_flop")
/* audio hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
@@ -235,9 +234,6 @@ static MACHINE_CONFIG_START( pk8020, pk8020_state )
MCFG_CASSETTE_ADD( "cassette" )
MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY)
- MCFG_LEGACY_FLOPPY_4_DRIVES_ADD(pk8020_floppy_interface)
- MCFG_SOFTWARE_LIST_ADD("flop_list","korvet_flop")
-
/* internal ram */
MCFG_RAM_ADD(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("258K") //64 + 4*48 + 2
diff --git a/src/mess/includes/pk8020.h b/src/mess/includes/pk8020.h
index 63994d4a536..e73fa870187 100644
--- a/src/mess/includes/pk8020.h
+++ b/src/mess/includes/pk8020.h
@@ -13,7 +13,7 @@
#include "machine/pit8253.h"
#include "machine/pic8259.h"
#include "machine/i8251.h"
-#include "machine/wd17xx.h"
+#include "machine/wd_fdc.h"
#include "imagedev/cassette.h"
#include "sound/speaker.h"
#include "sound/wave.h"
@@ -33,6 +33,10 @@ public:
m_lan(*this, "lan"),
m_ram(*this, RAM_TAG),
m_wd1793(*this, "wd1793"),
+ m_floppy0(*this, "wd1793:0"),
+ m_floppy1(*this, "wd1793:1"),
+ m_floppy2(*this, "wd1793:2"),
+ m_floppy3(*this, "wd1793:3"),
m_pit8253(*this, "pit8253"),
m_pic8259(*this, "pic8259"),
m_speaker(*this, "speaker"),
@@ -40,6 +44,8 @@ public:
m_region_gfx1(*this, "gfx1"),
m_palette(*this, "palette") { }
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
+
UINT8 m_color;
UINT8 m_video_page;
UINT8 m_wide;
@@ -84,7 +90,11 @@ protected:
required_device<i8251_device> m_rs232;
required_device<i8251_device> m_lan;
required_device<ram_device> m_ram;
- required_device<fd1793_device> m_wd1793;
+ required_device<fd1793_t> m_wd1793;
+ required_device<floppy_connector> m_floppy0;
+ required_device<floppy_connector> m_floppy1;
+ required_device<floppy_connector> m_floppy2;
+ required_device<floppy_connector> m_floppy3;
required_device<pit8253_device> m_pit8253;
required_device<pic8259_device> m_pic8259;
required_device<speaker_sound_device> m_speaker;
diff --git a/src/mess/machine/pk8020.c b/src/mess/machine/pk8020.c
index 21816e14f7f..d20ab196748 100644
--- a/src/mess/machine/pk8020.c
+++ b/src/mess/machine/pk8020.c
@@ -157,13 +157,7 @@ READ8_MEMBER(pk8020_state::devices_r)
case 1 : return m_rs232->status_r(space,0);
}
break;
- case 0x18: switch(offset & 3) {
- case 0 : return m_wd1793->status_r(space, 0);
- case 1 : return m_wd1793->track_r(space, 0);
- case 2 : return m_wd1793->sector_r(space, 0);
- case 3 : return m_wd1793->data_r(space, 0);
- }
- break;
+ case 0x18: return m_wd1793->read(space, offset & 0x03);
case 0x20: switch(offset & 1) {
case 0 : return m_lan->data_r(space,0);
case 1 : return m_lan->status_r(space,0);
@@ -187,13 +181,9 @@ WRITE8_MEMBER(pk8020_state::devices_w)
case 1 : m_rs232->control_w(space,0,data); break;
}
break;
- case 0x18: switch(offset & 3) {
- case 0 : m_wd1793->command_w(space, 0,data);break;
- case 1 : m_wd1793->track_w(space, 0,data);break;
- case 2 : m_wd1793->sector_w(space, 0,data);break;
- case 3 : m_wd1793->data_w(space, 0,data);break;
- }
- break;
+ case 0x18:
+ m_wd1793->write(space, offset & 0x03, data);
+ break;
case 0x20: switch(offset & 1) {
case 0 : m_lan->data_w(space,0,data); break;
case 1 : m_lan->control_w(space,0,data); break;
@@ -841,29 +831,28 @@ WRITE8_MEMBER(pk8020_state::pk8020_portc_w)
WRITE8_MEMBER(pk8020_state::pk8020_portb_w)
{
+ floppy_image_device *floppy = NULL;
+
// Turn all motors off
- floppy_get_device(machine(), 0)->floppy_mon_w(1);
- floppy_get_device(machine(), 1)->floppy_mon_w(1);
- floppy_get_device(machine(), 2)->floppy_mon_w(1);
- floppy_get_device(machine(), 3)->floppy_mon_w(1);
- m_wd1793->set_side(BIT(data,4));
- if (BIT(data,0)) {
- m_wd1793->set_drive(0);
- floppy_get_device(machine(), 0)->floppy_mon_w(0);
- floppy_get_device(machine(), 0)->floppy_drive_set_ready_state(1, 1);
- } else if (BIT(data,1)) {
- m_wd1793->set_drive(1);
- floppy_get_device(machine(), 1)->floppy_mon_w(0);
- floppy_get_device(machine(), 1)->floppy_drive_set_ready_state(1, 1);
- } else if (BIT(data,2)) {
- m_wd1793->set_drive(2);
- floppy_get_device(machine(), 2)->floppy_mon_w(0);
- floppy_get_device(machine(), 2)->floppy_drive_set_ready_state(1, 1);
- } else if (BIT(data,3)) {
- m_wd1793->set_drive(3);
- floppy_get_device(machine(), 3)->floppy_mon_w(0);
- floppy_get_device(machine(), 3)->floppy_drive_set_ready_state(1, 1);
+ if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(1);
+ if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(1);
+ if (m_floppy2->get_device()) m_floppy2->get_device()->mon_w(1);
+ if (m_floppy3->get_device()) m_floppy3->get_device()->mon_w(1);
+
+ if (BIT(data, 0)) floppy = m_floppy0->get_device();
+ if (BIT(data, 1)) floppy = m_floppy1->get_device();
+ if (BIT(data, 2)) floppy = m_floppy2->get_device();
+ if (BIT(data, 3)) floppy = m_floppy3->get_device();
+
+ m_wd1793->set_floppy(floppy);
+
+ if (floppy)
+ {
+ floppy->mon_w(0);
+ floppy->ss_w(BIT(data, 4));
}
+
+ // todo: at least bit 5 and bit 7 is connected to something too...
}
READ8_MEMBER(pk8020_state::pk8020_portc_r)