(MESS) pet: Added user port diagnostic connector. [Curt Coder]

This commit is contained in:
Curt Coder 2014-04-19 20:05:18 +00:00
parent 123dedd41a
commit 6c6b08a833
8 changed files with 186 additions and 40 deletions

2
.gitattributes vendored
View File

@ -1148,6 +1148,8 @@ src/emu/bus/pet/c2n.c svneol=native#text/plain
src/emu/bus/pet/c2n.h svneol=native#text/plain
src/emu/bus/pet/cass.c svneol=native#text/plain
src/emu/bus/pet/cass.h svneol=native#text/plain
src/emu/bus/pet/diag.c svneol=native#text/plain
src/emu/bus/pet/diag.h svneol=native#text/plain
src/emu/bus/pet/diag264_lb_tape.c svneol=native#text/plain
src/emu/bus/pet/diag264_lb_tape.h svneol=native#text/plain
src/emu/bus/pet/exp.c svneol=native#text/plain

View File

@ -448,6 +448,7 @@ BUSOBJS += $(BUSOBJ)/pet/exp.o
BUSOBJS += $(BUSOBJ)/pet/64k.o
BUSOBJS += $(BUSOBJ)/pet/superpet.o
BUSOBJS += $(BUSOBJ)/pet/user.o
BUSOBJS += $(BUSOBJ)/pet/diag.o
BUSOBJS += $(BUSOBJ)/pet/petuja.o
endif

47
src/emu/bus/pet/diag.c Normal file
View File

@ -0,0 +1,47 @@
// license:BSD-3-Clause
// copyright-holders:smf
/**********************************************************************
Commodore PET User Port Diagnostic Connector emulation
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************/
#include "diag.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
const device_type PET_USERPORT_DIAGNOSTIC_CONNECTOR = &device_creator<pet_userport_diagnostic_connector_t>;
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// pet_userport_diagnostic_connector_t - constructor
//-------------------------------------------------
pet_userport_diagnostic_connector_t::pet_userport_diagnostic_connector_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, PET_USERPORT_DIAGNOSTIC_CONNECTOR, "PET Userport Diagnostic Connector", tag, owner, clock, "pet_user_diag", __FILE__),
device_pet_user_port_interface(mconfig, *this)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void pet_userport_diagnostic_connector_t::device_start()
{
output_5(0);
output_e(0);
}

60
src/emu/bus/pet/diag.h Normal file
View File

@ -0,0 +1,60 @@
// license:BSD-3-Clause
// copyright-holders:smf
/**********************************************************************
Commodore PET User Port Diagnostic Connector emulation
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************/
#pragma once
#ifndef __PET_USER_DIAG__
#define __PET_USER_DIAG__
#include "emu.h"
#include "user.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> pet_userport_diagnostic_connector_t
class pet_userport_diagnostic_connector_t : public device_t,
public device_pet_user_port_interface
{
public:
// construction/destruction
pet_userport_diagnostic_connector_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// device_pet_user_port_interface overrides
virtual DECLARE_WRITE_LINE_MEMBER( input_2 ) { output_b(state); }
virtual DECLARE_WRITE_LINE_MEMBER( input_3 ) { output_c(state); }
virtual DECLARE_WRITE_LINE_MEMBER( input_4 ) { output_d(state); }
virtual DECLARE_WRITE_LINE_MEMBER( input_6 ) { output_7(state); output_8(state); }
virtual DECLARE_WRITE_LINE_MEMBER( input_7 ) { output_6(state); output_8(state); }
virtual DECLARE_WRITE_LINE_MEMBER( input_8 ) { output_6(state); output_7(state); }
virtual DECLARE_WRITE_LINE_MEMBER( input_9 ) { output_k(state); }
virtual DECLARE_WRITE_LINE_MEMBER( input_10 ) { output_l(state); }
virtual DECLARE_WRITE_LINE_MEMBER( input_b ) { output_2(state); }
virtual DECLARE_WRITE_LINE_MEMBER( input_c ) { output_3(state); }
virtual DECLARE_WRITE_LINE_MEMBER( input_d ) { output_4(state); }
virtual DECLARE_WRITE_LINE_MEMBER( input_k ) { output_9(state); }
virtual DECLARE_WRITE_LINE_MEMBER( input_l ) { output_10(state); }
protected:
// device-level overrides
virtual void device_start();
};
// device type definition
extern const device_type PET_USERPORT_DIAGNOSTIC_CONNECTOR;
#endif

View File

@ -18,6 +18,7 @@ const device_type PET_USER_PORT = &device_creator<pet_user_port_device>;
pet_user_port_device::pet_user_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, PET_USER_PORT, "PET user port", tag, owner, clock, "pet_user_port", __FILE__),
device_slot_interface(mconfig, *this),
m_2_handler(*this),
m_3_handler(*this),
m_4_handler(*this),
m_5_handler(*this),
@ -25,6 +26,7 @@ pet_user_port_device::pet_user_port_device(const machine_config &mconfig, const
m_7_handler(*this),
m_8_handler(*this),
m_9_handler(*this),
m_10_handler(*this),
m_b_handler(*this),
m_c_handler(*this),
m_d_handler(*this),
@ -46,6 +48,7 @@ void pet_user_port_device::device_config_complete()
void pet_user_port_device::device_start()
{
m_2_handler.resolve_safe();
m_3_handler.resolve_safe();
m_4_handler.resolve_safe();
m_5_handler.resolve_safe();
@ -53,6 +56,7 @@ void pet_user_port_device::device_start()
m_7_handler.resolve_safe();
m_8_handler.resolve_safe();
m_9_handler.resolve_safe();
m_10_handler.resolve_safe();
m_b_handler.resolve_safe();
m_c_handler.resolve_safe();
m_d_handler.resolve_safe();
@ -84,6 +88,7 @@ void pet_user_port_device::device_start()
m_m_handler(1);
}
WRITE_LINE_MEMBER( pet_user_port_device::write_2 ) { if (m_card != NULL) m_card->input_2(state); }
WRITE_LINE_MEMBER( pet_user_port_device::write_3 ) { if (m_card != NULL) m_card->input_3(state); }
WRITE_LINE_MEMBER( pet_user_port_device::write_4 ) { if (m_card != NULL) m_card->input_4(state); }
WRITE_LINE_MEMBER( pet_user_port_device::write_5 ) { if (m_card != NULL) m_card->input_5(state); }
@ -91,6 +96,7 @@ WRITE_LINE_MEMBER( pet_user_port_device::write_6 ) { if (m_card != NULL) m_card-
WRITE_LINE_MEMBER( pet_user_port_device::write_7 ) { if (m_card != NULL) m_card->input_7(state); }
WRITE_LINE_MEMBER( pet_user_port_device::write_8 ) { if (m_card != NULL) m_card->input_8(state); }
WRITE_LINE_MEMBER( pet_user_port_device::write_9 ) { if (m_card != NULL) m_card->input_9(state); }
WRITE_LINE_MEMBER( pet_user_port_device::write_10 ) { if (m_card != NULL) m_card->input_10(state); }
WRITE_LINE_MEMBER( pet_user_port_device::write_b ) { if (m_card != NULL) m_card->input_b(state); }
WRITE_LINE_MEMBER( pet_user_port_device::write_c ) { if (m_card != NULL) m_card->input_c(state); }
WRITE_LINE_MEMBER( pet_user_port_device::write_d ) { if (m_card != NULL) m_card->input_d(state); }
@ -116,8 +122,10 @@ device_pet_user_port_interface::~device_pet_user_port_interface()
}
#include "diag.h"
#include "petuja.h"
SLOT_INTERFACE_START( pet_user_port_cards )
SLOT_INTERFACE("diag", PET_USERPORT_DIAGNOSTIC_CONNECTOR)
SLOT_INTERFACE("petuja", PET_USERPORT_JOYSTICK_ADAPTER)
SLOT_INTERFACE_END

View File

@ -36,6 +36,9 @@
MCFG_DEVICE_ADD(_tag, PET_USER_PORT, 0) \
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
#define MCFG_PET_USER_PORT_2_HANDLER(_devcb) \
devcb = &pet_user_port_device::set_2_handler(*device, DEVCB2_##_devcb);
#define MCFG_PET_USER_PORT_3_HANDLER(_devcb) \
devcb = &pet_user_port_device::set_3_handler(*device, DEVCB2_##_devcb);
@ -57,6 +60,9 @@
#define MCFG_PET_USER_PORT_9_HANDLER(_devcb) \
devcb = &pet_user_port_device::set_9_handler(*device, DEVCB2_##_devcb);
#define MCFG_PET_USER_PORT_10_HANDLER(_devcb) \
devcb = &pet_user_port_device::set_10_handler(*device, DEVCB2_##_devcb);
#define MCFG_PET_USER_PORT_B_HANDLER(_devcb) \
devcb = &pet_user_port_device::set_b_handler(*device, DEVCB2_##_devcb);
@ -100,6 +106,7 @@ class pet_user_port_device : public device_t,
public:
pet_user_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
template<class _Object> static devcb2_base &set_2_handler(device_t &device, _Object object) { return downcast<pet_user_port_device &>(device).m_2_handler.set_callback(object); }
template<class _Object> static devcb2_base &set_3_handler(device_t &device, _Object object) { return downcast<pet_user_port_device &>(device).m_3_handler.set_callback(object); }
template<class _Object> static devcb2_base &set_4_handler(device_t &device, _Object object) { return downcast<pet_user_port_device &>(device).m_4_handler.set_callback(object); }
template<class _Object> static devcb2_base &set_5_handler(device_t &device, _Object object) { return downcast<pet_user_port_device &>(device).m_5_handler.set_callback(object); }
@ -107,6 +114,7 @@ public:
template<class _Object> static devcb2_base &set_7_handler(device_t &device, _Object object) { return downcast<pet_user_port_device &>(device).m_7_handler.set_callback(object); }
template<class _Object> static devcb2_base &set_8_handler(device_t &device, _Object object) { return downcast<pet_user_port_device &>(device).m_8_handler.set_callback(object); }
template<class _Object> static devcb2_base &set_9_handler(device_t &device, _Object object) { return downcast<pet_user_port_device &>(device).m_9_handler.set_callback(object); }
template<class _Object> static devcb2_base &set_10_handler(device_t &device, _Object object) { return downcast<pet_user_port_device &>(device).m_10_handler.set_callback(object); }
template<class _Object> static devcb2_base &set_b_handler(device_t &device, _Object object) { return downcast<pet_user_port_device &>(device).m_b_handler.set_callback(object); }
template<class _Object> static devcb2_base &set_c_handler(device_t &device, _Object object) { return downcast<pet_user_port_device &>(device).m_c_handler.set_callback(object); }
template<class _Object> static devcb2_base &set_d_handler(device_t &device, _Object object) { return downcast<pet_user_port_device &>(device).m_d_handler.set_callback(object); }
@ -118,6 +126,7 @@ public:
template<class _Object> static devcb2_base &set_l_handler(device_t &device, _Object object) { return downcast<pet_user_port_device &>(device).m_l_handler.set_callback(object); }
template<class _Object> static devcb2_base &set_m_handler(device_t &device, _Object object) { return downcast<pet_user_port_device &>(device).m_m_handler.set_callback(object); }
DECLARE_WRITE_LINE_MEMBER( write_2 );
DECLARE_WRITE_LINE_MEMBER( write_3 );
DECLARE_WRITE_LINE_MEMBER( write_4 );
DECLARE_WRITE_LINE_MEMBER( write_5 );
@ -125,6 +134,7 @@ public:
DECLARE_WRITE_LINE_MEMBER( write_7 );
DECLARE_WRITE_LINE_MEMBER( write_8 );
DECLARE_WRITE_LINE_MEMBER( write_9 );
DECLARE_WRITE_LINE_MEMBER( write_10 );
DECLARE_WRITE_LINE_MEMBER( write_b );
DECLARE_WRITE_LINE_MEMBER( write_c );
DECLARE_WRITE_LINE_MEMBER( write_d );
@ -141,6 +151,7 @@ protected:
virtual void device_config_complete();
virtual void device_start();
devcb2_write_line m_2_handler;
devcb2_write_line m_3_handler;
devcb2_write_line m_4_handler;
devcb2_write_line m_5_handler;
@ -148,6 +159,7 @@ protected:
devcb2_write_line m_7_handler;
devcb2_write_line m_8_handler;
devcb2_write_line m_9_handler;
devcb2_write_line m_10_handler;
devcb2_write_line m_b_handler;
devcb2_write_line m_c_handler;
devcb2_write_line m_d_handler;
@ -172,6 +184,7 @@ public:
device_pet_user_port_interface(const machine_config &mconfig, device_t &device);
virtual ~device_pet_user_port_interface();
DECLARE_WRITE_LINE_MEMBER( output_2 ) { m_slot->m_2_handler(state); }
DECLARE_WRITE_LINE_MEMBER( output_3 ) { m_slot->m_3_handler(state); }
DECLARE_WRITE_LINE_MEMBER( output_4 ) { m_slot->m_4_handler(state); }
DECLARE_WRITE_LINE_MEMBER( output_5 ) { m_slot->m_5_handler(state); }
@ -179,6 +192,7 @@ public:
DECLARE_WRITE_LINE_MEMBER( output_7 ) { m_slot->m_7_handler(state); }
DECLARE_WRITE_LINE_MEMBER( output_8 ) { m_slot->m_8_handler(state); }
DECLARE_WRITE_LINE_MEMBER( output_9 ) { m_slot->m_9_handler(state); }
DECLARE_WRITE_LINE_MEMBER( output_10 ) { m_slot->m_10_handler(state); }
DECLARE_WRITE_LINE_MEMBER( output_b ) { m_slot->m_b_handler(state); }
DECLARE_WRITE_LINE_MEMBER( output_c ) { m_slot->m_c_handler(state); }
DECLARE_WRITE_LINE_MEMBER( output_d ) { m_slot->m_d_handler(state); }
@ -191,6 +205,7 @@ public:
DECLARE_WRITE_LINE_MEMBER( output_m ) { m_slot->m_m_handler(state); }
protected:
virtual DECLARE_WRITE_LINE_MEMBER( input_2 ) {}
virtual DECLARE_WRITE_LINE_MEMBER( input_3 ) {}
virtual DECLARE_WRITE_LINE_MEMBER( input_4 ) {}
virtual DECLARE_WRITE_LINE_MEMBER( input_5 ) {}
@ -198,6 +213,7 @@ protected:
virtual DECLARE_WRITE_LINE_MEMBER( input_7 ) {}
virtual DECLARE_WRITE_LINE_MEMBER( input_8 ) {}
virtual DECLARE_WRITE_LINE_MEMBER( input_9 ) {}
virtual DECLARE_WRITE_LINE_MEMBER( input_10 ) {}
virtual DECLARE_WRITE_LINE_MEMBER( input_b ) {}
virtual DECLARE_WRITE_LINE_MEMBER( input_c ) {}
virtual DECLARE_WRITE_LINE_MEMBER( input_d ) {}

View File

@ -921,7 +921,7 @@ READ8_MEMBER( pet_state::pia1_pa_r )
data |= m_ieee->eoi_r() << 6;
// diagnostic jumper
data |= m_exp->diag_r() << 7;
data |= (m_user_diag && m_exp->diag_r()) << 7;
return data;
}
@ -1015,6 +1015,12 @@ WRITE_LINE_MEMBER( pet_state::pia2_irqb_w )
check_interrupts();
}
WRITE_LINE_MEMBER( pet_state::user_diag_w )
{
m_user_diag = state;
}
//**************************************************************************
// VIDEO
@ -1300,6 +1306,7 @@ MACHINE_START_MEMBER( pet_state, pet )
save_item(NAME(m_pia2a_irq));
save_item(NAME(m_pia2b_irq));
save_item(NAME(m_exp_irq));
save_item(NAME(m_user_diag));
}
@ -1499,6 +1506,7 @@ static MACHINE_CONFIG_START( pet, pet_state )
MCFG_PET_EXPANSION_SLOT_DMA_CALLBACKS(READ8(pet_state, read), WRITE8(pet_state, write))
MCFG_PET_USER_PORT_ADD(PET_USER_PORT_TAG, pet_user_port_cards, NULL)
MCFG_PET_USER_PORT_5_HANDLER(WRITELINE(pet_state, user_diag_w))
MCFG_PET_USER_PORT_B_HANDLER(DEVWRITELINE(M6522_TAG, via6522_device, write_ca1))
MCFG_PET_USER_PORT_C_HANDLER(DEVWRITELINE(M6522_TAG, via6522_device, write_pa0))
MCFG_PET_USER_PORT_D_HANDLER(DEVWRITELINE(M6522_TAG, via6522_device, write_pa1))

View File

@ -33,45 +33,46 @@
class pet_state : public driver_device
{
public:
pet_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, M6502_TAG),
m_via(*this, M6522_TAG),
m_pia1(*this, M6520_1_TAG),
m_pia2(*this, M6520_2_TAG),
m_crtc(*this, MC6845_TAG),
m_ieee(*this, IEEE488_TAG),
m_palette(*this, "palette"),
m_cassette(*this, PET_DATASSETTE_PORT_TAG),
m_cassette2(*this, PET_DATASSETTE_PORT2_TAG),
m_exp(*this, PET_EXPANSION_SLOT_TAG),
m_user(*this, PET_USER_PORT_TAG),
m_speaker(*this, "speaker"),
m_ram(*this, RAM_TAG),
m_rom(*this, M6502_TAG),
m_char_rom(*this, "charom"),
m_video_ram(*this, "video_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_row8(*this, "ROW8"),
m_row9(*this, "ROW9"),
m_lock(*this, "LOCK"),
m_key(0),
m_sync(0),
m_graphic(0),
m_blanktv(0),
m_via_irq(CLEAR_LINE),
m_pia1a_irq(CLEAR_LINE),
m_pia1b_irq(CLEAR_LINE),
m_pia2a_irq(CLEAR_LINE),
m_pia2b_irq(CLEAR_LINE),
m_exp_irq(CLEAR_LINE)
pet_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, M6502_TAG),
m_via(*this, M6522_TAG),
m_pia1(*this, M6520_1_TAG),
m_pia2(*this, M6520_2_TAG),
m_crtc(*this, MC6845_TAG),
m_ieee(*this, IEEE488_TAG),
m_palette(*this, "palette"),
m_cassette(*this, PET_DATASSETTE_PORT_TAG),
m_cassette2(*this, PET_DATASSETTE_PORT2_TAG),
m_exp(*this, PET_EXPANSION_SLOT_TAG),
m_user(*this, PET_USER_PORT_TAG),
m_speaker(*this, "speaker"),
m_ram(*this, RAM_TAG),
m_rom(*this, M6502_TAG),
m_char_rom(*this, "charom"),
m_video_ram(*this, "video_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_row8(*this, "ROW8"),
m_row9(*this, "ROW9"),
m_lock(*this, "LOCK"),
m_key(0),
m_sync(0),
m_graphic(0),
m_blanktv(0),
m_via_irq(CLEAR_LINE),
m_pia1a_irq(CLEAR_LINE),
m_pia1b_irq(CLEAR_LINE),
m_pia2a_irq(CLEAR_LINE),
m_pia2b_irq(CLEAR_LINE),
m_exp_irq(CLEAR_LINE),
m_user_diag(1)
{ }
required_device<m6502_device> m_maincpu;
@ -133,6 +134,8 @@ public:
DECLARE_WRITE_LINE_MEMBER( pia2_irqa_w );
DECLARE_WRITE_LINE_MEMBER( pia2_irqb_w );
DECLARE_WRITE_LINE_MEMBER( user_diag_w );
TIMER_DEVICE_CALLBACK_MEMBER( sync_tick );
DECLARE_QUICKLOAD_LOAD_MEMBER( cbm_pet );
@ -179,6 +182,7 @@ public:
int m_pia2a_irq;
int m_pia2b_irq;
int m_exp_irq;
int m_user_diag;
};