diff options
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 |
commit | be3af47f06821ce44fa7ebd16c026ede804d82bf (patch) | |
tree | b23d5c56e44b0d689a6bd5431e26bfa3cd39d04d /src | |
parent | 7de113e8959929b99676f27f6a9762461c01ef7d (diff) |
(MESS) c128: MMU WIP. (nw)
(MESS) mos6581: Improved interface. (nw)
mos6526: Improved interface. (nw)
Diffstat (limited to 'src')
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; }; |