summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Curt Coder <curtcoder@mail.com>2012-09-10 14:18:45 +0000
committer Curt Coder <curtcoder@mail.com>2012-09-10 14:18:45 +0000
commitbe3af47f06821ce44fa7ebd16c026ede804d82bf (patch)
treeb23d5c56e44b0d689a6bd5431e26bfa3cd39d04d /src
parent7de113e8959929b99676f27f6a9762461c01ef7d (diff)
(MESS) c128: MMU WIP. (nw)
(MESS) mos6581: Improved interface. (nw) mos6526: Improved interface. (nw)
Diffstat (limited to 'src')
-rw-r--r--src/emu/machine/6526cia.c44
-rw-r--r--src/emu/machine/6526cia.h51
-rw-r--r--src/emu/sound/sid6581.c8
-rw-r--r--src/emu/sound/sid6581.h8
-rw-r--r--src/emu/video/mc6845.c9
-rw-r--r--src/emu/video/mc6845.h1
-rw-r--r--src/mame/drivers/alg.c6
-rw-r--r--src/mame/drivers/arcadia.c6
-rw-r--r--src/mame/drivers/cd32.c6
-rw-r--r--src/mame/drivers/mquake.c6
-rw-r--r--src/mame/drivers/upscope.c6
-rw-r--r--src/mess/drivers/ami1200.c6
-rw-r--r--src/mess/drivers/amiga.c15
-rw-r--r--src/mess/drivers/c128.c402
-rw-r--r--src/mess/drivers/c64.c28
-rw-r--r--src/mess/drivers/c65.c8
-rw-r--r--src/mess/drivers/cbmb.c8
-rw-r--r--src/mess/drivers/sbc6510.c3
-rw-r--r--src/mess/drivers/vic10.c7
-rw-r--r--src/mess/includes/c128.h47
-rw-r--r--src/mess/includes/c65.h4
-rw-r--r--src/mess/includes/vic10.h2
-rw-r--r--src/mess/machine/c128.c106
-rw-r--r--src/mess/machine/c1571.c5
-rw-r--r--src/mess/machine/c1581.c3
-rw-r--r--src/mess/machine/c64.c12
-rw-r--r--src/mess/machine/c65.c48
-rw-r--r--src/mess/machine/cbmb.c1
-rw-r--r--src/mess/machine/cbmipt.c4
-rw-r--r--src/mess/machine/mos8722.c194
-rw-r--r--src/mess/machine/mos8722.h7
-rw-r--r--src/mess/machine/plus4_sid.c4
-rw-r--r--src/mess/machine/plus4_sid.h2
33 files changed, 678 insertions, 389 deletions
diff --git a/src/emu/machine/6526cia.c b/src/emu/machine/6526cia.c
index 5c4ec103a7d..e55ebc04847 100644
--- a/src/emu/machine/6526cia.c
+++ b/src/emu/machine/6526cia.c
@@ -53,6 +53,7 @@
const device_type MOS6526R1 = &device_creator<mos6526r1_device>;
const device_type MOS6526R2 = &device_creator<mos6526r2_device>;
const device_type MOS8520 = &device_creator<mos8520_device>;
+const device_type MOS5710 = &device_creator<mos5710_device>;
@@ -89,6 +90,17 @@ mos6526r2_device::mos6526r2_device(const machine_config &mconfig, const char *ta
mos8520_device::mos8520_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: mos6526_device(mconfig, MOS8520, "MOS8520", tag, owner, clock) { }
+mos5710_device::mos5710_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : mos6526_device(mconfig, MOS5710, "MOS5710", tag, owner, clock) { }
+
+
+void mos6526_device::static_set_tod_clock(device_t &device, int tod_clock)
+{
+ mos6526_device &cia = dynamic_cast<mos6526_device &>(device);
+
+ cia.m_tod_clock = tod_clock;
+}
+
//-------------------------------------------------
// device_reset - device-specific reset
@@ -152,7 +164,6 @@ void mos6526_device::device_config_complete()
// or initialize to defaults if none provided
else
{
- m_tod_clock = 0;
memset(&m_out_irq_cb, 0, sizeof(m_out_irq_cb));
memset(&m_out_pc_cb, 0, sizeof(m_out_pc_cb));
memset(&m_out_cnt_cb, 0, sizeof(m_out_cnt_cb));
@@ -200,10 +211,10 @@ void mos6526_device::device_start()
timer->m_irq = 0x01 << t;
}
- /* setup TOD timer, if appropriate */
- if (m_tod_clock != 0)
+ if (m_tod_clock > 0)
{
- machine().scheduler().timer_pulse(attotime::from_hz(m_tod_clock), FUNC(clock_tod_callback), 0, (void *)this);
+ m_tod_timer = timer_alloc(TIMER_TOD);
+ m_tod_timer->adjust(attotime::from_hz(m_tod_clock), 0, attotime::from_hz(m_tod_clock));
}
/* state save support */
@@ -254,6 +265,10 @@ void mos6526_device::device_timer(emu_timer &timer, device_timer_id id, int para
case TIMER_PC:
m_out_pc_func(1);
break;
+
+ case TIMER_TOD:
+ clock_tod();
+ break;
}
}
@@ -506,17 +521,6 @@ void mos6526_device::clock_tod()
/*-------------------------------------------------
- clock_tod_callback
--------------------------------------------------*/
-
-TIMER_CALLBACK( mos6526_device::clock_tod_callback )
-{
- mos6526_device *cia = reinterpret_cast<mos6526_device *>(ptr);
- cia->clock_tod();
-}
-
-
-/*-------------------------------------------------
cnt_w
-------------------------------------------------*/
@@ -577,6 +581,16 @@ void mos6526_device::flag_w(UINT8 state)
m_flag = state;
}
+READ8_MEMBER( mos6526_device::read )
+{
+ return reg_r(offset);
+}
+
+WRITE8_MEMBER( mos6526_device::write )
+{
+ reg_w(offset, data);
+}
+
/*-------------------------------------------------
reg_r
-------------------------------------------------*/
diff --git a/src/emu/machine/6526cia.h b/src/emu/machine/6526cia.h
index 3aee04adcd4..b28952c4a2b 100644
--- a/src/emu/machine/6526cia.h
+++ b/src/emu/machine/6526cia.h
@@ -43,17 +43,26 @@
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
-#define MCFG_MOS6526R1_ADD(_tag, _clock, _config) \
+#define MCFG_MOS6526R1_ADD(_tag, _clock, _tod_clock, _config) \
MCFG_DEVICE_ADD(_tag, MOS6526R1, _clock) \
- MCFG_DEVICE_CONFIG(_config)
+ MCFG_DEVICE_CONFIG(_config) \
+ mos6526_device::static_set_tod_clock(*device, _tod_clock);
-#define MCFG_MOS6526R2_ADD(_tag, _clock, _config) \
+#define MCFG_MOS6526R2_ADD(_tag, _clock, _tod_clock, _config) \
MCFG_DEVICE_ADD(_tag, MOS6526R2, _clock) \
- MCFG_DEVICE_CONFIG(_config)
+ MCFG_DEVICE_CONFIG(_config) \
+ mos6526_device::static_set_tod_clock(*device, _tod_clock);
-#define MCFG_MOS8520_ADD(_tag, _clock, _config) \
+#define MCFG_MOS8520_ADD(_tag, _clock, _tod_clock, _config) \
MCFG_DEVICE_ADD(_tag, MOS8520, _clock) \
- MCFG_DEVICE_CONFIG(_config)
+ MCFG_DEVICE_CONFIG(_config) \
+ mos6526_device::static_set_tod_clock(*device, _tod_clock);
+
+#define MCFG_MOS5710_ADD(_tag, _clock, _tod_clock, _config) \
+ MCFG_DEVICE_ADD(_tag, MOS5710, _clock) \
+ MCFG_DEVICE_CONFIG(_config) \
+ mos6526_device::static_set_tod_clock(*device, _tod_clock);
+
#define MOS6526_INTERFACE(name) \
const mos6526_interface (name)=
@@ -61,6 +70,11 @@
#define MOS8520_INTERFACE(name) \
const mos6526_interface (name)=
+#define MOS5710_INTERFACE(name) \
+ const mos6526_interface (name)=
+
+
+
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
@@ -70,8 +84,6 @@
struct mos6526_interface
{
- int m_tod_clock;
-
devcb_write_line m_out_irq_cb;
devcb_write_line m_out_pc_cb;
devcb_write_line m_out_cnt_cb;
@@ -91,13 +103,17 @@ struct mos6526_interface
class mos6526_device : public device_t,
public mos6526_interface
{
- friend class dart_channel;
-
protected:
// construction/destruction
mos6526_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock);
public:
+ // inline configuration
+ static void static_set_tod_clock(device_t &device, int tod_clock);
+
+ DECLARE_READ8_MEMBER( read );
+ DECLARE_WRITE8_MEMBER( write );
+
UINT8 reg_r(UINT8 offset);
void reg_w(UINT8 offset, UINT8 data);
@@ -138,7 +154,11 @@ protected:
static TIMER_CALLBACK( clock_tod_callback );
private:
- static const device_timer_id TIMER_PC = 0;
+ enum
+ {
+ TIMER_PC,
+ TIMER_TOD
+ };
inline attotime cycles_to_time(int c);
void update_pc();
@@ -185,6 +205,7 @@ private:
cia_timer m_timer[2];
/* Time Of the Day clock (TOD) */
+ int m_tod_clock;
UINT32 m_tod;
UINT32 m_tod_latch;
UINT8 m_tod_latched;
@@ -206,6 +227,7 @@ private:
UINT8 m_serial;
emu_timer *m_pc_timer;
+ emu_timer *m_tod_timer;
};
class mos6526r1_device : public mos6526_device
@@ -226,11 +248,18 @@ public:
mos8520_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
};
+class mos5710_device : public mos6526_device
+{
+public:
+ mos5710_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+};
+
// device type definition
extern const device_type MOS6526R1;
extern const device_type MOS6526R2;
extern const device_type MOS8520;
+extern const device_type MOS5710;
diff --git a/src/emu/sound/sid6581.c b/src/emu/sound/sid6581.c
index 60bab96bf6c..248838ae47a 100644
--- a/src/emu/sound/sid6581.c
+++ b/src/emu/sound/sid6581.c
@@ -73,15 +73,15 @@ static DEVICE_START( sid8580 )
-READ8_DEVICE_HANDLER ( sid6581_r )
+READ8_MEMBER( sid6581_device::read )
{
- return sid6581_port_r(device->machine(), get_sid(device), offset);
+ return sid6581_port_r(machine(), get_sid(this), offset);
}
-WRITE8_DEVICE_HANDLER ( sid6581_w )
+WRITE8_MEMBER( sid6581_device::write )
{
- sid6581_port_w(get_sid(device), offset, data);
+ sid6581_port_w(get_sid(this), offset, data);
}
const device_type SID6581 = &device_creator<sid6581_device>;
diff --git a/src/emu/sound/sid6581.h b/src/emu/sound/sid6581.h
index ba6e74d6d7e..1ea20c528d4 100644
--- a/src/emu/sound/sid6581.h
+++ b/src/emu/sound/sid6581.h
@@ -30,10 +30,6 @@ struct _sid6581_interface
devcb_read8 in_poty_cb;
};
-
-READ8_DEVICE_HANDLER ( sid6581_r );
-WRITE8_DEVICE_HANDLER ( sid6581_w );
-
class sid6581_device : public device_t,
public device_sound_interface
{
@@ -44,6 +40,10 @@ public:
// access to legacy token
void *token() const { assert(m_token != NULL); return m_token; }
+
+ DECLARE_READ8_MEMBER( read );
+ DECLARE_WRITE8_MEMBER( write );
+
protected:
// device-level overrides
virtual void device_config_complete();
diff --git a/src/emu/video/mc6845.c b/src/emu/video/mc6845.c
index 06c1b223876..c29acbb26c4 100644
--- a/src/emu/video/mc6845.c
+++ b/src/emu/video/mc6845.c
@@ -1169,6 +1169,8 @@ void mos8563_device::device_start()
m_supports_status_reg_d7 = true;
m_update_ready_bit = 1;
+ m_update_row = vdc_update_row;
+
save_item(NAME(m_char_buffer));
save_item(NAME(m_attr_buffer));
save_item(NAME(m_attribute_addr));
@@ -1424,3 +1426,10 @@ void mos8563_device::update_row(bitmap_rgb32 &bitmap, const rectangle &cliprect,
}
}
}
+
+MC6845_UPDATE_ROW( mos8563_device::vdc_update_row )
+{
+ mos8563_device *mos8563 = static_cast<mos8563_device *>(device);
+
+ mos8563->update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, param);
+}
diff --git a/src/emu/video/mc6845.h b/src/emu/video/mc6845.h
index 2b9582b5f24..6ba8a4a5ded 100644
--- a/src/emu/video/mc6845.h
+++ b/src/emu/video/mc6845.h
@@ -395,6 +395,7 @@ public:
inline void write_videoram(offs_t offset, UINT8 data);
void update_row(bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, void *param);
+ static MC6845_UPDATE_ROW( vdc_update_row );
protected:
// device-level overrides
diff --git a/src/mame/drivers/alg.c b/src/mame/drivers/alg.c
index 9bc517add99..1f89e1b978b 100644
--- a/src/mame/drivers/alg.c
+++ b/src/mame/drivers/alg.c
@@ -412,7 +412,6 @@ INPUT_PORTS_END
static const mos6526_interface cia_0_intf =
{
- 0, /* tod_clock */
DEVCB_LINE(amiga_cia_0_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
@@ -425,7 +424,6 @@ static const mos6526_interface cia_0_intf =
static const mos6526_interface cia_1_intf =
{
- 0, /* tod_clock */
DEVCB_LINE(amiga_cia_1_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
@@ -475,8 +473,8 @@ static MACHINE_CONFIG_START( alg_r1, alg_state )
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
/* cia */
- MCFG_MOS8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, cia_0_intf)
- MCFG_MOS8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK / 10, cia_1_intf)
+ MCFG_MOS8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, 0, cia_0_intf)
+ MCFG_MOS8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK / 10, 0, cia_1_intf)
/* fdc */
MCFG_AMIGA_FDC_ADD("fdc", AMIGA_68000_NTSC_CLOCK)
diff --git a/src/mame/drivers/arcadia.c b/src/mame/drivers/arcadia.c
index 5fe2623bb9f..deec7d946a6 100644
--- a/src/mame/drivers/arcadia.c
+++ b/src/mame/drivers/arcadia.c
@@ -286,7 +286,6 @@ INPUT_PORTS_END
static const mos6526_interface cia_0_intf =
{
- 0, /* tod_clock */
DEVCB_LINE(amiga_cia_0_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
@@ -299,7 +298,6 @@ static const mos6526_interface cia_0_intf =
static const mos6526_interface cia_1_intf =
{
- 0, /* tod_clock */
DEVCB_LINE(amiga_cia_1_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
@@ -344,8 +342,8 @@ static MACHINE_CONFIG_START( arcadia, arcadia_amiga_state )
MCFG_SOUND_ROUTE(3, "lspeaker", 0.50)
/* cia */
- MCFG_MOS8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, cia_0_intf)
- MCFG_MOS8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK / 10, cia_1_intf)
+ MCFG_MOS8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, 0, cia_0_intf)
+ MCFG_MOS8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK / 10, 0, cia_1_intf)
/* fdc */
MCFG_AMIGA_FDC_ADD("fdc", AMIGA_68000_NTSC_CLOCK)
diff --git a/src/mame/drivers/cd32.c b/src/mame/drivers/cd32.c
index 654870bade1..7fe36844ebc 100644
--- a/src/mame/drivers/cd32.c
+++ b/src/mame/drivers/cd32.c
@@ -727,7 +727,6 @@ INPUT_PORTS_END
static const mos6526_interface cia_0_intf =
{
- 0, /* tod_clock */
DEVCB_LINE(amiga_cia_0_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
@@ -740,7 +739,6 @@ static const mos6526_interface cia_0_intf =
static const mos6526_interface cia_1_intf =
{
- 0, /* tod_clock */
DEVCB_LINE(amiga_cia_1_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
@@ -802,8 +800,8 @@ static MACHINE_CONFIG_START( cd32base, cd32_state )
MCFG_SOUND_ROUTE( 1, "rspeaker", 0.50 )
/* cia */
- MCFG_MOS8520_ADD("cia_0", AMIGA_68EC020_PAL_CLOCK / 10, cia_0_intf)
- MCFG_MOS8520_ADD("cia_1", AMIGA_68EC020_PAL_CLOCK / 10, cia_1_intf)
+ MCFG_MOS8520_ADD("cia_0", AMIGA_68EC020_PAL_CLOCK / 10, 0, cia_0_intf)
+ MCFG_MOS8520_ADD("cia_1", AMIGA_68EC020_PAL_CLOCK / 10, 0, cia_1_intf)
MCFG_MICROTOUCH_ADD( "microtouch", cd32_microtouch_config )
diff --git a/src/mame/drivers/mquake.c b/src/mame/drivers/mquake.c
index 24d9a88eccb..e1fbea21d52 100644
--- a/src/mame/drivers/mquake.c
+++ b/src/mame/drivers/mquake.c
@@ -315,7 +315,6 @@ static MACHINE_RESET(mquake)
static const mos6526_interface cia_0_intf =
{
- 0, /* tod_clock */
DEVCB_LINE(amiga_cia_0_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
@@ -328,7 +327,6 @@ static const mos6526_interface cia_0_intf =
static const mos6526_interface cia_1_intf =
{
- 0, /* tod_clock */
DEVCB_LINE(amiga_cia_1_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
@@ -380,8 +378,8 @@ static MACHINE_CONFIG_START( mquake, amiga_state )
MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
/* cia */
- MCFG_MOS8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, cia_0_intf)
- MCFG_MOS8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK / 10, cia_1_intf)
+ MCFG_MOS8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, 0, cia_0_intf)
+ MCFG_MOS8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK / 10, 0, cia_1_intf)
/* fdc */
MCFG_AMIGA_FDC_ADD("fdc", AMIGA_68000_NTSC_CLOCK)
diff --git a/src/mame/drivers/upscope.c b/src/mame/drivers/upscope.c
index 80be37e882e..d0b467128e8 100644
--- a/src/mame/drivers/upscope.c
+++ b/src/mame/drivers/upscope.c
@@ -285,7 +285,6 @@ INPUT_PORTS_END
static const mos6526_interface cia_0_intf =
{
- 0, /* tod_clock */
DEVCB_LINE(amiga_cia_0_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
@@ -298,7 +297,6 @@ static const mos6526_interface cia_0_intf =
static const mos6526_interface cia_1_intf =
{
- 0, /* tod_clock */
DEVCB_LINE(amiga_cia_1_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
@@ -343,8 +341,8 @@ static MACHINE_CONFIG_START( upscope, upscope_state )
MCFG_SOUND_ROUTE(3, "rspeaker", 0.50)
/* cia */
- MCFG_MOS8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, cia_0_intf)
- MCFG_MOS8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK / 10, cia_1_intf)
+ MCFG_MOS8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, 0, cia_0_intf)
+ MCFG_MOS8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK / 10, 0, cia_1_intf)
/* fdc */
MCFG_AMIGA_FDC_ADD("fdc", AMIGA_68000_NTSC_CLOCK)
diff --git a/src/mess/drivers/ami1200.c b/src/mess/drivers/ami1200.c
index 51f72a206a7..a6dc8a6069b 100644
--- a/src/mess/drivers/ami1200.c
+++ b/src/mess/drivers/ami1200.c
@@ -256,7 +256,6 @@ static READ8_DEVICE_HANDLER( a1200_cia_0_portA_r )
static const mos6526_interface a1200_cia_0_intf =
{
- 0, /* tod_clock */
DEVCB_DEVICE_LINE("cia_0", amiga_cia_0_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
@@ -269,7 +268,6 @@ static const mos6526_interface a1200_cia_0_intf =
static const mos6526_interface a1200_cia_1_intf =
{
- 0, /* tod_clock */
DEVCB_DEVICE_LINE("cia_1", amiga_cia_1_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
@@ -317,8 +315,8 @@ static MACHINE_CONFIG_START( a1200n, ami1200_state )
MCFG_SOUND_ROUTE(3, "lspeaker", 0.25)
/* cia */
- MCFG_MOS8520_ADD("cia_0", AMIGA_68EC020_NTSC_CLOCK / 10, a1200_cia_0_intf)
- MCFG_MOS8520_ADD("cia_1", AMIGA_68EC020_NTSC_CLOCK / 10, a1200_cia_1_intf)
+ MCFG_MOS8520_ADD("cia_0", AMIGA_68EC020_NTSC_CLOCK / 10, 0, a1200_cia_0_intf)
+ MCFG_MOS8520_ADD("cia_1", AMIGA_68EC020_NTSC_CLOCK / 10, 0, a1200_cia_1_intf)
/* fdc */
MCFG_AMIGA_FDC_ADD("fdc", AMIGA_68EC020_NTSC_CLOCK/2)
diff --git a/src/mess/drivers/amiga.c b/src/mess/drivers/amiga.c
index b16f7443b28..91d00d79ba1 100644
--- a/src/mess/drivers/amiga.c
+++ b/src/mess/drivers/amiga.c
@@ -283,7 +283,6 @@ static MACHINE_RESET( cdtv )
static const mos6526_interface cia_0_ntsc_intf =
{
- 60, /* tod_clock */
DEVCB_DEVICE_LINE("cia_0", amiga_cia_0_irq), /* irq_func */
DEVCB_DEVICE_LINE_MEMBER("centronics", centronics_device, strobe_w), /* pc_func */
DEVCB_NULL,
@@ -296,7 +295,6 @@ static const mos6526_interface cia_0_ntsc_intf =
static const mos6526_interface cia_0_pal_intf =
{
- 50, /* tod_clock */
DEVCB_DEVICE_LINE("cia_0", amiga_cia_0_irq), /* irq_func */
DEVCB_DEVICE_LINE_MEMBER("centronics", centronics_device, strobe_w), /* pc_func */
DEVCB_NULL,
@@ -309,7 +307,6 @@ static const mos6526_interface cia_0_pal_intf =
static const mos6526_interface cia_1_intf =
{
- 0, /* tod_clock */
DEVCB_DEVICE_LINE("cia_1", amiga_cia_1_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
@@ -322,7 +319,6 @@ static const mos6526_interface cia_1_intf =
static const mos6526_interface cia_0_cdtv_intf =
{
- 0, /* tod_clock */
DEVCB_DEVICE_LINE("cia_0", amiga_cia_0_irq), /* irq_func */
DEVCB_DEVICE_LINE_MEMBER("centronics", centronics_device, strobe_w), /* pc_func */
DEVCB_NULL,
@@ -335,7 +331,6 @@ static const mos6526_interface cia_0_cdtv_intf =
static const mos6526_interface cia_1_cdtv_intf =
{
- 0, /* tod_clock */
DEVCB_DEVICE_LINE("cia_1", amiga_cia_1_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
@@ -414,8 +409,8 @@ static MACHINE_CONFIG_START( ntsc, amiga_state )
MCFG_SOUND_ROUTE(3, "lspeaker", 0.50)
/* cia */
- MCFG_MOS8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, cia_0_ntsc_intf)
- MCFG_MOS8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK, cia_1_intf)
+ MCFG_MOS8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, 60, cia_0_ntsc_intf)
+ MCFG_MOS8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK, 0, cia_1_intf)
/* fdc */
MCFG_AMIGA_FDC_ADD("fdc", AMIGA_68000_NTSC_CLOCK)
@@ -471,8 +466,8 @@ static MACHINE_CONFIG_DERIVED( cdtv, ntsc )
/* cia */
MCFG_DEVICE_REMOVE("cia_0")
MCFG_DEVICE_REMOVE("cia_1")
- MCFG_MOS8520_ADD("cia_0", CDTV_CLOCK_X1 / 40, cia_0_cdtv_intf)
- MCFG_MOS8520_ADD("cia_1", CDTV_CLOCK_X1 / 4, cia_1_cdtv_intf)
+ MCFG_MOS8520_ADD("cia_0", CDTV_CLOCK_X1 / 40, 0, cia_0_cdtv_intf)
+ MCFG_MOS8520_ADD("cia_1", CDTV_CLOCK_X1 / 4, 0, cia_1_cdtv_intf)
/* fdc */
MCFG_DEVICE_MODIFY("fdc")
@@ -495,7 +490,7 @@ static MACHINE_CONFIG_DERIVED( pal, ntsc )
/* cia */
MCFG_DEVICE_REMOVE("cia_0")
- MCFG_MOS8520_ADD("cia_0", AMIGA_68000_PAL_CLOCK / 10, cia_0_pal_intf)
+ MCFG_MOS8520_ADD("cia_0", AMIGA_68000_PAL_CLOCK / 10, 50, cia_0_pal_intf)
/* fdc */
MCFG_DEVICE_MODIFY("fdc")
diff --git a/src/mess/drivers/c128.c b/src/mess/drivers/c128.c
index 7ae413918ed..6eb06897b91 100644
--- a/src/mess/drivers/c128.c
+++ b/src/mess/drivers/c128.c
@@ -169,6 +169,19 @@ It would be also possible to dump the BIOS in monitor, but it would be preferabl
to use an EEPROM reader, in order to obtain a dump of the whole content.
*/
+/*
+
+ TODO:
+
+ - connect to PLA
+ - clean up ROMs
+ - wire up function ROM softlist
+ - remove banking code from machine/c128.h
+ - inherit from c64_state and use common members from there
+ - clean up inputs
+ - fix fast serial
+
+*/
#include "emu.h"
#include "cpu/z80/z80.h"
@@ -212,8 +225,9 @@ to use an EEPROM reader, in order to obtain a dump of the whole content.
* 0xe000-0xffff ram as bank 0
*/
-void c128_state::bankswitch_pla(offs_t offset, int ba, int rw, int aec, int z80io, int ma5, int ma4, int ms3, int ms2, int ms1, int ms0,
- int *cas, int *gwe, int *rom1, int *rom2, int *rom3, int *rom4, int *charom, int *colorram, int *vic, int *from1, int *romh, int *roml, int *dwe, int *ioacc, int *clrbank, int *iocs, int *casenb)
+void c128_state::bankswitch_pla(offs_t offset, offs_t vma, int ba, int rw, int aec, int z80io, int ms3, int ms2, int ms1, int ms0,
+ int *cas, int *gwe, int *rom1, int *rom2, int *rom3, int *rom4, int *charom, int *colorram, int *vic,
+ int *from1, int *romh, int *roml, int *dwe, int *ioacc, int *clrbank, int *iocs, int *casenb)
{
//int game = m_exp->game_r(offset, ba, rw, m_hiram);
//int exrom = m_exp->exrom_r(offset, ba, rw, m_hiram);
@@ -221,15 +235,18 @@ void c128_state::bankswitch_pla(offs_t offset, int ba, int rw, int aec, int z80i
//int _128_256 = 1;
}
-UINT8 c128_state::read_memory(offs_t offset, int ba, int aec, int z80io)
+UINT8 c128_state::read_memory(address_space &space, offs_t offset, offs_t vma, int ba, int aec, int z80io)
{
- int rw = 1, ms0 = 1, ms1 = 1, ms2 = 1, ms3 = 1;
- //offs_t ta = m_mmu->ta_r(offset, aec, &ms0, &ms1, &ms2, &ms3);
- int cas, gwe, rom1, rom2, rom3, rom4, charom, colorram, vic, from1, romh, roml, dwe, ioacc, clrbank, iocs, casenb;
- //int io1 = 1, io2 = 1;
+ int rw = 1, ms0 = 1, ms1 = 1, ms2 = 1, ms3 = 1, cas0 = 1, cas1 = 1;
+ int cas = 1, gwe = 1, rom1 = 1, rom2 = 1, rom3 = 1, rom4 = 1, charom = 1, colorram = 1, vic = 1,
+ from1 = 1, romh = 1, roml = 1, dwe = 1, ioacc = 1, clrbank = 1, iocs = 1, casenb = 1;
+ int io1 = 1, io2 = 1;
- bankswitch_pla(offset, ba, rw, aec, z80io, 0, 0, ms3, ms2, ms1, ms0,
- &cas, &gwe, &rom1, &rom2, &rom3, &rom4, &charom, &colorram, &vic, &from1, &romh, &roml, &dwe, &ioacc, &clrbank, &iocs, &casenb);
+ offs_t ta = m_mmu->ta_r(offset, aec, &ms0, &ms1, &ms2, &ms3, &cas0, &cas1);
+
+ bankswitch_pla(offset, vma, ba, rw, aec, z80io, ms3, ms2, ms1, ms0,
+ &cas, &gwe, &rom1, &rom2, &rom3, &rom4, &charom, &colorram, &vic,
+ &from1, &romh, &roml, &dwe, &ioacc, &clrbank, &iocs, &casenb);
UINT8 data = 0xff;
@@ -238,178 +255,233 @@ UINT8 c128_state::read_memory(offs_t offset, int ba, int aec, int z80io)
data = m_vic->bus_r();
}
- if (!cas)
+ if (!casenb)
{
-
+ if (!cas0)
+ {
+ data = m_ram->pointer()[(ta & 0xff00) | (offset & 0xff)];
+ }
+ else if (!cas1)
+ {
+ data = m_ram->pointer()[0x10000 | (ta & 0xff00) | (offset & 0xff)];
+ }
}
else if (!rom1)
{
-
+ if (m_rom3)
+ {
+ data = m_rom1[((BIT(ta, 14) && BIT(offset, 13)) << 13) | (ta & 0x1000) | (offset & 0xfff)];
+ }
+ else
+ {
+ data = m_rom1[(ms3 << 14) | ((BIT(ta, 14) && BIT(offset, 13)) << 13) | (ta & 0x1000) | (offset & 0xfff)];
+ }
}
- else if (!rom2)
+ else if (!rom2 && m_rom3)
{
-
+ data = m_rom2[offset & 0x3fff];
}
else if (!rom3)
{
-
+ if (m_rom3)
+ {
+ data = m_rom3[offset & 0x3fff];
+ }
+ else
+ {
+ data = m_rom2[(BIT(offset, 15) << 14) | (offset & 0x3fff)];
+ }
}
- else if (!rom4)
+ else if (!rom4 && m_rom3)
{
-
+ data = m_rom4[(ta & 0x1000) | (offset & 0x2fff)];
}
else if (!charom)
{
-
+ data = m_charom[(ms3 << 12) | (ta & 0xf00) | (offset & 0xff)];
}
else if (!colorram)
{
-
+ data = m_color_ram[(clrbank << 10) | (ta & 0x300) | (offset & 0xff)] & 0x0f;
}
else if (!vic)
{
-
+ data = m_vic->read(space, offset & 0x3f);
}
else if (!from1)
{
-
+ data = m_from[offset & 0x7fff];
}
- else if (!iocs)
+ else if (!iocs && BIT(offset, 10))
{
- switch (offset)
+ switch ((BIT(offset, 11) << 2) | ((offset >> 8) & 0x03))
{
case 0: // SID
+ data = m_sid->read(space, offset & 0x1f);
break;
case 2: // CS8563
+ if BIT(offset, 0)
+ {
+ data = m_vdc->register_r(space, 0);
+ }
+ else
+ {
+ data = m_vdc->status_r(space, 0);
+ }
break;
case 4: // CIA1
+ data = m_cia1->read(space, offset & 0x0f);
break;
case 5: // CIA2
+ data = m_cia2->read(space, offset & 0x0f);
break;
case 6: // I/O1
+ io1 = 0;
break;
case 7: // I/O2
+ io2 = 0;
break;
}
}
- return data;//m_exp->cd_r(space, offset, data, ba, roml, romh, io1, io2);
+ data = m_exp->cd_r(space, ta, data, ba, roml, romh, io1, io2);
+
+ return m_mmu->read(offset, data);
}
-void c128_state::write_memory(offs_t offset, UINT8 data, int ba, int aec, int z80io)
+void c128_state::write_memory(address_space &space, offs_t offset, offs_t vma, UINT8 data, int ba, int aec, int z80io)
{
- int rw = 1, ms0 = 1, ms1 = 1, ms2 = 1, ms3 = 1;
- //offs_t ta = m_mmu->ta_r(offset, aec, &ms0, &ms1, &ms2, &ms3);
- int cas, gwe, rom1, rom2, rom3, rom4, charom, colorram, vic, from1, romh, roml, dwe, ioacc, clrbank, iocs, casenb;
- //int io1 = 1, io2 = 1;
+ int rw = 0, ms0 = 1, ms1 = 1, ms2 = 1, ms3 = 1, cas0 = 1, cas1 = 1;
+ int cas = 1, gwe = 1, rom1 = 1, rom2 = 1, rom3 = 1, rom4 = 1, charom = 1, colorram = 1, vic = 1,
+ from1 = 1, romh = 1, roml = 1, dwe = 1, ioacc = 1, clrbank = 1, iocs = 1, casenb = 1;
+ int io1 = 1, io2 = 1;
- bankswitch_pla(offset, ba, rw, aec, z80io, 0, 0, ms3, ms2, ms1, ms0,
- &cas, &gwe, &rom1, &rom2, &rom3, &rom4, &charom, &colorram, &vic, &from1, &romh, &roml, &dwe, &ioacc, &clrbank, &iocs, &casenb);
+ offs_t ta = m_mmu->ta_r(offset, aec, &ms0, &ms1, &ms2, &ms3, &cas0, &cas1);
- if (!cas)
- {
+ bankswitch_pla(offset, vma, ba, rw, aec, z80io, ms3, ms2, ms1, ms0,
+ &cas, &gwe, &rom1, &rom2, &rom3, &rom4, &charom, &colorram, &vic,
+ &from1, &romh, &roml, &dwe, &ioacc, &clrbank, &iocs, &casenb);
- }
- else if (!gwe)
+ if (!casenb && !dwe)
{
-
- }
- else if (!rom1)
- {
-
- }
- else if (!rom2)
- {
-
+ if (!cas0)
+ {
+ m_ram->pointer()[(ta & 0xff00) | (offset & 0xff)] = data;
+ }
+ else if (!cas1)
+ {
+ m_ram->pointer()[0x10000 | (ta & 0xff00) | (offset & 0xff)] = data;
+ }
}
- else if (!rom3)
+ else if (!colorram && !gwe)
{
-
+ m_color_ram[(clrbank << 10) | (ta & 0x300) | (offset & 0xff)] = data | 0xf0;
}
- else if (!rom4)
+ else if (!vic)
{
-
+ m_vic->write(space, offset & 0x3f, data);
}
- else if (!charom)
+ else if (!iocs && BIT(offset, 10))
{
+ switch ((BIT(offset, 11) << 2) | ((offset >> 8) & 0x03))
+ {
+ case 0: // SID
+ m_sid->write(space, offset & 0x1f, data);
+ break;
- }
- else if (!colorram)
- {
+ case 2: // CS8563
+ if BIT(offset, 0)
+ {
+ m_vdc->register_w(space, 0, data);
+ }
+ else
+ {
+ m_vdc->address_w(space, 0, data);
+ }
+ break;
- }
- else if (!vic)
- {
+ case 4: // CIA1
+ m_cia1->write(space, offset & 0x0f, data);
+ break;
- }
- else if (!from1)
- {
+ case 5: // CIA2
+ m_cia2->write(space, offset & 0x0f, data);
+ break;
- }
- else if (!dwe)
- {
+ case 6: // I/O1
+ io1 = 0;
+ break;
+ case 7: // I/O2
+ io2 = 0;
+ break;
+ }
}
- else if (!iocs)
- {
- }
+ m_exp->cd_w(space, ta, data, ba, roml, romh, io1, io2);
- //m_exp->cd_w(space, offset, data, ba, roml, romh, io1, io2);
+ m_mmu->write(space, offset, data);
}
READ8_MEMBER( c128_state::z80_r )
{
int ba = 1, aec = 1, z80io = 1;
+ offs_t vma = 0;
- return read_memory(offset, ba, aec, z80io);
+ return read_memory(space, offset, vma, ba, aec, z80io);
}
WRITE8_MEMBER( c128_state::z80_w )
{
int ba = 1, aec = 1, z80io = 1;
+ offs_t vma = 0;
- write_memory(offset, data, ba, aec, z80io);
+ write_memory(space, offset, vma, data, ba, aec, z80io);
}
READ8_MEMBER( c128_state::z80_io_r )
{
int ba = 1, aec = 1, z80io = 0;
+ offs_t vma = 0;
- return read_memory(offset, ba, aec, z80io);
+ return read_memory(space, offset, vma, ba, aec, z80io);
}
WRITE8_MEMBER( c128_state::z80_io_w )
{
int ba = 1, aec = 1, z80io = 0;
+ offs_t vma = 0;
- write_memory(offset, data, ba, aec, z80io);
+ write_memory(space, offset, vma, data, ba, aec, z80io);
}
READ8_MEMBER( c128_state::read )
{
int ba = 1, aec = 1, z80io = 1;
+ offs_t vma = 0;
- return read_memory(offset, ba, aec, z80io);
+ return read_memory(space, vma, offset, ba, aec, z80io);
}
WRITE8_MEMBER( c128_state::write )
{
int ba = 1, aec = 1, z80io = 1;
+ offs_t vma = 0;
- write_memory(offset, data, ba, aec, z80io);
+ write_memory(space, offset, vma, data, ba, aec, z80io);
}
READ8_MEMBER( c128_state::vic_videoram_r )
{
int ba = 0, aec = 0, z80io = 1;
+ offs_t vma = 0;
- return read_memory(offset, ba, aec, z80io);
+ return read_memory(space, offset, vma, ba, aec, z80io);
}
@@ -436,9 +508,8 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( z80_io, AS_IO, 8, c128_state )
AM_RANGE(0x1000, 0x13ff) AM_READWRITE_LEGACY(c64_colorram_read, c64_colorram_write)
AM_RANGE(0xd000, 0xd3ff) AM_DEVREADWRITE(MOS8564_TAG, mos6566_device, read, write)
- AM_RANGE(0xd400, 0xd4ff) AM_DEVREADWRITE_LEGACY(MOS6581_TAG, sid6581_r, sid6581_w)
+ AM_RANGE(0xd400, 0xd4ff) AM_DEVREADWRITE(MOS6581_TAG, sid6581_device, read, write)
AM_RANGE(0xd500, 0xd5ff) AM_READWRITE(mmu8722_port_r, mmu8722_port_w)
- //AM_RANGE(0xd600, 0xd7ff) AM_DEVREADWRITE_LEGACY(MOS8563_TAG, vdc8563_port_r, vdc8563_port_w)
AM_RANGE(0xd600, 0xd600) AM_MIRROR(0x1fe) AM_DEVREADWRITE(MOS8563_TAG, mos8563_device, status_r, address_w)
AM_RANGE(0xd601, 0xd601) AM_MIRROR(0x1fe) AM_DEVREADWRITE(MOS8563_TAG, mos8563_device, register_r, register_w)
AM_RANGE(0xdc00, 0xdcff) AM_DEVREADWRITE_LEGACY(MOS6526_1_TAG, mos6526_r, mos6526_w)
@@ -749,12 +820,20 @@ INPUT_PORTS_END
WRITE_LINE_MEMBER( c128_state::mmu_z80en_w )
{
-
+ if (state)
+ {
+ m_maincpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
+ m_subcpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
+ }
+ else
+ {
+ m_maincpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
+ m_subcpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
+ }
}
WRITE_LINE_MEMBER( c128_state::mmu_fsdir_w )
{
-
}
READ_LINE_MEMBER( c128_state::mmu_game_r )
@@ -823,19 +902,12 @@ static MOS8564_INTERFACE( vic_intf )
// mc6845_interface vdc_intf
//-------------------------------------------------
-static MC6845_UPDATE_ROW( vdc_update_row )
-{
- mos8563_device *mos8563 = static_cast<mos8563_device *>(device);
-
- mos8563->update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, param);
-}
-
static const mc6845_interface vdc_intf =
{
SCREEN_VDC_TAG,
8,
NULL,
- vdc_update_row,
+ NULL,
NULL,
DEVCB_NULL,
DEVCB_NULL,
@@ -846,20 +918,40 @@ static const mc6845_interface vdc_intf =
//-------------------------------------------------
-// sid6581_interface sid_intf
+// MOS6581_INTERFACE( sid_intf )
//-------------------------------------------------
READ8_MEMBER( c128_state::sid_potx_r )
{
- return c64_paddle_read(m_sid, 0);
+ UINT8 cia1_pa = mos6526_pa_r(m_cia1, 0);
+
+ int sela = BIT(cia1_pa, 6);
+ int selb = BIT(cia1_pa, 7);
+
+ UINT8 data = 0;
+
+ if (sela) data = m_joy1->pot_x_r();
+ if (selb) data = m_joy2->pot_x_r();
+
+ return data;
}
READ8_MEMBER( c128_state::sid_poty_r )
{
- return c64_paddle_read(m_sid, 1);
+ UINT8 cia1_pa = mos6526_pa_r(m_cia1, 0);
+
+ int sela = BIT(cia1_pa, 6);
+ int selb = BIT(cia1_pa, 7);
+
+ UINT8 data = 0;
+
+ if (sela) data = m_joy1->pot_y_r();
+ if (selb) data = m_joy2->pot_y_r();
+
+ return data;
}
-static const sid6581_interface sid_intf =
+static MOS6581_INTERFACE( sid_intf )
{
DEVCB_DRIVER_MEMBER(c128_state, sid_potx_r),
DEVCB_DRIVER_MEMBER(c128_state, sid_poty_r)
@@ -880,6 +972,7 @@ static M6510_INTERFACE( cpu_intf )
0x20
};
+
//-------------------------------------------------
// CBM_IEC_INTERFACE( cbm_iec_intf )
//-------------------------------------------------
@@ -904,6 +997,35 @@ static PET_DATASSETTE_PORT_INTERFACE( datassette_intf )
};
+//-------------------------------------------------
+// C64_EXPANSION_INTERFACE( expansion_intf )
+//-------------------------------------------------
+
+static C64_EXPANSION_INTERFACE( expansion_intf )
+{
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL
+};
+
+
+//-------------------------------------------------
+// C64_USER_PORT_INTERFACE( user_intf )
+//-------------------------------------------------
+
+static C64_USER_PORT_INTERFACE( user_intf )
+{
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL
+};
+
//**************************************************************************
// MACHINE DRIVERS
@@ -914,25 +1036,24 @@ static PET_DATASSETTE_PORT_INTERFACE( datassette_intf )
//-------------------------------------------------
static MACHINE_CONFIG_START( ntsc, c128_state )
- /* basic machine hardware */
+ // basic hardware
MCFG_CPU_ADD(Z80A_TAG, Z80, VIC6567_CLOCK)
MCFG_CPU_PROGRAM_MAP( z80_mem)
MCFG_CPU_IO_MAP( z80_io)
MCFG_CPU_VBLANK_INT(SCREEN_VIC_TAG, c128_frame_interrupt)
- //MCFG_CPU_PERIODIC_INT(vic2_raster_irq, VIC6567_HRETRACERATE)
+ MCFG_QUANTUM_PERFECT_CPU(Z80A_TAG)
MCFG_CPU_ADD(M8502_TAG, M8502, VIC6567_CLOCK)
MCFG_CPU_PROGRAM_MAP( m8502_mem)
MCFG_CPU_CONFIG( cpu_intf )
MCFG_CPU_VBLANK_INT(SCREEN_VIC_TAG, c128_frame_interrupt)
- // MCFG_CPU_PERIODIC_INT(vic2_raster_irq, VIC6567_HRETRACERATE)
+ MCFG_QUANTUM_PERFECT_CPU(M8502_TAG)
- /* video hardware */
- MCFG_MOS8722_ADD(MOS8722_TAG, mmu_intf)
+ // video hardware
+ MCFG_MOS8563_ADD(MOS8563_TAG, SCREEN_VDC_TAG, VIC6567_CLOCK*2, vdc_intf, vdc_videoram_map)
MCFG_MOS8564_ADD(MOS8564_TAG, SCREEN_VIC_TAG, VIC6567_CLOCK, vic_intf, vic_videoram_map, vic_colorram_map)
- MCFG_MOS8563_ADD(MOS8563_TAG, SCREEN_VDC_TAG, 2000000, vdc_intf, vdc_videoram_map)
- /* sound hardware */
+ // sound hardware
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD(MOS6581_TAG, SID6581, VIC6567_CLOCK)
MCFG_SOUND_CONFIG(sid_intf)
@@ -940,19 +1061,34 @@ static MACHINE_CONFIG_START( ntsc, c128_state )
MCFG_SOUND_ADD("dac", DAC, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
- /* quickload */
+ // devices
+ MCFG_MOS8722_ADD(MOS8722_TAG, mmu_intf)
+ MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6567_CLOCK, 60, c128_cia1_intf)
+ MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6567_CLOCK, 60, c128_cia2_intf)
MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS)
-
- /* cassette */
MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, datassette_intf, cbm_datassette_devices, "c1530", NULL)
-
- /* cia */
- MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6567_CLOCK, c128_ntsc_cia0)
- MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6567_CLOCK, c128_ntsc_cia1)
-
- MCFG_FRAGMENT_ADD(c64_cartslot)
- MCFG_SOFTWARE_LIST_ADD("c64_disk_list", "c64_flop")
- MCFG_SOFTWARE_LIST_ADD("c128_disk_list", "c128_flop")
+ MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, NULL, NULL)
+ MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, NULL, NULL)
+ MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, VIC6567_CLOCK, expansion_intf, c64_expansion_cards, NULL, NULL)
+ MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)
+
+ // software list
+ MCFG_SOFTWARE_LIST_ADD("cart_list_vic10", "vic10")
+ MCFG_SOFTWARE_LIST_FILTER("cart_list_vic10", "NTSC")
+ MCFG_SOFTWARE_LIST_ADD("cart_list_c64", "c64_cart")
+ MCFG_SOFTWARE_LIST_FILTER("cart_list_c64", "NTSC")
+ MCFG_SOFTWARE_LIST_ADD("cart_list_c128", "c128_cart")
+ MCFG_SOFTWARE_LIST_FILTER("cart_list_c128", "NTSC")
+ MCFG_SOFTWARE_LIST_ADD("disk_list_c64", "c64_flop")
+ MCFG_SOFTWARE_LIST_FILTER("disk_list_c64", "NTSC")
+ MCFG_SOFTWARE_LIST_ADD("disk_list_c128", "c128_flop")
+ MCFG_SOFTWARE_LIST_FILTER("disk_list_c128", "NTSC")
+ MCFG_SOFTWARE_LIST_ADD("from_list", "c128_rom")
+ MCFG_SOFTWARE_LIST_FILTER("from_list", "NTSC")
+
+ // internal ram
+ MCFG_RAM_ADD(RAM_TAG)
+ MCFG_RAM_DEFAULT_SIZE("128K")
MACHINE_CONFIG_END
@@ -1006,25 +1142,24 @@ MACHINE_CONFIG_END
//-------------------------------------------------
static MACHINE_CONFIG_START( pal, c128_state )
- /* basic machine hardware */
+ // basic hardware
MCFG_CPU_ADD(Z80A_TAG, Z80, VIC6569_CLOCK)
MCFG_CPU_PROGRAM_MAP( z80_mem)
- MCFG_CPU_IO_MAP( z80_io)
+ MCFG_CPU_IO_MAP(z80_io)
MCFG_CPU_VBLANK_INT(SCREEN_VIC_TAG, c128_frame_interrupt)
- //MCFG_CPU_PERIODIC_INT(vic2_raster_irq, VIC6569_HRETRACERATE)
+ MCFG_QUANTUM_PERFECT_CPU(Z80A_TAG)
MCFG_CPU_ADD(M8502_TAG, M8502, VIC6569_CLOCK)
MCFG_CPU_PROGRAM_MAP( m8502_mem)
MCFG_CPU_CONFIG( cpu_intf )
MCFG_CPU_VBLANK_INT(SCREEN_VIC_TAG, c128_frame_interrupt)
- // MCFG_CPU_PERIODIC_INT(vic2_raster_irq, VIC6569_HRETRACERATE)
+ MCFG_QUANTUM_PERFECT_CPU(M8502_TAG)
- /* video hardware */
- MCFG_MOS8722_ADD(MOS8722_TAG, mmu_intf)
- MCFG_MOS8566_ADD(MOS8566_TAG, SCREEN_VIC_TAG, VIC6569_CLOCK, vic_intf, vic_videoram_map, vic_colorram_map)
- MCFG_MOS8563_ADD(MOS8563_TAG, SCREEN_VDC_TAG, 2000000, vdc_intf, vdc_videoram_map)
+ // video hardware
+ MCFG_MOS8563_ADD(MOS8563_TAG, SCREEN_VDC_TAG, VIC6569_CLOCK*2, vdc_intf, vdc_videoram_map)
+ MCFG_MOS8564_ADD(MOS8564_TAG, SCREEN_VIC_TAG, VIC6569_CLOCK, vic_intf, vic_videoram_map, vic_colorram_map)
- /* sound hardware */
+ // sound hardware
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD(MOS6581_TAG, SID6581, VIC6569_CLOCK)
MCFG_SOUND_CONFIG(sid_intf)
@@ -1032,19 +1167,34 @@ static MACHINE_CONFIG_START( pal, c128_state )
MCFG_SOUND_ADD("dac", DAC, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
- /* quickload */
+ // devices
+ MCFG_MOS8722_ADD(MOS8722_TAG, mmu_intf)
+ MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6569_CLOCK, 50, c128_cia1_intf)
+ MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6569_CLOCK, 50, c128_cia2_intf)
MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS)
-
- /* cassette */
MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, datassette_intf, cbm_datassette_devices, "c1530", NULL)
-
- /* cia */
- MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6569_CLOCK, c128_ntsc_cia0)
- MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6569_CLOCK, c128_ntsc_cia1)
-
- MCFG_FRAGMENT_ADD(c64_cartslot)
- MCFG_SOFTWARE_LIST_ADD("c64_disk_list", "c64_flop")
- MCFG_SOFTWARE_LIST_ADD("c128_disk_list", "c128_flop")
+ MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, NULL, NULL)
+ MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, NULL, NULL)
+ MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, VIC6569_CLOCK, expansion_intf, c64_expansion_cards, NULL, NULL)
+ MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)
+
+ // software list
+ MCFG_SOFTWARE_LIST_ADD("cart_list_vic10", "vic10")
+ MCFG_SOFTWARE_LIST_FILTER("cart_list_vic10", "PAL")
+ MCFG_SOFTWARE_LIST_ADD("cart_list_c64", "c64_cart")
+ MCFG_SOFTWARE_LIST_FILTER("cart_list_c64", "PAL")
+ MCFG_SOFTWARE_LIST_ADD("cart_list_c128", "c128_cart")
+ MCFG_SOFTWARE_LIST_FILTER("cart_list_c128", "PAL")
+ MCFG_SOFTWARE_LIST_ADD("disk_list_c64", "c64_flop")
+ MCFG_SOFTWARE_LIST_FILTER("disk_list_c64", "PAL")
+ MCFG_SOFTWARE_LIST_ADD("disk_list_c128", "c128_flop")
+ MCFG_SOFTWARE_LIST_FILTER("disk_list_c128", "PAL")
+ MCFG_SOFTWARE_LIST_ADD("from_list", "c128_rom")
+ MCFG_SOFTWARE_LIST_FILTER("from_list", "PAL")
+
+ // internal ram
+ MCFG_RAM_ADD(RAM_TAG)
+ MCFG_RAM_DEFAULT_SIZE("128K")
MACHINE_CONFIG_END
diff --git a/src/mess/drivers/c64.c b/src/mess/drivers/c64.c
index 610e20bf8e1..5ded23f4ee4 100644
--- a/src/mess/drivers/c64.c
+++ b/src/mess/drivers/c64.c
@@ -124,7 +124,7 @@ UINT8 c64_state::read_memory(address_space &space, offs_t offset, int ba, int ca
break;
case 1: // SID
- data = sid6581_r(m_sid, offset & 0x1f);
+ data = m_sid->read(space, offset & 0x1f);
break;
case 2: // COLOR
@@ -140,11 +140,11 @@ UINT8 c64_state::read_memory(address_space &space, offs_t offset, int ba, int ca
else
cia_set_port_mask_value(m_cia1, 0, ioport("CTRLSEL")->read() & 0x80 ? c64_keyline[8] : c64_keyline[9] );
- data = mos6526_r(m_cia1, offset & 0x0f);
+ data = m_cia1->read(space, offset & 0x0f);
break;
case 1: // CIA2
- data = mos6526_r(m_cia2, offset & 0x0f);
+ data = m_cia2->read(space, offset & 0x0f);
break;
case 2: // I/O1
@@ -211,7 +211,7 @@ WRITE8_MEMBER( c64_state::write )
break;
case 1: // SID
- sid6581_w(m_sid, offset & 0x1f, data);
+ m_sid->write(space, offset & 0x1f, data);
break;
case 2: // COLOR
@@ -222,11 +222,11 @@ WRITE8_MEMBER( c64_state::write )
switch ((offset >> 8) & 0x03)
{
case 0: // CIA1
- mos6526_w(m_cia1, offset & 0x0f, data);
+ m_cia1->write(space, offset & 0x0f, data);
break;
case 1: // CIA2
- mos6526_w(m_cia2, offset & 0x0f, data);
+ m_cia2->write(space, offset & 0x0f, data);
break;
case 2: // I/O1
@@ -422,7 +422,7 @@ static MOS6567_INTERFACE( vic_intf )
//-------------------------------------------------
-// sid6581_interface sid_intf
+// MOS6581_INTERFACE( sid_intf )
//-------------------------------------------------
READ8_MEMBER( c64_state::sid_potx_r )
@@ -539,7 +539,6 @@ WRITE8_MEMBER( c64_state::cia1_pb_w )
static const mos6526_interface cia1_intf =
{
- 10,
DEVCB_DRIVER_LINE_MEMBER(c64_state, cia1_irq_w),
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, sp1_w),
@@ -623,7 +622,6 @@ WRITE8_MEMBER( c64_state::cia2_pa_w )
static const mos6526_interface cia2_intf =
{
- 10,
DEVCB_DRIVER_LINE_MEMBER(c64_state, cia2_irq_w),
DEVCB_DEVICE_LINE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, pc2_w),
DEVCB_DEVICE_LINE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, sp2_w),
@@ -1009,8 +1007,8 @@ static MACHINE_CONFIG_START( ntsc, c64_state )
// devices
MCFG_PLS100_ADD(PLA_TAG)
- MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6567_CLOCK, cia1_intf)
- MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6567_CLOCK, cia2_intf)
+ MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6567_CLOCK, 60, cia1_intf)
+ MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6567_CLOCK, 60, cia2_intf)
MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS)
MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, datassette_intf, cbm_datassette_devices, "c1530", NULL)
MCFG_CBM_IEC_ADD(iec_intf, "c1541")
@@ -1108,8 +1106,8 @@ static MACHINE_CONFIG_START( pal, c64_state )
// devices
MCFG_PLS100_ADD(PLA_TAG)
- MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6569_CLOCK, cia1_intf)
- MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6569_CLOCK, cia2_intf)
+ MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6569_CLOCK, 50, cia1_intf)
+ MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6569_CLOCK, 50, cia2_intf)
MCFG_QUICKLOAD_ADD("quickload", cbm_c64, "p00,prg,t64", CBM_QUICKLOAD_DELAY_SECONDS)
MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, datassette_intf, cbm_datassette_devices, "c1530", NULL)
MCFG_CBM_IEC_ADD(iec_intf, "c1541")
@@ -1185,8 +1183,8 @@ static MACHINE_CONFIG_START( pal_gs, c64gs_state )
// devices
MCFG_PLS100_ADD(PLA_TAG)
- MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6569_CLOCK, cia1_intf)
- MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6569_CLOCK, cia2_intf)
+ MCFG_MOS6526R1_ADD(MOS6526_1_TAG, VIC6569_CLOCK, 50, cia1_intf)
+ MCFG_MOS6526R1_ADD(MOS6526_2_TAG, VIC6569_CLOCK, 50, cia2_intf)
MCFG_CBM_IEC_BUS_ADD(iec_intf)
MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, NULL, NULL)
MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, NULL, NULL)
diff --git a/src/mess/drivers/c65.c b/src/mess/drivers/c65.c
index 5165d3b6108..c0ff98f6e3c 100644
--- a/src/mess/drivers/c65.c
+++ b/src/mess/drivers/c65.c
@@ -337,8 +337,8 @@ static MACHINE_CONFIG_START( c65, c65_state )
MCFG_QUICKLOAD_ADD("quickload", cbm_c65, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS)
/* cia */
- MCFG_MOS6526R1_ADD("cia_0", 3500000, c65_ntsc_cia0)
- MCFG_MOS6526R1_ADD("cia_1", 3500000, c65_ntsc_cia1)
+ MCFG_MOS6526R1_ADD("cia_0", 3500000, 60, c65_cia0)
+ MCFG_MOS6526R1_ADD("cia_1", 3500000, 60, c65_cia1)
/* floppy from serial bus */
MCFG_CBM_IEC_ADD(cbm_iec_intf, NULL)
@@ -371,8 +371,8 @@ static MACHINE_CONFIG_DERIVED( c65pal, c65 )
/* cia */
MCFG_DEVICE_REMOVE("cia_0")
MCFG_DEVICE_REMOVE("cia_1")
- MCFG_MOS6526R1_ADD("cia_0", 3500000, c65_pal_cia0)
- MCFG_MOS6526R1_ADD("cia_1", 3500000, c65_pal_cia1)
+ MCFG_MOS6526R1_ADD("cia_0", 3500000, 50, c65_cia0)
+ MCFG_MOS6526R1_ADD("cia_1", 3500000, 50, c65_cia1)
MACHINE_CONFIG_END
diff --git a/src/mess/drivers/cbmb.c b/src/mess/drivers/cbmb.c
index 5635f69ff2d..8aea0ba1fbf 100644
--- a/src/mess/drivers/cbmb.c
+++ b/src/mess/drivers/cbmb.c
@@ -137,7 +137,7 @@ static ADDRESS_MAP_START(cbmb_mem , AS_PROGRAM, 8, cbmb_state )
AM_RANGE(0xfd800, 0xfd800) AM_MIRROR(0xfe) AM_DEVWRITE("crtc", mc6845_device, address_w)
AM_RANGE(0xfd801, 0xfd801) AM_MIRROR(0xfe) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w)
/* disk units */
- AM_RANGE(0xfda00, 0xfdaff) AM_DEVREADWRITE_LEGACY("sid6581", sid6581_r, sid6581_w)
+ AM_RANGE(0xfda00, 0xfdaff) AM_DEVREADWRITE("sid6581", sid6581_device, read, write)
/* db00 coprocessor */
AM_RANGE(0xfdc00, 0xfdcff) AM_DEVREADWRITE_LEGACY("cia", mos6526_r, mos6526_w)
/* dd00 acia */
@@ -164,7 +164,7 @@ static ADDRESS_MAP_START(p500_mem , AS_PROGRAM, 8, cbmb_state )
AM_RANGE(0xfd400, 0xfd7ff) AM_RAM_WRITE(cbmb_colorram_w) AM_SHARE("colorram") /* colorram */
AM_RANGE(0xfd800, 0xfd8ff) AM_DEVREADWRITE("vic6567", mos6566_device, read, write)
/* disk units */
- AM_RANGE(0xfda00, 0xfdaff) AM_DEVREADWRITE_LEGACY("sid6581", sid6581_r, sid6581_w)
+ AM_RANGE(0xfda00, 0xfdaff) AM_DEVREADWRITE("sid6581", sid6581_device, read, write)
/* db00 coprocessor */
AM_RANGE(0xfdc00, 0xfdcff) AM_DEVREADWRITE_LEGACY("cia", mos6526_r, mos6526_w)
/* dd00 acia */
@@ -450,7 +450,7 @@ static MACHINE_CONFIG_START( cbm600, cbmb_state )
MCFG_QUICKLOAD_ADD("quickload", cbmb, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS)
/* cia */
- MCFG_MOS6526R1_ADD("cia", 7833600, cbmb_cia)
+ MCFG_MOS6526R1_ADD("cia", 7833600, 60, cbmb_cia)
/* tpi */
MCFG_TPI6525_ADD("tpi6525_0", cbmb_tpi_0_intf)
@@ -515,7 +515,7 @@ static MACHINE_CONFIG_START( p500, cbmb_state )
MCFG_QUICKLOAD_ADD("quickload", p500, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS)
/* cia */
- MCFG_MOS6526R1_ADD("cia", VIC6567_CLOCK, cbmb_cia)
+ MCFG_MOS6526R1_ADD("cia", VIC6567_CLOCK, 60, cbmb_cia)
/* tpi */
MCFG_TPI6525_ADD("tpi6525_0", cbmb_tpi_0_intf)
diff --git a/src/mess/drivers/sbc6510.c b/src/mess/drivers/sbc6510.c
index 9a736ddf289..5d3e601024a 100644
--- a/src/mess/drivers/sbc6510.c
+++ b/src/mess/drivers/sbc6510.c
@@ -249,7 +249,6 @@ WRITE8_MEMBER( sbc6510_state::key_w )
const mos6526_interface cia_intf =
{
- 10, // time-of-day clock 1/10 second - no idea about this
DEVCB_CPU_INPUT_LINE("maincpu", M6502_IRQ_LINE), // irq
DEVCB_NULL, // pc (timer related) not connected
DEVCB_NULL, // cnt (serial related) not connected
@@ -277,7 +276,7 @@ static MACHINE_CONFIG_START( sbc6510, sbc6510_state )
MCFG_SOUND_CONFIG(sbc6510_ay_interface)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
- MCFG_MOS6526R1_ADD("cia6526", XTAL_1MHz, cia_intf)
+ MCFG_MOS6526R1_ADD("cia6526", XTAL_1MHz, 50, cia_intf)
MACHINE_CONFIG_END
/* ROM definition */
diff --git a/src/mess/drivers/vic10.c b/src/mess/drivers/vic10.c
index 992589472e3..adc53772fe0 100644
--- a/src/mess/drivers/vic10.c
+++ b/src/mess/drivers/vic10.c
@@ -60,7 +60,7 @@ READ8_MEMBER( vic10_state::read )
}
else if (offset >= 0xd400 && offset < 0xd800)
{
- data = sid6581_r(m_sid, offset & 0x1f);
+ data = m_sid->read(space, offset & 0x1f);
}
else if (offset >= 0xd800 && offset < 0xdc00)
{
@@ -103,7 +103,7 @@ WRITE8_MEMBER( vic10_state::write )
}
else if (offset >= 0xd400 && offset < 0xd800)
{
- sid6581_w(m_sid, offset & 0x1f, data);
+ m_sid->write(space, offset & 0x1f, data);
}
else if (offset >= 0xd800 && offset < 0xdc00)
{
@@ -458,7 +458,6 @@ WRITE8_MEMBER( vic10_state::cia_pb_w )
static const mos6526_interface cia_intf =
{
- 10,
DEVCB_DRIVER_LINE_MEMBER(vic10_state, cia_irq_w),
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER(VIC10_EXPANSION_SLOT_TAG, vic10_expansion_slot_device, sp_w),
@@ -630,7 +629,7 @@ static MACHINE_CONFIG_START( vic10, vic10_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
// devices
- MCFG_MOS6526R1_ADD(MOS6526_TAG, VIC6566_CLOCK, cia_intf)
+ MCFG_MOS6526R1_ADD(MOS6526_TAG, VIC6566_CLOCK, 60, cia_intf)
MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, datassette_intf, cbm_datassette_devices, NULL, NULL)
MCFG_VIC10_EXPANSION_SLOT_ADD(VIC10_EXPANSION_SLOT_TAG, VIC6566_CLOCK, expansion_intf, vic10_expansion_cards, NULL, NULL)
diff --git a/src/mess/includes/c128.h b/src/mess/includes/c128.h
index 4570fd369b3..1556d1b1a69 100644
--- a/src/mess/includes/c128.h
+++ b/src/mess/includes/c128.h
@@ -63,12 +63,18 @@ public:
m_cia1(*this, MOS6526_1_TAG),
m_cia2(*this, MOS6526_2_TAG),
//m_iec(*this, CBM_IEC_TAG),
- //m_joy1(*this, CONTROL1_TAG),
- //m_joy2(*this, CONTROL2_TAG),
- //m_exp(*this, C128_EXPANSION_SLOT_TAG),
- //m_user(*this, C128_USER_PORT_TAG),
- //m_ram(*this, RAM_TAG),
- m_cassette(*this, PET_DATASSETTE_PORT_TAG)
+ m_joy1(*this, CONTROL1_TAG),
+ m_joy2(*this, CONTROL2_TAG),
+ m_exp(*this, C64_EXPANSION_SLOT_TAG),
+ m_user(*this, C64_USER_PORT_TAG),
+ m_ram(*this, RAM_TAG),
+ m_cassette(*this, PET_DATASSETTE_PORT_TAG),
+ m_rom1(NULL),
+ m_rom2(NULL),
+ m_rom3(NULL),
+ m_rom4(NULL),
+ m_from(NULL),
+ m_charom(NULL)
{ }
required_device<legacy_cpu_device> m_maincpu;
@@ -80,20 +86,20 @@ public:
required_device<mos6526_device> m_cia1;
required_device<mos6526_device> m_cia2;
//required_device<cbm_iec_device> m_iec;
- //required_device<vcs_control_port_device> m_joy1;
- //required_device<vcs_control_port_device> m_joy2;
- //required_device<c64_expansion_slot_device> m_exp;
- //required_device<c64_user_port_device> m_user;
- //required_device<ram_device> m_ram;
+ required_device<vcs_control_port_device> m_joy1;
+ required_device<vcs_control_port_device> m_joy2;
+ required_device<c64_expansion_slot_device> m_exp;
+ required_device<c64_user_port_device> m_user;
+ required_device<ram_device> m_ram;
required_device<pet_datassette_port_device> m_cassette;
virtual void machine_start();
virtual void machine_reset();
- void bankswitch_pla(offs_t offset, int ba, int rw, int aec, int z80io, int ma5, int ma4, int ms3, int ms2, int ms1, int ms0,
+ void bankswitch_pla(offs_t offset, offs_t vma, int ba, int rw, int aec, int z80io, int ms3, int ms2, int ms1, int ms0,
int *cas, int *gwe, int *rom1, int *rom2, int *rom3, int *rom4, int *charom, int *colorram, int *vic, int *from1, int *romh, int *roml, int *dwe, int *ioacc, int *clrbank, int *iocs, int *casenb);
- UINT8 read_memory(offs_t offset, int ba, int aec, int z80io);
- void write_memory(offs_t offset, UINT8 data, int ba, int aec, int z80io);
+ UINT8 read_memory(address_space &space, offs_t offset, offs_t vma, int ba, int aec, int z80io);
+ void write_memory(address_space &space, offs_t offset, offs_t vma, UINT8 data, int ba, int aec, int z80io);
DECLARE_READ8_MEMBER( z80_r );
DECLARE_WRITE8_MEMBER( z80_w );
@@ -165,6 +171,14 @@ public:
void bankswitch(int reset);
void mmu8722_reset();
+ const UINT8 *m_rom1;
+ const UINT8 *m_rom2;
+ const UINT8 *m_rom3;
+ const UINT8 *m_rom4;
+ const UINT8 *m_from;
+ const UINT8 *m_charom;
+ UINT8 *m_color_ram;
+
UINT8 *m_c128_basic;
UINT8 *m_c128_kernal;
UINT8 *m_c128_chargen;
@@ -181,7 +195,7 @@ public:
int m_write_io;
int m_ram_bottom;
int m_ram_top;
- UINT8 *m_ram;
+ UINT8 *m_ram_ptr;
UINT8 m_c64_port_data;
UINT8 m_keyline[3];
int m_cnt1;
@@ -204,7 +218,6 @@ public:
extern INTERRUPT_GEN( c128_frame_interrupt );
-extern const mos6526_interface c128_ntsc_cia0, c128_pal_cia0;
-extern const mos6526_interface c128_ntsc_cia1, c128_pal_cia1;
+extern const mos6526_interface c128_cia1_intf, c128_cia2_intf;
#endif /* __C128_H__ */
diff --git a/src/mess/includes/c65.h b/src/mess/includes/c65.h
index 424aa226c16..ff0df05c0b8 100644
--- a/src/mess/includes/c65.h
+++ b/src/mess/includes/c65.h
@@ -85,7 +85,7 @@ void c65_bankswitch_interface(running_machine &machine, int value);
MACHINE_START( c65 );
INTERRUPT_GEN( c65_frame_interrupt );
-extern const mos6526_interface c65_ntsc_cia0, c65_pal_cia0;
-extern const mos6526_interface c65_ntsc_cia1, c65_pal_cia1;
+extern const mos6526_interface c65_cia0;
+extern const mos6526_interface c65_cia1;
#endif /* C65_H_ */
diff --git a/src/mess/includes/vic10.h b/src/mess/includes/vic10.h
index 47f247190f0..a0715ee11a3 100644
--- a/src/mess/includes/vic10.h
+++ b/src/mess/includes/vic10.h
@@ -40,7 +40,7 @@ public:
required_device<cpu_device> m_maincpu;
required_device<mos6566_device> m_vic;
- required_device<device_t> m_sid;
+ required_device<sid6581_device> m_sid;
required_device<mos6526_device> m_cia;
required_device<vic10_expansion_slot_device> m_exp;
required_device<ram_device> m_ram;
diff --git a/src/mess/machine/c128.c b/src/mess/machine/c128.c
index db45795400d..811df673971 100644
--- a/src/mess/machine/c128.c
+++ b/src/mess/machine/c128.c
@@ -223,22 +223,8 @@ WRITE_LINE_MEMBER( c128_state::cia1_sp_w )
iec_data_out_w();
}
-const mos6526_interface c128_ntsc_cia0 =
+const mos6526_interface c128_cia1_intf =
{
- 60,
- DEVCB_DRIVER_LINE_MEMBER(c128_state, cia1_irq_w),
- DEVCB_NULL, /* pc_func */
- DEVCB_DRIVER_LINE_MEMBER(c128_state, cia1_cnt_w),
- DEVCB_DRIVER_LINE_MEMBER(c128_state, cia1_sp_w),
- DEVCB_DRIVER_MEMBER(c128_state, cia1_pa_r),
- DEVCB_NULL,
- DEVCB_DRIVER_MEMBER(c128_state, cia1_pb_r),
- DEVCB_DRIVER_MEMBER(c128_state, cia1_pb_w)
-};
-
-const mos6526_interface c128_pal_cia0 =
-{
- 50,
DEVCB_DRIVER_LINE_MEMBER(c128_state, cia1_irq_w),
DEVCB_NULL, /* pc_func */
DEVCB_DRIVER_LINE_MEMBER(c128_state, cia1_cnt_w),
@@ -315,22 +301,8 @@ WRITE_LINE_MEMBER( c128_state::cia2_irq_w )
nmi();
}
-const mos6526_interface c128_ntsc_cia1 =
+const mos6526_interface c128_cia2_intf =
{
- 60,
- DEVCB_DRIVER_LINE_MEMBER(c128_state, cia2_irq_w),
- DEVCB_NULL, /* pc_func */
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_DRIVER_MEMBER(c128_state, cia2_pa_r),
- DEVCB_DRIVER_MEMBER(c128_state, cia2_pa_w),
- DEVCB_NULL,
- DEVCB_NULL
-};
-
-const mos6526_interface c128_pal_cia1 =
-{
- 50,
DEVCB_DRIVER_LINE_MEMBER(c128_state, cia2_irq_w),
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
@@ -366,7 +338,7 @@ WRITE8_MEMBER( c128_state::write_d000 )
if (offset + 0xd000 >= m_ram_top)
m_memory[0xd000 + offset] = data;
else
- m_ram[0xd000 + offset] = data;
+ m_ram_ptr[0xd000 + offset] = data;
}
else
{
@@ -376,7 +348,7 @@ WRITE8_MEMBER( c128_state::write_d000 )
m_vic->write(space, offset & 0x3f, data);
break;
case 4:
- sid6581_w(m_sid, offset & 0x3f, data);
+ m_sid->write(space, offset & 0x3f, data);
break;
case 5:
mmu8722_port_w(space, offset & 0xff, data);
@@ -416,7 +388,7 @@ READ8_MEMBER( c128_state::read_io )
if (offset < 0x400)
return m_vic->read(space, offset & 0x3f);
else if (offset < 0x500)
- return sid6581_r(m_sid, offset & 0xff);
+ return m_sid->read(space, offset & 0xff);
else if (offset < 0x600)
return mmu8722_port_r(space, offset & 0xff);
else if (offset < 0x800)
@@ -519,14 +491,14 @@ void c128_state::bankswitch_64(int reset)
0x3f 0x3f 0x7f 0x3e 0x7e 0xb0 0x0b 0x00 0x00 0x01 0x00 */
void c128_state::bankswitch_z80()
{
- m_ram = m_memory + MMU_RAM_ADDR;
+ m_ram_ptr = m_memory + MMU_RAM_ADDR;
m_va1617 = MMU_VIC_ADDR;
#if 1
membank("bank10")->set_base(m_z80);
- membank("bank11")->set_base(m_ram + 0x1000);
+ membank("bank11")->set_base(m_ram_ptr + 0x1000);
if ( (( (ioport("SPECIAL")->read() & 0x06) == 0x02 ) && (MMU_RAM_ADDR >= 0x40000))
|| (( (ioport("SPECIAL")->read() & 0x06) == 0x00) && (MMU_RAM_ADDR >= 0x20000)) )
- m_ram = NULL;
+ m_ram_ptr = NULL;
#else
if (MMU_BOTTOM)
m_ram_bottom = MMU_SIZE;
@@ -587,7 +559,7 @@ void c128_state::bankswitch_128(int reset)
if (m_c64mode)
{
/* mmu works also in c64 mode, but this can wait */
- m_ram = m_memory;
+ m_ram_ptr = m_memory;
m_va1617 = 0;
m_ram_bottom = 0;
m_ram_top = 0x10000;
@@ -608,7 +580,7 @@ void c128_state::bankswitch_128(int reset)
}
else
{
- m_ram = m_memory + MMU_RAM_ADDR;
+ m_ram_ptr = m_memory + MMU_RAM_ADDR;
m_va1617 = MMU_VIC_ADDR;
membank("bank1")->set_base(m_memory + m_mmu_page0);
membank("bank2")->set_base(m_memory + m_mmu_page1);
@@ -618,14 +590,14 @@ void c128_state::bankswitch_128(int reset)
}
else
m_ram_bottom = 0;
- membank("bank3")->set_base((m_ram_bottom > 0x200 ? m_memory : m_ram) + 0x200);
- membank("bank4")->set_base((m_ram_bottom > 0x400 ? m_memory : m_ram) + 0x400);
- membank("bank5")->set_base((m_ram_bottom > 0x1000 ? m_memory : m_ram) + 0x1000);
- membank("bank6")->set_base((m_ram_bottom > 0x2000 ? m_memory : m_ram) + 0x2000);
+ membank("bank3")->set_base((m_ram_bottom > 0x200 ? m_memory : m_ram_ptr) + 0x200);
+ membank("bank4")->set_base((m_ram_bottom > 0x400 ? m_memory : m_ram_ptr) + 0x400);
+ membank("bank5")->set_base((m_ram_bottom > 0x1000 ? m_memory : m_ram_ptr) + 0x1000);
+ membank("bank6")->set_base((m_ram_bottom > 0x2000 ? m_memory : m_ram_ptr) + 0x2000);
if (MMU_RAM_LO)
{
- membank("bank7")->set_base(m_ram + 0x4000);
+ membank("bank7")->set_base(m_ram_ptr + 0x4000);
}
else
{
@@ -634,8 +606,8 @@ void c128_state::bankswitch_128(int reset)
if (MMU_RAM_MID)
{
- membank("bank8")->set_base(m_ram + 0x8000);
- membank("bank9")->set_base(m_ram + 0xa000);
+ membank("bank8")->set_base(m_ram_ptr + 0x8000);
+ membank("bank9")->set_base(m_ram_ptr + 0xa000);
}
else if (MMU_ROM_MID)
{
@@ -678,7 +650,7 @@ void c128_state::bankswitch_128(int reset)
{
if (m_ram_top > 0xc000)
{
- membank("bank12")->set_base(m_ram + 0xc000);
+ membank("bank12")->set_base(m_ram_ptr + 0xc000);
}
else
{
@@ -688,7 +660,7 @@ void c128_state::bankswitch_128(int reset)
{
if (m_ram_top > 0xd000)
{
- membank("bank13")->set_base(m_ram + 0xd000);
+ membank("bank13")->set_base(m_ram_ptr + 0xd000);
}
else
{
@@ -697,7 +669,7 @@ void c128_state::bankswitch_128(int reset)
}
if (m_ram_top > 0xe000)
{
- membank("bank14")->set_base(m_ram + 0xe000);
+ membank("bank14")->set_base(m_ram_ptr + 0xe000);
}
else
{
@@ -705,7 +677,7 @@ void c128_state::bankswitch_128(int reset)
}
if (m_ram_top > 0xff05)
{
- membank("bank16")->set_base(m_ram + 0xff05);
+ membank("bank16")->set_base(m_ram_ptr + 0xff05);
}
else
{
@@ -742,7 +714,7 @@ void c128_state::bankswitch_128(int reset)
if ( (( (ioport("SPECIAL")->read() & 0x06) == 0x02 ) && (MMU_RAM_ADDR >= 0x40000))
|| (( (ioport("SPECIAL")->read() & 0x06) == 0x00) && (MMU_RAM_ADDR >= 0x20000)) )
- m_ram = NULL;
+ m_ram_ptr = NULL;
}
}
@@ -918,53 +890,53 @@ READ8_MEMBER( c128_state::mmu8722_ff00_r )
WRITE8_MEMBER( c128_state::write_0000 )
{
- if (m_ram != NULL)
- m_ram[0x0000 + offset] = data;
+ if (m_ram_ptr != NULL)
+ m_ram_ptr[0x0000 + offset] = data;
}
WRITE8_MEMBER( c128_state::write_1000 )
{
- if (m_ram != NULL)
- m_ram[0x1000 + offset] = data;
+ if (m_ram_ptr != NULL)
+ m_ram_ptr[0x1000 + offset] = data;
}
WRITE8_MEMBER( c128_state::write_4000 )
{
- if (m_ram != NULL)
- m_ram[0x4000 + offset] = data;
+ if (m_ram_ptr != NULL)
+ m_ram_ptr[0x4000 + offset] = data;
}
WRITE8_MEMBER( c128_state::write_8000 )
{
- if (m_ram != NULL)
- m_ram[0x8000 + offset] = data;
+ if (m_ram_ptr != NULL)
+ m_ram_ptr[0x8000 + offset] = data;
}
WRITE8_MEMBER( c128_state::write_a000 )
{
- if (m_ram != NULL)
- m_ram[0xa000 + offset] = data;
+ if (m_ram_ptr != NULL)
+ m_ram_ptr[0xa000 + offset] = data;
}
WRITE8_MEMBER( c128_state::write_c000 )
{
- if (m_ram != NULL)
- m_ram[0xc000 + offset] = data;
+ if (m_ram_ptr != NULL)
+ m_ram_ptr[0xc000 + offset] = data;
}
WRITE8_MEMBER( c128_state::write_e000 )
{
if (offset + 0xe000 >= m_ram_top)
m_memory[0xe000 + offset] = data;
- else if (m_ram != NULL)
- m_ram[0xe000 + offset] = data;
+ else if (m_ram_ptr != NULL)
+ m_ram_ptr[0xe000 + offset] = data;
}
WRITE8_MEMBER( c128_state::write_ff00 )
{
if (!m_c64mode)
mmu8722_ff00_w(space, offset, data);
- else if (m_ram!=NULL)
+ else if (m_ram_ptr!=NULL)
m_memory[0xff00 + offset] = data;
}
@@ -972,8 +944,8 @@ WRITE8_MEMBER( c128_state::write_ff05 )
{
if (offset + 0xff05 >= m_ram_top)
m_memory[0xff05 + offset] = data;
- else if (m_ram!=NULL)
- m_ram[0xff05 + offset] = data;
+ else if (m_ram_ptr!=NULL)
+ m_ram_ptr[0xff05 + offset] = data;
}
/*
diff --git a/src/mess/machine/c1571.c b/src/mess/machine/c1571.c
index bf2b1addd55..d11994540ad 100644
--- a/src/mess/machine/c1571.c
+++ b/src/mess/machine/c1571.c
@@ -491,7 +491,6 @@ WRITE8_MEMBER( base_c1571_device::cia_pb_w )
static MOS6526_INTERFACE( cia_intf )
{
- 0,
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, base_c1571_device, cia_irq_w),
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, base_c1571_device, cia_pc_w),
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, base_c1571_device, cia_cnt_w),
@@ -603,7 +602,7 @@ static MACHINE_CONFIG_FRAGMENT( c1571 )
MCFG_VIA6522_ADD(M6522_0_TAG, XTAL_16MHz/16, via0_intf)
MCFG_VIA6522_ADD(M6522_1_TAG, XTAL_16MHz/16, via1_intf)
- MCFG_MOS6526R1_ADD(M6526_TAG, XTAL_16MHz/16, cia_intf)
+ MCFG_MOS6526R1_ADD(M6526_TAG, XTAL_16MHz/16, 0, cia_intf)
MCFG_WD1770_ADD(WD1770_TAG, /* XTAL_16MHz/2, */ fdc_intf)
MCFG_LEGACY_FLOPPY_DRIVE_ADD(FLOPPY_0, c1571_floppy_interface)
@@ -622,7 +621,7 @@ static MACHINE_CONFIG_FRAGMENT( c1570 )
MCFG_VIA6522_ADD(M6522_0_TAG, XTAL_16MHz/16, via0_intf)
MCFG_VIA6522_ADD(M6522_1_TAG, XTAL_16MHz/16, via1_intf)
- MCFG_MOS6526R1_ADD(M6526_TAG, XTAL_16MHz/16, cia_intf)
+ MCFG_MOS6526R1_ADD(M6526_TAG, XTAL_16MHz/16, 0, cia_intf)
MCFG_WD1770_ADD(WD1770_TAG, /* XTAL_16MHz/2, */ fdc_intf)
MCFG_LEGACY_FLOPPY_DRIVE_ADD(FLOPPY_0, c1570_floppy_interface)
diff --git a/src/mess/machine/c1581.c b/src/mess/machine/c1581.c
index 6f633a1f0b4..2a372672d13 100644
--- a/src/mess/machine/c1581.c
+++ b/src/mess/machine/c1581.c
@@ -276,7 +276,6 @@ WRITE8_MEMBER( base_c1581_device::cia_pb_w )
static MOS8520_INTERFACE( cia_intf )
{
- XTAL_16MHz/8,
DEVCB_CPU_INPUT_LINE(M6502_TAG, INPUT_LINE_IRQ0),
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, base_c1581_device, cnt_w),
@@ -336,7 +335,7 @@ static MACHINE_CONFIG_FRAGMENT( c1581 )
MCFG_CPU_ADD(M6502_TAG, M6502, XTAL_16MHz/8)
MCFG_CPU_PROGRAM_MAP(c1581_mem)
- MCFG_MOS8520_ADD(M8520_TAG, XTAL_16MHz/8, cia_intf)
+ MCFG_MOS8520_ADD(M8520_TAG, XTAL_16MHz/8, 0, cia_intf)
MCFG_WD1770_ADD(WD1770_TAG, /*XTAL_16MHz/2,*/ fdc_intf)
MCFG_LEGACY_FLOPPY_DRIVE_ADD(FLOPPY_0, c1581_floppy_interface)
diff --git a/src/mess/machine/c64.c b/src/mess/machine/c64.c
index 7774db8c4f6..0d0f36d00af 100644
--- a/src/mess/machine/c64.c
+++ b/src/mess/machine/c64.c
@@ -129,7 +129,6 @@ WRITE_LINE_MEMBER( legacy_c64_state::c64_vic_interrupt )
const mos6526_interface c64_ntsc_cia0 =
{
- 10, /* 1/10 second */
DEVCB_LINE(c64_cia0_interrupt),
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
@@ -142,7 +141,6 @@ const mos6526_interface c64_ntsc_cia0 =
const mos6526_interface c64_pal_cia0 =
{
- 10, /* 1/10 second */
DEVCB_LINE(c64_cia0_interrupt),
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
@@ -210,7 +208,6 @@ static void c64_cia1_interrupt( device_t *device, int level )
const mos6526_interface c64_ntsc_cia1 =
{
- 10, /* 1/10 second */
DEVCB_LINE(c64_cia1_interrupt),
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
@@ -223,7 +220,6 @@ const mos6526_interface c64_ntsc_cia1 =
const mos6526_interface c64_pal_cia1 =
{
- 10, /* 1/10 second */
DEVCB_LINE(c64_cia1_interrupt),
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
@@ -255,14 +251,14 @@ WRITE8_HANDLER( c64_write_io )
legacy_c64_state *state = space->machine().driver_data<legacy_c64_state>();
device_t *cia_0 = space->machine().device("cia_0");
device_t *cia_1 = space->machine().device("cia_1");
- device_t *sid = space->machine().device("sid6581");
+ sid6581_device *sid = space->machine().device<sid6581_device>("sid6581");
device_t *vic2 = space->machine().device("vic2");
state->m_io_mirror[offset] = data;
if (offset < 0x400)
vic2_port_w(vic2, offset & 0x3ff, data);
else if (offset < 0x800)
- sid6581_w(sid, offset & 0x3ff, data);
+ sid->write(*space, offset & 0x3ff, data);
else if (offset < 0xc00)
state->m_colorram[offset & 0x3ff] = data | 0xf0;
else if (offset < 0xd00)
@@ -294,14 +290,14 @@ READ8_HANDLER( c64_read_io )
legacy_c64_state *state = space->machine().driver_data<legacy_c64_state>();
device_t *cia_0 = space->machine().device("cia_0");
device_t *cia_1 = space->machine().device("cia_1");
- device_t *sid = space->machine().device("sid6581");
+ sid6581_device *sid = space->machine().device<sid6581_device>("sid6581");
device_t *vic2 = space->machine().device("vic2");
if (offset < 0x400)
return vic2_port_r(vic2, offset & 0x3ff);
else if (offset < 0x800)
- return sid6581_r(sid, offset & 0x3ff);
+ return sid->read(*space, offset & 0x3ff);
else if (offset < 0xc00)
return state->m_colorram[offset & 0x3ff];
diff --git a/src/mess/machine/c65.c b/src/mess/machine/c65.c
index e5b908b4300..03faf452fcc 100644
--- a/src/mess/machine/c65.c
+++ b/src/mess/machine/c65.c
@@ -130,22 +130,8 @@ void c65_vic_interrupt( running_machine &machine, int level )
#endif
}
-const mos6526_interface c65_ntsc_cia0 =
+const mos6526_interface c65_cia0 =
{
- 60,
- DEVCB_LINE(c65_cia0_interrupt),
- DEVCB_NULL, /* pc_func */
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_HANDLER(c65_cia0_port_a_r),
- DEVCB_NULL,
- DEVCB_HANDLER(c65_cia0_port_b_r),
- DEVCB_HANDLER(c65_cia0_port_b_w)
-};
-
-const mos6526_interface c65_pal_cia0 =
-{
- 50,
DEVCB_LINE(c65_cia0_interrupt),
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
@@ -210,22 +196,8 @@ static WRITE_LINE_DEVICE_HANDLER( c65_cia1_interrupt )
c65_nmi(device->machine());
}
-const mos6526_interface c65_ntsc_cia1 =
-{
- 60,
- DEVCB_LINE(c65_cia1_interrupt),
- DEVCB_NULL, /* pc_func */
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_HANDLER(c65_cia1_port_a_r),
- DEVCB_HANDLER(c65_cia1_port_a_w),
- DEVCB_NULL,
- DEVCB_NULL
-};
-
-const mos6526_interface c65_pal_cia1 =
+const mos6526_interface c65_cia1 =
{
- 50,
DEVCB_LINE(c65_cia1_interrupt),
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
@@ -674,8 +646,8 @@ static WRITE8_HANDLER( c65_ram_expansion_w )
static WRITE8_HANDLER( c65_write_io )
{
- device_t *sid_0 = space->machine().device("sid_r");
- device_t *sid_1 = space->machine().device("sid_l");
+ sid6581_device *sid_0 = space->machine().device<sid6581_device>("sid_r");
+ sid6581_device *sid_1 = space->machine().device<sid6581_device>("sid_l");
device_t *vic3 = space->machine().device("vic3");
switch (offset & 0xf00)
@@ -698,9 +670,9 @@ static WRITE8_HANDLER( c65_write_io )
break;
case 0x400:
if (offset<0x420) /* maybe 0x20 */
- sid6581_w(sid_0, offset & 0x3f, data);
+ sid_0->write(*space, offset & 0x3f, data);
else if (offset<0x440)
- sid6581_w(sid_1, offset & 0x3f, data);
+ sid_1->write(*space, offset & 0x3f, data);
else
DBG_LOG(space->machine(), 1, "io write", ("%.3x %.2x\n", offset, data));
break;
@@ -738,8 +710,8 @@ static WRITE8_HANDLER( c65_write_io_dc00 )
static READ8_HANDLER( c65_read_io )
{
- device_t *sid_0 = space->machine().device("sid_r");
- device_t *sid_1 = space->machine().device("sid_l");
+ sid6581_device *sid_0 = space->machine().device<sid6581_device>("sid_r");
+ sid6581_device *sid_1 = space->machine().device<sid6581_device>("sid_l");
device_t *vic3 = space->machine().device("vic3");
switch (offset & 0xf00)
@@ -763,9 +735,9 @@ static READ8_HANDLER( c65_read_io )
break;
case 0x400:
if (offset < 0x420)
- return sid6581_r(sid_0, offset & 0x3f);
+ return sid_0->read(*space, offset & 0x3f);
if (offset < 0x440)
- return sid6581_r(sid_1, offset & 0x3f);
+ return sid_1->read(*space, offset & 0x3f);
DBG_LOG(space->machine(), 1, "io read", ("%.3x\n", offset));
break;
case 0x500:
diff --git a/src/mess/machine/cbmb.c b/src/mess/machine/cbmb.c
index 028e884ffa0..0f3d61f77c6 100644
--- a/src/mess/machine/cbmb.c
+++ b/src/mess/machine/cbmb.c
@@ -259,7 +259,6 @@ WRITE_LINE_DEVICE_HANDLER( cbmb_irq )
const mos6526_interface cbmb_cia =
{
- 60,
DEVCB_DEVICE_LINE("tpi6525_0", tpi6525_i2_w),
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
diff --git a/src/mess/machine/cbmipt.c b/src/mess/machine/cbmipt.c
index 712c82d5db8..7303b25d57a 100644
--- a/src/mess/machine/cbmipt.c
+++ b/src/mess/machine/cbmipt.c
@@ -408,10 +408,6 @@ INPUT_PORTS_START( c128_special )
PORT_CONFNAME( 0x10, 0x10, "40 80 Display (switch) (active after a rebooting)")
PORT_CONFSETTING( 0x00, "40 Columns (DIN/TV)")
PORT_CONFSETTING( 0x10, "80 Columns (RGBI)")
- PORT_CONFNAME( 0x06, 0x00, "Main Memory / MMU Version")
- PORT_CONFSETTING( 0x00, "128 KByte" )
- PORT_CONFSETTING( 0x02, "256 KByte" )
- PORT_CONFSETTING( 0x04, "1024 KByte" )
INPUT_PORTS_END
diff --git a/src/mess/machine/mos8722.c b/src/mess/machine/mos8722.c
index cb8b77c54cc..0c1cf2ec6cd 100644
--- a/src/mess/machine/mos8722.c
+++ b/src/mess/machine/mos8722.c
@@ -55,7 +55,7 @@ enum
#define CR_ROM_LO BIT(m_reg[CR], 1)
#define CR_ROM_MID ((m_reg[CR] >> 2) & 0x03)
#define CR_ROM_HI ((m_reg[CR] >> 4) & 0x03)
-#define CR_A16 BIT(m_reg[CR], 6)
+#define CR_RAM ((m_reg[CR] >> 6) & 0x03)
// mode configuration register
@@ -68,17 +68,29 @@ enum
// RAM configuration register
+static const offs_t RCR_BOTTOM_ADDRESS[4] = { 0x0400, 0x1000, 0x0400, 0x1000 };
+static const offs_t RCR_TOP_ADDRESS[4] = { 0xf000, 0xf000, 0xe000, 0xc000 };
+
enum
{
- RCR_STATUS_NO = 0,
- RCR_STATUS_BOTTOM,
- RCR_STATUS_TOP,
- RCR_STATUS_BOTH
+ RCR_SHARE_1K = 0,
+ RCR_SHARE_4K,
+ RCR_SHARE_8K,
+ RCR_SHARE_16K
};
#define RCR_SHARE (m_reg[RCR] & 0x03)
-#define RCR_STATUS ((m_reg[RCR] >> 2) & 0x03)
-#define RCR_A16 BIT(m_reg[RCR], 6)
+#define RCR_BOTTOM BIT(m_reg[RCR], 2)
+#define RCR_TOP BIT(m_reg[RCR], 3)
+#define RCR_VA16 BIT(m_reg[RCR], 6)
+
+
+// page 0 pointer register
+#define P0H_A16 BIT(m_reg[P0H], 0)
+
+
+// page 1 pointer register
+#define P1H_A16 BIT(m_reg[P1H], 0)
@@ -149,6 +161,13 @@ void mos8722_device::device_start()
void mos8722_device::device_reset()
{
+ for (int i = 0; i < 12; i++)
+ {
+ m_reg[i] = 0;
+ }
+
+ m_p0l_written = false;
+ m_p1l_written = false;
}
@@ -156,13 +175,35 @@ void mos8722_device::device_reset()
// read - register read
//-------------------------------------------------
-READ8_MEMBER( mos8722_device::read )
+UINT8 mos8722_device::read(offs_t offset, UINT8 data)
{
- UINT8 data = 0;
-
if (!MCR_C64)
{
-
+ if (!CR_IO && offset >= 0xd500 && offset < 0xd50c)
+ {
+ switch (offset & 0x0f)
+ {
+ case MCR:
+ data = m_reg[MCR] & 0x49;
+
+ data |= m_in_game_func() << 4;
+ data |= m_in_exrom_func() << 5;
+ data |= m_in_sense40_func() << 7;
+ break;
+
+ case VR:
+ data = 0x20;
+ break;
+
+ default:
+ data = m_reg[offset & 0x0f];
+ break;
+ }
+ }
+ else if (offset == 0xff00)
+ {
+ return m_reg[CR];
+ }
}
return data;
@@ -177,7 +218,47 @@ WRITE8_MEMBER( mos8722_device::write )
{
if (!MCR_C64)
{
-
+ if (!CR_IO && offset >= 0xd500 && offset < 0xd50c)
+ {
+ m_reg[offset & 0x0f] = data;
+
+ switch (offset & 0x0f)
+ {
+ case MCR:
+ m_out_z80en_func(MCR_8500);
+ m_out_fsdir_func(MCR_FSDIR);
+ break;
+
+ case P0L:
+ m_p0l_written = true;
+ break;
+
+ case P0H:
+ m_p0l_written = false;
+ break;
+
+ case P1L:
+ m_p1l_written = true;
+ break;
+
+ case P1H:
+ m_p1l_written = false;
+ break;
+ }
+ }
+ else if (offset >= 0xff00 && offset < 0xff05)
+ {
+ switch (offset & 0x0f)
+ {
+ case CR:
+ m_reg[CR] = data;
+ break;
+
+ default:
+ m_reg[CR] = m_reg[offset & 0x0f];
+ break;
+ }
+ }
}
}
@@ -196,20 +277,97 @@ READ_LINE_MEMBER( mos8722_device::fsdir_r )
// ta_r - translated address read
//-------------------------------------------------
-offs_t mos8722_device::ta_r(offs_t offset, int aec, int *ms0, int *ms1, int *ms2, int *ms3)
+offs_t mos8722_device::ta_r(offs_t offset, int aec, int *ms0, int *ms1, int *ms2, int *ms3, int *cas0, int *cas1)
{
offs_t ta = offset;
- if (aec)
+ if (!MCR_C64)
{
- if (MCR_C64)
+ *ms0 = 1;
+ *ms1 = 1;
+ *ms2 = CR_IO;
+
+ if (offset < 0x1000 && !MCR_8500)
+ {
+ ta = 0xd000 | (offset & 0xfff);
+
+ *ms0 = 0;
+ *ms1 = 0;
+ }
+ else if (offset >= 0x4000 && offset < 0x8000)
+ {
+ *ms0 = CR_ROM_LO;
+ *ms1 = CR_ROM_LO;
+ }
+ else if (offset >= 0x8000 && offset < 0xc000)
+ {
+ *ms0 = BIT(CR_ROM_MID, 0);
+ *ms1 = BIT(CR_ROM_MID, 1);
+ }
+ else if (offset >= 0xc000)
{
- *ms0 = 1;
- *ms1 = 1;
+ *ms0 = BIT(CR_ROM_HI, 0);
+ *ms1 = BIT(CR_ROM_HI, 1);
}
- *ms3 = !MCR_C64;
+ if (*ms0 == 1 && *ms1 == 1)
+ {
+ if (aec)
+ {
+ *cas0 = BIT(CR_RAM, 0);
+ *cas1 = BIT(CR_RAM, 1);
+
+ if (offset < 0x0100)
+ {
+ if (m_p0l_written && m_reg[P0L])
+ {
+ ta = (m_reg[P0L] << 8) | (offset & 0xff);
+
+ *cas0 = P0H_A16 ? 1 : 0;
+ *cas1 = P0H_A16 ? 0 : 1;
+ }
+ }
+ else if (offset < 0x0200)
+ {
+ if (m_p1l_written && m_reg[P1L])
+ {
+ ta = (m_reg[P1L] << 8) | (offset & 0xff);
+
+ *cas0 = P1H_A16 ? 1 : 0;
+ *cas1 = P1H_A16 ? 0 : 1;
+ }
+ }
+
+ if ((RCR_BOTTOM && offset < RCR_BOTTOM_ADDRESS[RCR_SHARE]) ||
+ (RCR_TOP && offset >= RCR_TOP_ADDRESS[RCR_SHARE]))
+ {
+ *cas0 = 0;
+ *cas1 = 1;
+ }
+ }
+ else
+ {
+ *cas0 = RCR_VA16 ? 1 : 0;
+ *cas1 = RCR_VA16 ? 0 : 1;
+ }
+ }
+ else
+ {
+ *cas0 = 1;
+ *cas1 = 1;
+ }
}
+ else
+ {
+ *ms0 = 1;
+ *ms1 = 1;
+ *ms2 = 1;
+
+ *cas0 = 0;
+ *cas1 = 1;
+ }
+
+ *ms3 = !MCR_C64;
return ta;
}
diff --git a/src/mess/machine/mos8722.h b/src/mess/machine/mos8722.h
index e9b56b51c34..1e7ce42006d 100644
--- a/src/mess/machine/mos8722.h
+++ b/src/mess/machine/mos8722.h
@@ -82,12 +82,12 @@ public:
// construction/destruction
mos8722_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
- DECLARE_READ8_MEMBER( read );
+ UINT8 read(offs_t offset, UINT8 data);
DECLARE_WRITE8_MEMBER( write );
DECLARE_READ_LINE_MEMBER( fsdir_r );
- offs_t ta_r(offs_t offset, int aec, int *ms0, int *ms1, int *ms2, int *ms3);
+ offs_t ta_r(offs_t offset, int aec, int *ms0, int *ms1, int *ms2, int *ms3, int *cas0, int *cas1);
protected:
// device-level overrides
@@ -103,6 +103,9 @@ private:
devcb_resolved_read_line m_in_sense40_func;
UINT8 m_reg[10];
+
+ bool m_p0l_written;
+ bool m_p1l_written;
};
diff --git a/src/mess/machine/plus4_sid.c b/src/mess/machine/plus4_sid.c
index 2e943312559..40dc736f7c2 100644
--- a/src/mess/machine/plus4_sid.c
+++ b/src/mess/machine/plus4_sid.c
@@ -141,7 +141,7 @@ UINT8 plus4_sid_cartridge_device::plus4_cd_r(address_space &space, offs_t offset
{
if ((offset >= 0xfe80 && offset < 0xfea0) || (offset >= 0xfd40 && offset < 0xfd60))
{
- data = sid6581_r(m_sid, offset & 0x1f);
+ data = m_sid->read(space, offset & 0x1f);
}
else if (offset >= 0xfd80 && offset < 0xfd90)
{
@@ -160,7 +160,7 @@ void plus4_sid_cartridge_device::plus4_cd_w(address_space &space, offs_t offset,
{
if ((offset >= 0xfe80 && offset < 0xfea0) || (offset >= 0xfd40 && offset < 0xfd60))
{
- sid6581_w(m_sid, offset & 0x1f, data);
+ m_sid->write(space, offset & 0x1f, data);
}
}
diff --git a/src/mess/machine/plus4_sid.h b/src/mess/machine/plus4_sid.h
index b578d0f1de4..5175f1c853e 100644
--- a/src/mess/machine/plus4_sid.h
+++ b/src/mess/machine/plus4_sid.h
@@ -51,7 +51,7 @@ protected:
virtual void plus4_breset_w(int state);
private:
- required_device<device_t> m_sid;
+ required_device<sid6581_device> m_sid;
required_device<vcs_control_port_device> m_joy;
};