summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Curt Coder <curtcoder@mail.com>2015-05-21 15:47:18 +0300
committer Curt Coder <curtcoder@mail.com>2015-05-21 15:47:26 +0300
commitc15fbd2ad96fb41bbb5445ecedcc07d1b84b25ee (patch)
tree014d9547e4d06ad0c2fd3f6ca1faca0cd8e40621 /src
parentc6bcaa8afa0b3d8307a2071eac96783120c4d80d (diff)
(MESS) c2040: Refactored to use mos6530n. (nw)
Diffstat (limited to 'src')
-rw-r--r--src/emu/bus/ieee488/c2040.c113
-rw-r--r--src/emu/bus/ieee488/c2040.h11
-rw-r--r--src/emu/bus/ieee488/c2040fdc.c16
-rw-r--r--src/emu/bus/ieee488/c2040fdc.h4
-rw-r--r--src/emu/bus/ieee488/c8050fdc.c4
-rw-r--r--src/emu/machine/mos6530n.c36
6 files changed, 77 insertions, 107 deletions
diff --git a/src/emu/bus/ieee488/c2040.c b/src/emu/bus/ieee488/c2040.c
index 7350af4a377..ccb149a4943 100644
--- a/src/emu/bus/ieee488/c2040.c
+++ b/src/emu/bus/ieee488/c2040.c
@@ -188,9 +188,9 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( c2040_fdc_mem, AS_PROGRAM, 8, c2040_device )
ADDRESS_MAP_GLOBAL_MASK(0x1fff)
- AM_RANGE(0x0000, 0x003f) AM_MIRROR(0x0300) AM_RAM // 6530
- AM_RANGE(0x0040, 0x004f) AM_MIRROR(0x0330) AM_DEVREADWRITE(M6522_TAG, via6522_device, read, write)
- AM_RANGE(0x0080, 0x008f) AM_MIRROR(0x0330) AM_DEVREADWRITE(M6530_TAG, mos6530_device, read, write)
+ AM_RANGE(0x0000, 0x003f) AM_MIRROR(0x0300) AM_DEVICE(M6530_TAG, mos6530_t, ram_map)
+ AM_RANGE(0x0040, 0x004f) AM_MIRROR(0x0330) AM_DEVICE(M6522_TAG, via6522_device, map)
+ AM_RANGE(0x0080, 0x008f) AM_MIRROR(0x0330) AM_DEVICE(M6530_TAG, mos6530_t, io_map)
AM_RANGE(0x0400, 0x07ff) AM_RAM AM_SHARE("share1")
AM_RANGE(0x0800, 0x0bff) AM_RAM AM_SHARE("share2")
AM_RANGE(0x0c00, 0x0fff) AM_RAM AM_SHARE("share3")
@@ -405,69 +405,6 @@ WRITE8_MEMBER( c2040_device::via_pb_w )
//-------------------------------------------------
-// mos6530 uk3
-//-------------------------------------------------
-
-READ8_MEMBER( c2040_device::miot_pb_r )
-{
- /*
-
- bit description
-
- PB0
- PB1
- PB2
- PB3 WPS
- PB4
- PB5
- PB6 SYNC
- PB7
-
- */
-
- UINT8 data = 0;
-
- // write protect sense
- data |= m_fdc->wps_r() << 3;
-
- // SYNC detected
- data |= m_fdc->sync_r() << 6;
-
- return data;
-}
-
-WRITE8_MEMBER( c2040_device::miot_pb_w )
-{
- /*
-
- bit description
-
- PB0 DRV SEL
- PB1 DS0
- PB2 DS1
- PB3
- PB4
- PB5
- PB6
- PB7 M6504 IRQ
-
- */
-
- // drive select
- m_fdc->drv_sel_w(BIT(data, 0));
-
- // density select
- m_fdc->ds_w((data >> 1) & 0x03);
-
- // interrupt
- if (m_miot_irq != BIT(data, 7))
- {
- m_fdccpu->set_input_line(M6502_IRQ_LINE, BIT(data, 7) ? CLEAR_LINE : ASSERT_LINE);
- m_miot_irq = BIT(data, 7);
- }
-}
-
-//-------------------------------------------------
// SLOT_INTERFACE( c2040_floppies )
//-------------------------------------------------
@@ -536,12 +473,16 @@ static MACHINE_CONFIG_FRAGMENT( c2040 )
MCFG_VIA6522_CA2_HANDLER(DEVWRITELINE(FDC_TAG, c2040_fdc_t, mode_sel_w))
MCFG_VIA6522_CB2_HANDLER(DEVWRITELINE(FDC_TAG, c2040_fdc_t, rw_sel_w))
- MCFG_DEVICE_ADD(M6530_TAG, MOS6530, XTAL_16MHz/16)
- MCFG_MOS6530_OUT_PA_CB(DEVWRITE8(FDC_TAG, c2040_fdc_t, write))
- MCFG_MOS6530_IN_PB_CB(READ8(c2040_device, miot_pb_r))
- MCFG_MOS6530_OUT_PB_CB(WRITE8(c2040_device, miot_pb_w))
+ MCFG_DEVICE_ADD(M6530_TAG, MOS6530n, XTAL_16MHz/16)
+ MCFG_MOS6530n_IRQ_CB(INPUTLINE(M6504_TAG, M6502_IRQ_LINE))
+ MCFG_MOS6530n_OUT_PA_CB(DEVWRITE8(FDC_TAG, c2040_fdc_t, write))
+ MCFG_MOS6530n_OUT_PB0_CB(DEVWRITELINE(FDC_TAG, c2040_fdc_t, drv_sel_w))
+ MCFG_MOS6530n_OUT_PB1_CB(DEVWRITELINE(FDC_TAG, c2040_fdc_t, ds0_w))
+ MCFG_MOS6530n_OUT_PB2_CB(DEVWRITELINE(FDC_TAG, c2040_fdc_t, ds1_w))
+ MCFG_MOS6530n_IN_PB3_CB(DEVREADLINE(FDC_TAG, c2040_fdc_t, wps_r))
MCFG_DEVICE_ADD(FDC_TAG, C2040_FDC, XTAL_16MHz)
+ MCFG_C2040_SYNC_CALLBACK(DEVWRITELINE(M6530_TAG, mos6530_t, pb6_w))
MCFG_C2040_READY_CALLBACK(DEVWRITELINE(M6522_TAG, via6522_device, write_ca1))
MCFG_C2040_ERROR_CALLBACK(DEVWRITELINE(M6522_TAG, via6522_device, write_cb1))
MCFG_FLOPPY_DRIVE_ADD(FDC_TAG":0", c2040_floppies, "525ssqd", c2040_device::floppy_formats)
@@ -590,12 +531,16 @@ static MACHINE_CONFIG_FRAGMENT( c3040 )
MCFG_VIA6522_CA2_HANDLER(DEVWRITELINE(FDC_TAG, c2040_fdc_t, mode_sel_w))
MCFG_VIA6522_CB2_HANDLER(DEVWRITELINE(FDC_TAG, c2040_fdc_t, rw_sel_w))
- MCFG_DEVICE_ADD(M6530_TAG, MOS6530, XTAL_16MHz/16)
- MCFG_MOS6530_OUT_PA_CB(DEVWRITE8(FDC_TAG, c2040_fdc_t, write))
- MCFG_MOS6530_IN_PB_CB(READ8(c2040_device, miot_pb_r))
- MCFG_MOS6530_OUT_PB_CB(WRITE8(c2040_device, miot_pb_w))
+ MCFG_DEVICE_ADD(M6530_TAG, MOS6530n, XTAL_16MHz/16)
+ MCFG_MOS6530n_IRQ_CB(INPUTLINE(M6504_TAG, M6502_IRQ_LINE))
+ MCFG_MOS6530n_OUT_PA_CB(DEVWRITE8(FDC_TAG, c2040_fdc_t, write))
+ MCFG_MOS6530n_OUT_PB0_CB(DEVWRITELINE(FDC_TAG, c2040_fdc_t, drv_sel_w))
+ MCFG_MOS6530n_OUT_PB1_CB(DEVWRITELINE(FDC_TAG, c2040_fdc_t, ds0_w))
+ MCFG_MOS6530n_OUT_PB2_CB(DEVWRITELINE(FDC_TAG, c2040_fdc_t, ds1_w))
+ MCFG_MOS6530n_IN_PB3_CB(DEVREADLINE(FDC_TAG, c2040_fdc_t, wps_r))
MCFG_DEVICE_ADD(FDC_TAG, C2040_FDC, XTAL_16MHz)
+ MCFG_C2040_SYNC_CALLBACK(DEVWRITELINE(M6530_TAG, mos6530_t, pb6_w))
MCFG_C2040_READY_CALLBACK(DEVWRITELINE(M6522_TAG, via6522_device, write_ca1))
MCFG_C2040_ERROR_CALLBACK(DEVWRITELINE(M6522_TAG, via6522_device, write_cb1))
MCFG_FLOPPY_DRIVE_ADD(FDC_TAG":0", c2040_floppies, "525ssqd", c3040_device::floppy_formats)
@@ -644,12 +589,16 @@ static MACHINE_CONFIG_FRAGMENT( c4040 )
MCFG_VIA6522_CA2_HANDLER(DEVWRITELINE(FDC_TAG, c2040_fdc_t, mode_sel_w))
MCFG_VIA6522_CB2_HANDLER(DEVWRITELINE(FDC_TAG, c2040_fdc_t, rw_sel_w))
- MCFG_DEVICE_ADD(M6530_TAG, MOS6530, XTAL_16MHz/16)
- MCFG_MOS6530_OUT_PA_CB(DEVWRITE8(FDC_TAG, c2040_fdc_t, write))
- MCFG_MOS6530_IN_PB_CB(READ8(c2040_device, miot_pb_r))
- MCFG_MOS6530_OUT_PB_CB(WRITE8(c2040_device, miot_pb_w))
+ MCFG_DEVICE_ADD(M6530_TAG, MOS6530n, XTAL_16MHz/16)
+ MCFG_MOS6530n_IRQ_CB(INPUTLINE(M6504_TAG, M6502_IRQ_LINE))
+ MCFG_MOS6530n_OUT_PA_CB(DEVWRITE8(FDC_TAG, c2040_fdc_t, write))
+ MCFG_MOS6530n_OUT_PB0_CB(DEVWRITELINE(FDC_TAG, c2040_fdc_t, drv_sel_w))
+ MCFG_MOS6530n_OUT_PB1_CB(DEVWRITELINE(FDC_TAG, c2040_fdc_t, ds0_w))
+ MCFG_MOS6530n_OUT_PB2_CB(DEVWRITELINE(FDC_TAG, c2040_fdc_t, ds1_w))
+ MCFG_MOS6530n_IN_PB3_CB(DEVREADLINE(FDC_TAG, c2040_fdc_t, wps_r))
MCFG_DEVICE_ADD(FDC_TAG, C2040_FDC, XTAL_16MHz)
+ MCFG_C2040_SYNC_CALLBACK(DEVWRITELINE(M6530_TAG, mos6530_t, pb6_w))
MCFG_C2040_READY_CALLBACK(DEVWRITELINE(M6522_TAG, via6522_device, write_ca1))
MCFG_C2040_ERROR_CALLBACK(DEVWRITELINE(M6522_TAG, via6522_device, write_cb1))
MCFG_FLOPPY_DRIVE_ADD(FDC_TAG":0", c2040_floppies, "525ssqd", c4040_device::floppy_formats)
@@ -741,8 +690,7 @@ c2040_device::c2040_device(const machine_config &mconfig, device_type type, cons
m_address(*this, "ADDRESS"),
m_rfdo(1),
m_daco(1),
- m_atna(1),
- m_miot_irq(CLEAR_LINE)
+ m_atna(1)
{
}
@@ -762,8 +710,7 @@ c2040_device::c2040_device(const machine_config &mconfig, const char *tag, devic
m_address(*this, "ADDRESS"),
m_rfdo(1),
m_daco(1),
- m_atna(1),
- m_miot_irq(CLEAR_LINE)
+ m_atna(1)
{
}
@@ -797,7 +744,7 @@ void c2040_device::device_start()
save_item(NAME(m_rfdo));
save_item(NAME(m_daco));
save_item(NAME(m_atna));
- save_item(NAME(m_miot_irq));
+ save_item(NAME(m_ifc));
}
diff --git a/src/emu/bus/ieee488/c2040.h b/src/emu/bus/ieee488/c2040.h
index 45f0d6d443c..62e238efa4d 100644
--- a/src/emu/bus/ieee488/c2040.h
+++ b/src/emu/bus/ieee488/c2040.h
@@ -18,7 +18,7 @@
#include "cpu/m6502/m6504.h"
#include "machine/6522via.h"
#include "machine/6532riot.h"
-#include "machine/mos6530.h"
+#include "machine/mos6530n.h"
@@ -29,7 +29,7 @@
// ======================> c2040_device
class c2040_device : public device_t,
- public device_ieee488_interface
+ public device_ieee488_interface
{
public:
// construction/destruction
@@ -50,8 +50,6 @@ public:
DECLARE_WRITE8_MEMBER( via_pb_w );
DECLARE_WRITE_LINE_MEMBER( mode_sel_w );
DECLARE_WRITE_LINE_MEMBER( rw_sel_w );
- DECLARE_READ8_MEMBER( miot_pb_r );
- DECLARE_WRITE8_MEMBER( miot_pb_w );
DECLARE_FLOPPY_FORMATS( floppy_formats );
@@ -78,7 +76,7 @@ protected:
required_device<m6504_device> m_fdccpu;
required_device<riot6532_device> m_riot0;
required_device<riot6532_device> m_riot1;
- required_device<mos6530_device> m_miot;
+ required_device<mos6530_t> m_miot;
required_device<via6522_device> m_via;
required_device<floppy_image_device> m_floppy0;
optional_device<floppy_image_device> m_floppy1;
@@ -91,9 +89,6 @@ protected:
int m_daco; // not data accepted output
int m_atna; // attention acknowledge
int m_ifc;
-
- // signals
- int m_miot_irq; // MIOT interrupt
};
diff --git a/src/emu/bus/ieee488/c2040fdc.c b/src/emu/bus/ieee488/c2040fdc.c
index 44baae86260..4dfccbde366 100644
--- a/src/emu/bus/ieee488/c2040fdc.c
+++ b/src/emu/bus/ieee488/c2040fdc.c
@@ -82,6 +82,8 @@ c2040_fdc_t::c2040_fdc_t(const machine_config &mconfig, const char *tag, device_
m_stp0(0),
m_stp1(0),
m_ds(0),
+ m_ds0(0),
+ m_ds1(0),
m_drv_sel(0),
m_mode_sel(0),
m_rw_sel(0),
@@ -116,6 +118,8 @@ void c2040_fdc_t::device_start()
save_item(NAME(m_stp0));
save_item(NAME(m_stp1));
save_item(NAME(m_ds));
+ save_item(NAME(m_ds0));
+ save_item(NAME(m_ds1));
save_item(NAME(m_drv_sel));
save_item(NAME(m_mode_sel));
save_item(NAME(m_rw_sel));
@@ -451,6 +455,18 @@ WRITE8_MEMBER( c2040_fdc_t::write )
}
}
+WRITE_LINE_MEMBER( c2040_fdc_t::ds0_w )
+{
+ m_ds0 = state;
+}
+
+WRITE_LINE_MEMBER( c2040_fdc_t::ds1_w )
+{
+ m_ds1 = state;
+
+ ds_w(m_ds1 << 1 | m_ds0);
+}
+
WRITE_LINE_MEMBER( c2040_fdc_t::drv_sel_w )
{
if (m_drv_sel != state)
diff --git a/src/emu/bus/ieee488/c2040fdc.h b/src/emu/bus/ieee488/c2040fdc.h
index 5e09f9843e7..178e81240a2 100644
--- a/src/emu/bus/ieee488/c2040fdc.h
+++ b/src/emu/bus/ieee488/c2040fdc.h
@@ -54,6 +54,8 @@ public:
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
+ DECLARE_WRITE_LINE_MEMBER( ds0_w );
+ DECLARE_WRITE_LINE_MEMBER( ds1_w );
DECLARE_WRITE_LINE_MEMBER( drv_sel_w );
DECLARE_WRITE_LINE_MEMBER( mode_sel_w );
DECLARE_WRITE_LINE_MEMBER( rw_sel_w );
@@ -127,6 +129,8 @@ protected:
int m_stp0;
int m_stp1;
int m_ds;
+ int m_ds0;
+ int m_ds1;
int m_drv_sel;
int m_mode_sel;
int m_rw_sel;
diff --git a/src/emu/bus/ieee488/c8050fdc.c b/src/emu/bus/ieee488/c8050fdc.c
index 8b0a853c6d0..02bceb80328 100644
--- a/src/emu/bus/ieee488/c8050fdc.c
+++ b/src/emu/bus/ieee488/c8050fdc.c
@@ -85,6 +85,8 @@ c8050_fdc_t::c8050_fdc_t(const machine_config &mconfig, const char *tag, device_
m_stp0(0),
m_stp1(0),
m_ds(0),
+ m_ds0(0),
+ m_ds1(0),
m_drv_sel(0),
m_mode_sel(0),
m_rw_sel(1)
@@ -117,6 +119,8 @@ void c8050_fdc_t::device_start()
save_item(NAME(m_stp0));
save_item(NAME(m_stp1));
save_item(NAME(m_ds));
+ save_item(NAME(m_ds0));
+ save_item(NAME(m_ds1));
save_item(NAME(m_drv_sel));
save_item(NAME(m_mode_sel));
save_item(NAME(m_rw_sel));
diff --git a/src/emu/machine/mos6530n.c b/src/emu/machine/mos6530n.c
index 0999eaa4856..1c1be27638f 100644
--- a/src/emu/machine/mos6530n.c
+++ b/src/emu/machine/mos6530n.c
@@ -113,14 +113,14 @@ void mos6530_t::device_start()
m_out_pa_cb.resolve();
m_in_pb_cb.resolve();
m_out_pb_cb.resolve();
- m_in_pa0_cb.resolve_safe(1);
- m_in_pa1_cb.resolve_safe(1);
- m_in_pa2_cb.resolve_safe(1);
- m_in_pa3_cb.resolve_safe(1);
- m_in_pa4_cb.resolve_safe(1);
- m_in_pa5_cb.resolve_safe(1);
- m_in_pa6_cb.resolve_safe(1);
- m_in_pa7_cb.resolve_safe(1);
+ m_in_pa0_cb.resolve();
+ m_in_pa1_cb.resolve();
+ m_in_pa2_cb.resolve();
+ m_in_pa3_cb.resolve();
+ m_in_pa4_cb.resolve();
+ m_in_pa5_cb.resolve();
+ m_in_pa6_cb.resolve();
+ m_in_pa7_cb.resolve();
m_out_pa0_cb.resolve_safe();
m_out_pa1_cb.resolve_safe();
m_out_pa2_cb.resolve_safe();
@@ -129,14 +129,14 @@ void mos6530_t::device_start()
m_out_pa5_cb.resolve_safe();
m_out_pa6_cb.resolve_safe();
m_out_pa7_cb.resolve_safe();
- m_in_pb0_cb.resolve_safe(1);
- m_in_pb1_cb.resolve_safe(1);
- m_in_pb2_cb.resolve_safe(1);
- m_in_pb3_cb.resolve_safe(1);
- m_in_pb4_cb.resolve_safe(1);
- m_in_pb5_cb.resolve_safe(1);
- m_in_pb6_cb.resolve_safe(1);
- m_in_pb7_cb.resolve_safe(1);
+ m_in_pb0_cb.resolve();
+ m_in_pb1_cb.resolve();
+ m_in_pb2_cb.resolve();
+ m_in_pb3_cb.resolve();
+ m_in_pb4_cb.resolve();
+ m_in_pb5_cb.resolve();
+ m_in_pb6_cb.resolve();
+ m_in_pb7_cb.resolve();
m_out_pb0_cb.resolve_safe();
m_out_pb1_cb.resolve_safe();
m_out_pb2_cb.resolve_safe();
@@ -255,6 +255,8 @@ void mos6530_t::update_pb()
void mos6530_t::pa_w(int bit, int state)
{
+ if (LOG) logerror("%s %s MOS6530 '%s' Port A Data Bit %u State %u\n", machine().time().as_string(), machine().describe_context(), tag(), bit, state);
+
m_pa_in &= ~(1 << bit);
m_pa_in |= (state << bit);
}
@@ -266,6 +268,8 @@ void mos6530_t::pa_w(int bit, int state)
void mos6530_t::pb_w(int bit, int state)
{
+ if (LOG) logerror("%s %s MOS6530 '%s' Port B Data Bit %u State %u\n", machine().time().as_string(), machine().describe_context(), tag(), bit, state);
+
m_pb_in &= ~(1 << bit);
m_pb_in |= (state << bit);
}