(MESS) c2040: Refactored to use mos6530n. (nw)

This commit is contained in:
Curt Coder 2015-05-21 15:47:18 +03:00
parent c6bcaa8afa
commit c15fbd2ad9
6 changed files with 77 additions and 107 deletions

View File

@ -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")
@ -404,69 +404,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));
}

View File

@ -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
};

View File

@ -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)

View File

@ -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;

View File

@ -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));

View File

@ -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);
}