diff options
-rw-r--r-- | scripts/src/lib.lua | 2 | ||||
-rw-r--r-- | src/lib/formats/pk8020_dsk.c | 44 | ||||
-rw-r--r-- | src/lib/formats/pk8020_dsk.h | 33 | ||||
-rw-r--r-- | src/mess/drivers/pk8020.c | 40 | ||||
-rw-r--r-- | src/mess/includes/pk8020.h | 14 | ||||
-rw-r--r-- | src/mess/machine/pk8020.c | 59 |
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) |