summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
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
commitd08d7c094d671562ec513c32e72d4fa462e639dc (patch)
tree0b06c343a72238515c5ce1d93ea967bde32b4f82
parentb0243d6da942866f5ba33dba6fa49d1c696e3e12 (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.lua2
-rw-r--r--src/lib/formats/bbc_dsk.c53
-rw-r--r--src/lib/formats/bbc_dsk.h33
-rw-r--r--src/mess/drivers/bbc.c62
-rw-r--r--src/mess/includes/bbc.h4
-rw-r--r--src/mess/machine/bbc.c99
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;
-
}