diff options
author | Dirk Best <mail@dirk-best.de> | 2015-05-27 16:44:18 +0200 |
---|---|---|
committer | Dirk Best <mail@dirk-best.de> | 2015-05-27 16:44:47 +0200 |
commit | d08d7c094d671562ec513c32e72d4fa462e639dc (patch) | |
tree | 0b06c343a72238515c5ce1d93ea967bde32b4f82 | |
parent | b0243d6da942866f5ba33dba6fa49d1c696e3e12 (diff) |
bbc: Update to use the new wd_fdc. Until the 8271 floppy controller is
updated, drive 0 and 1 = 8271 and drive 2 and 3 = wd_fdc.
-rw-r--r-- | scripts/src/lib.lua | 2 | ||||
-rw-r--r-- | src/lib/formats/bbc_dsk.c | 53 | ||||
-rw-r--r-- | src/lib/formats/bbc_dsk.h | 33 | ||||
-rw-r--r-- | src/mess/drivers/bbc.c | 62 | ||||
-rw-r--r-- | src/mess/includes/bbc.h | 4 | ||||
-rw-r--r-- | src/mess/machine/bbc.c | 99 |
6 files changed, 194 insertions, 59 deletions
diff --git a/scripts/src/lib.lua b/scripts/src/lib.lua index 54540f0f630..a4bca8d6c50 100644 --- a/scripts/src/lib.lua +++ b/scripts/src/lib.lua @@ -158,6 +158,8 @@ project "formats" MAME_DIR .. "src/lib/formats/atarist_dsk.h", MAME_DIR .. "src/lib/formats/atom_tap.c", MAME_DIR .. "src/lib/formats/atom_tap.h", + MAME_DIR .. "src/lib/formats/bbc_dsk.c", + MAME_DIR .. "src/lib/formats/bbc_dsk.h", MAME_DIR .. "src/lib/formats/bw2_dsk.c", MAME_DIR .. "src/lib/formats/bw2_dsk.h", MAME_DIR .. "src/lib/formats/bw12_dsk.c", diff --git a/src/lib/formats/bbc_dsk.c b/src/lib/formats/bbc_dsk.c new file mode 100644 index 00000000000..dfa78c0bfd8 --- /dev/null +++ b/src/lib/formats/bbc_dsk.c @@ -0,0 +1,53 @@ +// license:GPL-2.0+ +// copyright-holders:Dirk Best +/*************************************************************************** + + BBC Micro + + Disk image format + +***************************************************************************/ + +#include "bbc_dsk.h" + +bbc_format::bbc_format() : wd177x_format(formats) +{ +} + +const char *bbc_format::name() const +{ + return "bbc"; +} + +const char *bbc_format::description() const +{ + return "BBC Micro disk image"; +} + +const char *bbc_format::extensions() const +{ + return "bbc,img,ssd,dsd"; +} + +const bbc_format::format bbc_format::formats[] = +{ + { // 100k single sided single density + floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM, + 4000, 10, 40, 1, 256, {}, 0, {}, 16, 11, 19 + }, + { // 200k double sided single density + floppy_image::FF_525, floppy_image::DSSD, floppy_image::FM, + 4000, 10, 40, 2, 256, {}, 0, {}, 16, 11, 19 + }, + { // 200k single sided double density + floppy_image::FF_525, floppy_image::SSQD, floppy_image::FM, + 4000, 10, 80, 1, 256, {}, 0, {}, 16, 11, 19 + }, + { // 400k double sided double density + floppy_image::FF_525, floppy_image::DSQD, floppy_image::FM, + 4000, 10, 80, 2, 256, {}, 0, {}, 16, 11, 19 + }, + {} +}; + +const floppy_format_type FLOPPY_BBC_FORMAT = &floppy_image_format_creator<bbc_format>; diff --git a/src/lib/formats/bbc_dsk.h b/src/lib/formats/bbc_dsk.h new file mode 100644 index 00000000000..e2520781a15 --- /dev/null +++ b/src/lib/formats/bbc_dsk.h @@ -0,0 +1,33 @@ +// license:GPL-2.0+ +// copyright-holders:Dirk Best +/*************************************************************************** + + BBC Micro + + Disk image format + +***************************************************************************/ + +#pragma once + +#ifndef __BBC_DSK_H__ +#define __BBC_DSK_H__ + +#include "wd177x_dsk.h" + +class bbc_format : public wd177x_format +{ +public: + bbc_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_BBC_FORMAT; + +#endif // __BBC_DSK_H__ diff --git a/src/mess/drivers/bbc.c b/src/mess/drivers/bbc.c index ca639730143..de7f17dee44 100644 --- a/src/mess/drivers/bbc.c +++ b/src/mess/drivers/bbc.c @@ -57,6 +57,7 @@ /* Devices */ #include "imagedev/flopdrv.h" +#include "formats/bbc_dsk.h" #include "formats/basicdsk.h" #include "imagedev/cassette.h" #include "formats/uef_cas.h" @@ -609,6 +610,19 @@ static const floppy_interface bbc_floppy_interface = "floppy_5_25" }; +FLOPPY_FORMATS_MEMBER( bbc_state::floppy_formats ) + FLOPPY_BBC_FORMAT +FLOPPY_FORMATS_END + +static SLOT_INTERFACE_START( bbc_floppies ) + SLOT_INTERFACE("sssd", FLOPPY_525_SSSD) + SLOT_INTERFACE("sd", FLOPPY_525_SD) + SLOT_INTERFACE("ssdd", FLOPPY_525_SSDD) + SLOT_INTERFACE("dd", FLOPPY_525_DD) + SLOT_INTERFACE("ssqd", FLOPPY_525_SSQD) + SLOT_INTERFACE("qd", FLOPPY_525_QD) +SLOT_INTERFACE_END + WRITE_LINE_MEMBER(bbc_state::econet_clk_w) { m_adlc->rxc_w(state); @@ -760,13 +774,15 @@ static MACHINE_CONFIG_DERIVED( bbcb, bbca ) MCFG_I8271_IRQ_CALLBACK(WRITELINE(bbc_state, bbc_i8271_interrupt)) MCFG_I8271_FLOPPIES(FLOPPY_0, FLOPPY_1) - MCFG_DEVICE_ADD("wd177x", WD1770, 0) - MCFG_WD17XX_DEFAULT_DRIVE2_TAGS - MCFG_WD17XX_INTRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_intrq_w)) - MCFG_WD17XX_DRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_drq_w)) - MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(bbc_floppy_interface) + MCFG_WD1770x_ADD("wd177x", XTAL_16MHz / 2) + MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_intrq_w)) + MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_drq_w)) + + MCFG_FLOPPY_DRIVE_ADD("wd177x:0", bbc_floppies, "qd", bbc_state::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("wd177x:1", bbc_floppies, "qd", bbc_state::floppy_formats) + /* software lists */ MCFG_DEVICE_REMOVE("cass_ls_a") MCFG_SOFTWARE_LIST_ADD("cass_ls_b", "bbcb_cass") @@ -822,13 +838,15 @@ static MACHINE_CONFIG_DERIVED( bbcb_us, bbca ) MCFG_I8271_IRQ_CALLBACK(WRITELINE(bbc_state, bbc_i8271_interrupt)) MCFG_I8271_FLOPPIES(FLOPPY_0, FLOPPY_1) - MCFG_DEVICE_ADD("wd177x", WD1770, 0) - MCFG_WD17XX_DEFAULT_DRIVE2_TAGS - MCFG_WD17XX_INTRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_intrq_w)) - MCFG_WD17XX_DRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_drq_w)) - MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(bbc_floppy_interface) + MCFG_WD1770x_ADD("wd177x", XTAL_16MHz / 2) + MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_intrq_w)) + MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_drq_w)) + + MCFG_FLOPPY_DRIVE_ADD("wd177x:0", bbc_floppies, "qd", bbc_state::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("wd177x:1", bbc_floppies, "qd", bbc_state::floppy_formats) + /* software lists */ MCFG_DEVICE_REMOVE("cass_ls_a") MCFG_SOFTWARE_LIST_ADD("cass_ls_b", "bbcb_cass") @@ -852,6 +870,8 @@ static MACHINE_CONFIG_DERIVED( bbcbp, bbcb ) /* fdc */ MCFG_DEVICE_REMOVE("i8271") + MCFG_DEVICE_REMOVE(FLOPPY_0) + MCFG_DEVICE_REMOVE(FLOPPY_1) MACHINE_CONFIG_END @@ -981,12 +1001,12 @@ static MACHINE_CONFIG_START( bbcm, bbc_state ) MCFG_VIA6522_IRQ_HANDLER(WRITELINE(bbc_state, bbcb_via_user_irq_w)) /* fdc */ - MCFG_DEVICE_ADD("wd177x", WD1770, 0) - MCFG_WD17XX_DEFAULT_DRIVE2_TAGS - MCFG_WD17XX_INTRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_intrq_w)) - MCFG_WD17XX_DRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_drq_w)) + MCFG_WD1770x_ADD("wd177x", XTAL_16MHz / 2) + MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_intrq_w)) + MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_drq_w)) - MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(bbc_floppy_interface) + MCFG_FLOPPY_DRIVE_ADD("wd177x:0", bbc_floppies, "qd", bbc_state::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("wd177x:1", bbc_floppies, "qd", bbc_state::floppy_formats) /* econet */ MCFG_DEVICE_ADD("mc6854", MC6854, 0) @@ -1068,10 +1088,14 @@ static MACHINE_CONFIG_DERIVED( bbcmc, bbcm ) /* fdc */ MCFG_DEVICE_REMOVE("wd177x") - MCFG_DEVICE_ADD("wd177x", WD1772, 0) - MCFG_WD17XX_DEFAULT_DRIVE2_TAGS - MCFG_WD17XX_INTRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_intrq_w)) - MCFG_WD17XX_DRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_drq_w)) + +// MCFG_WD1772x_ADD("wd177x", XTAL_16MHz / 2) + MCFG_WD1770x_ADD("wd177x", XTAL_16MHz / 2) + MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_intrq_w)) + MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_drq_w)) + + MCFG_FLOPPY_DRIVE_ADD("wd177x:0", bbc_floppies, "qd", bbc_state::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("wd177x:1", bbc_floppies, "qd", bbc_state::floppy_formats) /* software lists */ MCFG_SOFTWARE_LIST_REMOVE("cart_ls_m") diff --git a/src/mess/includes/bbc.h b/src/mess/includes/bbc.h index 98e1c9b5a6c..11bd1c13eb1 100644 --- a/src/mess/includes/bbc.h +++ b/src/mess/includes/bbc.h @@ -20,7 +20,7 @@ #include "machine/mc6854.h" #include "machine/ram.h" #include "machine/i8271.h" -#include "machine/wd17xx.h" +#include "machine/wd_fdc.h" #include "machine/upd7002.h" #include "video/mc6845.h" #include "video/saa5050.h" @@ -80,6 +80,8 @@ public: m_palette(*this, "palette") { } + DECLARE_FLOPPY_FORMATS(floppy_formats); + DECLARE_WRITE8_MEMBER(bbc_page_selecta_w); DECLARE_WRITE8_MEMBER(bbc_memorya1_w); DECLARE_WRITE8_MEMBER(bbc_page_selectb_w); diff --git a/src/mess/machine/bbc.c b/src/mess/machine/bbc.c index efc9da1102e..d0a5572540e 100644 --- a/src/mess/machine/bbc.c +++ b/src/mess/machine/bbc.c @@ -17,7 +17,7 @@ #include "cpu/m6502/m6502.h" #include "sound/tms5220.h" #include "machine/6522via.h" -#include "machine/wd17xx.h" +#include "machine/wd_fdc.h" #include "imagedev/flopdrv.h" #include "includes/bbc.h" #include "machine/mc146818.h" @@ -1576,7 +1576,7 @@ void bbc_state::bbc_update_fdq_int(int state) /* do not trigger int */ bbc_state = 0; } - +//printf("bbc_state %d prev %d\n", bbc_state, m_previous_wd177x_int_state); /* nmi is edge triggered, and triggers when the state goes from clear->set. Here we are checking this transition before triggering the nmi */ if (bbc_state!=m_previous_wd177x_int_state) @@ -1594,6 +1594,7 @@ void bbc_state::bbc_update_fdq_int(int state) WRITE_LINE_MEMBER(bbc_state::bbc_wd177x_intrq_w) { +//printf("bbc_wd177x_intrq_w %d \n", state); m_wd177x_irq_state = state; bbc_update_fdq_int(state); } @@ -1606,20 +1607,28 @@ WRITE_LINE_MEMBER(bbc_state::bbc_wd177x_drq_w) WRITE8_MEMBER(bbc_state::bbc_wd177x_status_w) { - wd1770_device *fdc = machine().device<wd1770_device>("wd177x"); + wd1770_t *fdc = machine().device<wd1770_t>("wd177x"); + floppy_image_device *floppy0 = machine().device<floppy_connector>("wd177x:0")->get_device(); + floppy_image_device *floppy1 = machine().device<floppy_connector>("wd177x:1")->get_device(); + floppy_image_device *floppy = NULL; + m_drive_control = data; - /* set drive */ - if ((data>>0) & 0x01) fdc->set_drive(0); - if ((data>>1) & 0x01) fdc->set_drive(1); + // bit 0, 1: drive select + if (BIT(data, 0)) floppy = floppy0; + if (BIT(data, 1)) floppy = floppy1; + + fdc->set_floppy(floppy); - /* set side */ - fdc->set_side((data>>2) & 0x01); + // bit 2: side select + if (floppy) + floppy->ss_w(BIT(data, 2)); - /* set density */ + // bit 3: density fdc->dden_w(BIT(data, 3)); - m_1770_IntEnabled=(((data>>4) & 0x01)==0); + // bit 4: interrupt enable + m_1770_IntEnabled = !BIT(data, 4); } @@ -1627,7 +1636,7 @@ WRITE8_MEMBER(bbc_state::bbc_wd177x_status_w) READ8_MEMBER(bbc_state::bbc_wd1770_read) { int retval=0xff; - wd1770_device *fdc = machine().device<wd1770_device>("wd177x"); + wd1770_t *fdc = machine().device<wd1770_t>("wd177x"); switch (offset) { case 4: @@ -1645,22 +1654,22 @@ READ8_MEMBER(bbc_state::bbc_wd1770_read) default: break; } - logerror("wd177x read: $%02X $%02X\n", offset,retval); + //logerror("wd177x read: $%02X $%02X\n", offset,retval); return retval; } WRITE8_MEMBER(bbc_state::bbc_wd1770_write) { - wd1770_device *fdc = machine().device<wd1770_device>("wd177x"); - logerror("wd177x write: $%02X $%02X\n", offset,data); + wd1770_t *fdc = machine().device<wd1770_t>("wd177x"); + //logerror("wd177x write: $%02X $%02X\n", offset,data); switch (offset) { case 0: bbc_wd177x_status_w(space, 0, data); break; case 4: - fdc->command_w(space, 0, data); + fdc->cmd_w(space, 0, data); break; case 5: fdc->track_w(space, 0, data); @@ -1715,26 +1724,34 @@ AM_RANGE(0xfc00, 0xfdff) AM_READWRITE(bbc_opus_read , bbc_opus_write ) WRITE8_MEMBER(bbc_state::bbc_opus_status_w) { - wd1770_device *fdc = machine().device<wd1770_device>("wd177x"); + wd1770_t *fdc = machine().device<wd1770_t>("wd177x"); + floppy_image_device *floppy0 = machine().device<floppy_connector>("wd177x:0")->get_device(); + floppy_image_device *floppy1 = machine().device<floppy_connector>("wd177x:1")->get_device(); + floppy_image_device *floppy = NULL; + m_drive_control = data; - /* set drive */ - if ((data>>1) & 0x01) fdc->set_drive(0); - if ((data>>2) & 0x01) fdc->set_drive(1); + // bit 1, 2: drive select + if (BIT(data, 1)) floppy = floppy0; + if (BIT(data, 2)) floppy = floppy1; - /* set side */ - fdc->set_side((data>>0) & 0x01); + fdc->set_floppy(floppy); - /* set density */ + // bit 0: side select + if (floppy) + floppy->ss_w(BIT(data, 0)); + + // bit 5: density fdc->dden_w(BIT(data, 5)); - m_1770_IntEnabled=(data>>4) & 0x01; + // bit 4: interrupt enable + m_1770_IntEnabled = BIT(data, 4); } READ8_MEMBER(bbc_state::bbc_opus_read) { - wd1770_device *fdc = machine().device<wd1770_device>("wd177x"); - logerror("wd177x read: $%02X\n", offset); + wd1770_t *fdc = machine().device<wd1770_t>("wd177x"); + //logerror("wd177x read: $%02X\n", offset); if (m_DFSType==6) { @@ -1762,8 +1779,8 @@ READ8_MEMBER(bbc_state::bbc_opus_read) WRITE8_MEMBER(bbc_state::bbc_opus_write) { - wd1770_device *fdc = machine().device<wd1770_device>("wd177x"); - logerror("wd177x write: $%02X $%02X\n", offset,data); + wd1770_t *fdc = machine().device<wd1770_t>("wd177x"); + //logerror("wd177x write: $%02X $%02X\n", offset,data); if (m_DFSType==6) { @@ -1772,7 +1789,7 @@ WRITE8_MEMBER(bbc_state::bbc_opus_write) switch (offset) { case 0xf8: - fdc->command_w(space, 0, data); + fdc->cmd_w(space, 0, data); break; case 0xf9: fdc->track_w(space, 0, data); @@ -1810,7 +1827,7 @@ BBC MASTER DISC SUPPORT READ8_MEMBER(bbc_state::bbcm_wd1770_read) { int retval=0xff; - wd1770_device *fdc = machine().device<wd1770_device>("wd177x"); + wd1770_t *fdc = machine().device<wd1770_t>("wd177x"); switch (offset) { case 0: @@ -1834,12 +1851,12 @@ READ8_MEMBER(bbc_state::bbcm_wd1770_read) WRITE8_MEMBER(bbc_state::bbcm_wd1770_write) { - wd1770_device *fdc = machine().device<wd1770_device>("wd177x"); + wd1770_t *fdc = machine().device<wd1770_t>("wd177x"); //logerror("wd177x write: $%02X $%02X\n", offset,data); switch (offset) { case 0: - fdc->command_w(space, 0, data); + fdc->cmd_w(space, 0, data); break; case 1: fdc->track_w(space, 0, data); @@ -1863,22 +1880,26 @@ READ8_MEMBER(bbc_state::bbcm_wd1770l_read) WRITE8_MEMBER(bbc_state::bbcm_wd1770l_write) { - wd1770_device *fdc = machine().device<wd1770_device>("wd177x"); + wd1770_t *fdc = machine().device<wd1770_t>("wd177x"); + floppy_image_device *floppy0 = machine().device<floppy_connector>("wd177x:0")->get_device(); + floppy_image_device *floppy1 = machine().device<floppy_connector>("wd177x:1")->get_device(); + floppy_image_device *floppy = NULL; + m_drive_control = data; - /* set drive */ - if ((data>>0) & 0x01) fdc->set_drive(0); - if ((data>>1) & 0x01) fdc->set_drive(1); + // bit 0, 1: drive select + if (BIT(data, 0)) floppy = floppy0; + if (BIT(data, 1)) floppy = floppy1; - /* set side */ - fdc->set_side((data>>4) & 0x01); + // bit 4: side select + if (floppy) + floppy->ss_w(BIT(data, 4)); - /* set density */ + // bit 5: density fdc->dden_w(BIT(data, 5)); // m_1770_IntEnabled=(((data>>4) & 0x01)==0); m_1770_IntEnabled=1; - } |