diff --git a/hash/c128_cart.xml b/hash/c128_cart.xml
index 8615198fb1b..37793234d7f 100644
--- a/hash/c128_cart.xml
+++ b/hash/c128_cart.xml
@@ -167,7 +167,7 @@ Missing dumps:
-
+
diff --git a/src/emu/bus/c64/c128_partner.c b/src/emu/bus/c64/c128_partner.c
index 07848e1c7d9..2a46b90cd3e 100644
--- a/src/emu/bus/c64/c128_partner.c
+++ b/src/emu/bus/c64/c128_partner.c
@@ -2,29 +2,29 @@
// copyright-holders:Curt Coder
/**********************************************************************
- Timeworks PARTNER 128 cartridge emulation
+ Timeworks PARTNER 128 cartridge emulation
**********************************************************************/
/*
- PCB Layout
- ----------
+ PCB Layout
+ ----------
- |---------------|
- |LS74 SW CN|
- |LS09 LS273|
- |LS139 RAM |
- |LS133 |
- | LS240 |
- |LS33 ROM |
- |LS09 |
- |||||||||||||||
+ |---------------|
+ |LS74 SW * |
+ |LS09 LS273|
+ |LS139 RAM |
+ |LS133 |
+ | LS240 |
+ |LS33 ROM |
+ |LS09 |
+ |||||||||||||||
- ROM - Toshiba TMM24128AP 16Kx8 EPROM (blank label)
- RAM - Sony CXK5864PN-15L 8Kx8 SRAM
- SW - push button switch
- CN - lead out to joystick port dongle
+ ROM - Toshiba TMM24128AP 16Kx8 EPROM (blank label)
+ RAM - Sony CXK5864PN-15L 8Kx8 SRAM
+ SW - push button switch
+ * - solder point for joystick port dongle
*/
@@ -45,6 +45,7 @@ const device_type C128_PARTNER = &device_creator;
WRITE_LINE_MEMBER( partner128_t::nmi_w )
{
+ m_ls74_d1 = state;
}
static INPUT_PORTS_START( c128_partner )
@@ -75,8 +76,14 @@ ioport_constructor partner128_t::device_input_ports() const
partner128_t::partner128_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, C128_PARTNER, "PARTNER 128", tag, owner, clock, "c128_partner", __FILE__),
device_c64_expansion_card_interface(mconfig, *this),
- device_vcs_control_port_interface(mconfig, *this),
- m_ram(*this, "ram")
+ //device_vcs_control_port_interface(mconfig, *this),
+ m_ram(*this, "ram"),
+ m_ram_a12_a7(0),
+ m_ls74_cd(0),
+ m_ls74_d1(0),
+ m_ls74_q1(0),
+ m_ls74_q2(0),
+ m_joyb2(0)
{
}
@@ -89,6 +96,14 @@ void partner128_t::device_start()
{
// allocate memory
m_ram.allocate(0x2000);
+
+ // state saving
+ save_item(NAME(m_ram_a12_a7));
+ save_item(NAME(m_ls74_cd));
+ save_item(NAME(m_ls74_d1));
+ save_item(NAME(m_ls74_q1));
+ save_item(NAME(m_ls74_q2));
+ save_item(NAME(m_joyb2));
}
@@ -98,6 +113,13 @@ void partner128_t::device_start()
void partner128_t::device_reset()
{
+ m_ram_a12_a7 = 0;
+
+ m_ls74_cd = 0;
+ m_ls74_q1 = 0;
+ m_ls74_q2 = 0;
+
+ nmi_w(CLEAR_LINE);
}
@@ -107,6 +129,30 @@ void partner128_t::device_reset()
UINT8 partner128_t::c64_cd_r(address_space &space, offs_t offset, UINT8 data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
+ if (!roml)
+ {
+ data = m_roml[offset & 0x3fff];
+ }
+
+ if (!io1)
+ {
+ if (BIT(offset, 7))
+ {
+ data = m_roml[offset & 0x3fff];
+
+ m_ls74_q1 = m_ls74_d1;
+ }
+ else
+ {
+ data = m_ram[(m_ram_a12_a7 << 7) | (offset & 0x7f)];
+ }
+ }
+
+ if (m_ls74_q2 && ((offset & 0xff3a) == 0xff3a))
+ {
+ data = 0x21;
+ }
+
return data;
}
@@ -117,6 +163,47 @@ UINT8 partner128_t::c64_cd_r(address_space &space, offs_t offset, UINT8 data, in
void partner128_t::c64_cd_w(address_space &space, offs_t offset, UINT8 data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
+ if (!io1)
+ {
+ if (BIT(offset, 7))
+ {
+ /*
+
+ bit description
+
+ 0 RAM A7
+ 1 RAM A8
+ 2 RAM A9
+ 3 RAM A10
+ 4 RAM A11
+ 5 RAM A12
+ 6 LS74 1Cd,2Cd
+ 7 N/C
+
+ */
+
+ m_ram_a12_a7 = data & 0x3f;
+
+ m_ls74_cd = BIT(data, 6);
+
+ if (!m_ls74_cd)
+ {
+ m_ls74_q1 = 0;
+ m_ls74_q2 = 0;
+
+ nmi_w(CLEAR_LINE);
+ }
+ }
+ else
+ {
+ m_ram[(m_ram_a12_a7 << 7) | (offset & 0x7f)] = data;
+ }
+ }
+
+ if (sphi2 && ((offset & 0xfff0) == 0xd600))
+ {
+ m_ram[(m_ram_a12_a7 << 7) | (offset & 0x7f)] = data;
+ }
}
@@ -128,3 +215,22 @@ int partner128_t::c64_game_r(offs_t offset, int sphi2, int ba, int rw)
{
return 1;
}
+
+
+//-------------------------------------------------
+// vcs_joy_w - joystick write
+//-------------------------------------------------
+
+void partner128_t::vcs_joy_w(UINT8 data)
+{
+ int joya2 = BIT(data, 2);
+
+ if (!m_joyb2 && joya2)
+ {
+ m_ls74_q2 = m_ls74_q1;
+
+ nmi_w(m_ls74_q2 ? ASSERT_LINE : CLEAR_LINE);
+
+ m_joyb2 = joya2;
+ }
+}
diff --git a/src/emu/bus/c64/c128_partner.h b/src/emu/bus/c64/c128_partner.h
index b91c92026dd..35b1d3ea0a4 100644
--- a/src/emu/bus/c64/c128_partner.h
+++ b/src/emu/bus/c64/c128_partner.h
@@ -24,8 +24,8 @@
// ======================> partner128_t
class partner128_t : public device_t,
- public device_c64_expansion_card_interface,
- public device_vcs_control_port_interface
+ public device_c64_expansion_card_interface
+ //public device_vcs_control_port_interface
{
public:
// construction/destruction
@@ -47,9 +47,17 @@ protected:
virtual int c64_game_r(offs_t offset, int sphi2, int ba, int rw);
// device_vcs_control_port_interface overrides
+ virtual void vcs_joy_w(UINT8 data);
private:
optional_shared_ptr m_ram;
+
+ int m_ram_a12_a7;
+ int m_ls74_cd;
+ int m_ls74_d1;
+ int m_ls74_q1;
+ int m_ls74_q2;
+ int m_joyb2;
};
diff --git a/src/mess/drivers/c128.c b/src/mess/drivers/c128.c
index 9ae7e3372ab..abe3f7bde8b 100644
--- a/src/mess/drivers/c128.c
+++ b/src/mess/drivers/c128.c
@@ -963,11 +963,11 @@ READ8_MEMBER( c128_state::cia1_pa_r )
bit description
- PA0 COL0, JOY B0
- PA1 COL1, JOY B1
- PA2 COL2, JOY B2
- PA3 COL3, JOY B3
- PA4 COL4, BTNB
+ PA0 COL0, JOYB0
+ PA1 COL1, JOYB1
+ PA2 COL2, JOYB2
+ PA3 COL3, JOYB3
+ PA4 COL4, FBTNB
PA5 COL5
PA6 COL6
PA7 COL7
@@ -1005,20 +1005,40 @@ READ8_MEMBER( c128_state::cia1_pa_r )
return data;
}
+WRITE8_MEMBER( c128_state::cia1_pa_w )
+{
+ /*
+
+ bit description
+
+ PA0 COL0, JOYB0
+ PA1 COL1, JOYB1
+ PA2 COL2, JOYB2
+ PA3 COL3, JOYB3
+ PA4 COL4, FBTNB
+ PA5 COL5
+ PA6 COL6
+ PA7 COL7
+
+ */
+
+ m_joy2->joy_w(data & 0x1f);
+}
+
READ8_MEMBER( c128_state::cia1_pb_r )
{
/*
bit description
- PB0 JOY A0
- PB1 JOY A1
- PB2 JOY A2
- PB3 JOY A3
- PB4 BTNA/_LP
- PB5
- PB6
- PB7
+ PB0 ROW0, JOYA0
+ PB1 ROW1, JOYA1
+ PB2 ROW2, JOYA2
+ PB3 ROW3, JOYA3
+ PB4 ROW4, FBTNA, _LP
+ PB5 ROW5
+ PB6 ROW6
+ PB7 ROW7
*/
@@ -1055,17 +1075,19 @@ WRITE8_MEMBER( c128_state::cia1_pb_w )
bit description
- PB0 ROW0
- PB1 ROW1
- PB2 ROW2
- PB3 ROW3
- PB4 ROW4
+ PB0 ROW0, JOYA0
+ PB1 ROW1, JOYA1
+ PB2 ROW2, JOYA2
+ PB3 ROW3, JOYA3
+ PB4 ROW4, FBTNA, _LP
PB5 ROW5
PB6 ROW6
PB7 ROW7
*/
+ m_joy1->joy_w(data & 0x1f);
+
m_vic->lp_w(BIT(data, 4));
}
@@ -1487,6 +1509,7 @@ static MACHINE_CONFIG_START( ntsc, c128_state )
MCFG_MOS6526_CNT_CALLBACK(WRITELINE(c128_state, cia1_cnt_w))
MCFG_MOS6526_SP_CALLBACK(WRITELINE(c128_state, cia1_sp_w))
MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(c128_state, cia1_pa_r))
+ MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(c128_state, cia1_pa_w))
MCFG_MOS6526_PB_INPUT_CALLBACK(READ8(c128_state, cia1_pb_r))
MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(c128_state, cia1_pb_w))
MCFG_DEVICE_ADD(MOS6526_2_TAG, MOS6526, XTAL_14_31818MHz*2/3.5/8)
@@ -1659,6 +1682,7 @@ static MACHINE_CONFIG_START( pal, c128_state )
MCFG_MOS6526_CNT_CALLBACK(WRITELINE(c128_state, cia1_cnt_w))
MCFG_MOS6526_SP_CALLBACK(WRITELINE(c128_state, cia1_sp_w))
MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(c128_state, cia1_pa_r))
+ MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(c128_state, cia1_pa_w))
MCFG_MOS6526_PB_INPUT_CALLBACK(READ8(c128_state, cia1_pb_r))
MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(c128_state, cia1_pb_w))
MCFG_DEVICE_ADD(MOS6526_2_TAG, MOS6526, XTAL_17_734472MHz*2/4.5/8)
diff --git a/src/mess/drivers/c64.c b/src/mess/drivers/c64.c
index b65ae1a072a..56aaf5966da 100644
--- a/src/mess/drivers/c64.c
+++ b/src/mess/drivers/c64.c
@@ -625,20 +625,40 @@ READ8_MEMBER( c64_state::cia1_pa_r )
return data;
}
+WRITE8_MEMBER( c64_state::cia1_pa_w )
+{
+ /*
+
+ bit description
+
+ PA0 COL0, JOY B0
+ PA1 COL1, JOY B1
+ PA2 COL2, JOY B2
+ PA3 COL3, JOY B3
+ PA4 COL4, BTNB
+ PA5 COL5
+ PA6 COL6
+ PA7 COL7
+
+ */
+
+ m_joy2->joy_w(data & 0x1f);
+}
+
READ8_MEMBER( c64_state::cia1_pb_r )
{
/*
bit description
- PB0 JOY A0
- PB1 JOY A1
- PB2 JOY A2
- PB3 JOY A3
- PB4 BTNA/_LP
- PB5
- PB6
- PB7
+ PB0 ROW0, JOY A0
+ PB1 ROW1, JOY A1
+ PB2 ROW2, JOY A2
+ PB3 ROW3, JOY A3
+ PB4 ROW4, BTNA, _LP
+ PB5 ROW5
+ PB6 ROW6
+ PB7 ROW7
*/
@@ -671,17 +691,19 @@ WRITE8_MEMBER( c64_state::cia1_pb_w )
bit description
- PB0 ROW0
- PB1 ROW1
- PB2 ROW2
- PB3 ROW3
- PB4 ROW4
+ PB0 ROW0, JOY A0
+ PB1 ROW1, JOY A1
+ PB2 ROW2, JOY A2
+ PB3 ROW3, JOY A3
+ PB4 ROW4, BTNA, _LP
PB5 ROW5
PB6 ROW6
PB7 ROW7
*/
+ m_joy1->joy_w(data & 0x1f);
+
m_vic->lp_w(BIT(data, 4));
}
@@ -1289,6 +1311,7 @@ static MACHINE_CONFIG_START( pal, c64_state )
MCFG_MOS6526_CNT_CALLBACK(DEVWRITELINE(PET_USER_PORT_TAG, pet_user_port_device, write_4))
MCFG_MOS6526_SP_CALLBACK(DEVWRITELINE(PET_USER_PORT_TAG, pet_user_port_device, write_5))
MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(c64_state, cia1_pa_r))
+ MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(c64_state, cia1_pa_w))
MCFG_MOS6526_PB_INPUT_CALLBACK(READ8(c64_state, cia1_pb_r))
MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(c64_state, cia1_pb_w))
MCFG_DEVICE_ADD(MOS6526_2_TAG, MOS6526, XTAL_17_734472MHz/18)
@@ -1423,6 +1446,7 @@ static MACHINE_CONFIG_START( pal_gs, c64gs_state )
MCFG_MOS6526_CNT_CALLBACK(DEVWRITELINE(PET_USER_PORT_TAG, pet_user_port_device, write_4))
MCFG_MOS6526_SP_CALLBACK(DEVWRITELINE(PET_USER_PORT_TAG, pet_user_port_device, write_5))
MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(c64gs_state, cia1_pa_r))
+ MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(c64_state, cia1_pa_w))
MCFG_MOS6526_PB_INPUT_CALLBACK(READ8(c64gs_state, cia1_pb_r))
MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(c64_state, cia1_pb_w))
MCFG_DEVICE_ADD(MOS6526_2_TAG, MOS6526, XTAL_17_734472MHz/18)
diff --git a/src/mess/includes/c128.h b/src/mess/includes/c128.h
index 0a1ca6c9cb8..c32b2afd726 100644
--- a/src/mess/includes/c128.h
+++ b/src/mess/includes/c128.h
@@ -171,6 +171,7 @@ public:
DECLARE_WRITE_LINE_MEMBER( cia1_cnt_w );
DECLARE_WRITE_LINE_MEMBER( cia1_sp_w );
DECLARE_READ8_MEMBER( cia1_pa_r );
+ DECLARE_WRITE8_MEMBER( cia1_pa_w );
DECLARE_READ8_MEMBER( cia1_pb_r );
DECLARE_WRITE8_MEMBER( cia1_pb_w );
diff --git a/src/mess/includes/c64.h b/src/mess/includes/c64.h
index a9adca1291f..787fe5a6f60 100644
--- a/src/mess/includes/c64.h
+++ b/src/mess/includes/c64.h
@@ -34,42 +34,42 @@
class c64_state : public driver_device
{
public:
- c64_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, M6510_TAG),
- m_pla(*this, PLA_TAG),
- m_vic(*this, MOS6569_TAG),
- m_sid(*this, MOS6581_TAG),
- 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, C64_EXPANSION_SLOT_TAG),
- m_user(*this, PET_USER_PORT_TAG),
- m_ram(*this, RAM_TAG),
- m_cassette(*this, PET_DATASSETTE_PORT_TAG),
- m_color_ram(*this, "color_ram"),
- m_row0(*this, "ROW0"),
- m_row1(*this, "ROW1"),
- m_row2(*this, "ROW2"),
- m_row3(*this, "ROW3"),
- m_row4(*this, "ROW4"),
- m_row5(*this, "ROW5"),
- m_row6(*this, "ROW6"),
- m_row7(*this, "ROW7"),
- m_lock(*this, "LOCK"),
- m_loram(1),
- m_hiram(1),
- m_charen(1),
- m_va14(1),
- m_va15(1),
- m_restore(1),
- m_cia1_irq(CLEAR_LINE),
- m_cia2_irq(CLEAR_LINE),
- m_vic_irq(CLEAR_LINE),
- m_exp_irq(CLEAR_LINE),
- m_exp_nmi(CLEAR_LINE)
+ c64_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, M6510_TAG),
+ m_pla(*this, PLA_TAG),
+ m_vic(*this, MOS6569_TAG),
+ m_sid(*this, MOS6581_TAG),
+ 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, C64_EXPANSION_SLOT_TAG),
+ m_user(*this, PET_USER_PORT_TAG),
+ m_ram(*this, RAM_TAG),
+ m_cassette(*this, PET_DATASSETTE_PORT_TAG),
+ m_color_ram(*this, "color_ram"),
+ m_row0(*this, "ROW0"),
+ m_row1(*this, "ROW1"),
+ m_row2(*this, "ROW2"),
+ m_row3(*this, "ROW3"),
+ m_row4(*this, "ROW4"),
+ m_row5(*this, "ROW5"),
+ m_row6(*this, "ROW6"),
+ m_row7(*this, "ROW7"),
+ m_lock(*this, "LOCK"),
+ m_loram(1),
+ m_hiram(1),
+ m_charen(1),
+ m_va14(1),
+ m_va15(1),
+ m_restore(1),
+ m_cia1_irq(CLEAR_LINE),
+ m_cia2_irq(CLEAR_LINE),
+ m_vic_irq(CLEAR_LINE),
+ m_exp_irq(CLEAR_LINE),
+ m_exp_nmi(CLEAR_LINE)
{ }
// ROM
@@ -121,6 +121,7 @@ public:
DECLARE_WRITE_LINE_MEMBER( cia1_irq_w );
DECLARE_READ8_MEMBER( cia1_pa_r );
+ DECLARE_WRITE8_MEMBER( cia1_pa_w );
DECLARE_READ8_MEMBER( cia1_pb_r );
DECLARE_WRITE8_MEMBER( cia1_pb_w );