c128: PARTNER 128 WIP. (nw)

This commit is contained in:
Curt Coder 2015-08-14 19:02:08 +03:00
parent bf047e7c03
commit 43f506316f
7 changed files with 252 additions and 88 deletions

View File

@ -167,7 +167,7 @@ Missing dumps:
<feature name="game" value="1" />
<feature name="exrom" value="1" />
<dataarea name="romh" size="0x4000">
<dataarea name="roml" size="0x4000">
<rom name="partner 128" size="0x4000" crc="686a6881" sha1="53d4bcf7aff40f1642bc143626b63beb3c8478dc" offset="0" />
</dataarea>
</part>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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