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