o2_cart_slot: allow user to configure cart pin b

This commit is contained in:
hap 2024-12-05 02:32:19 +01:00
parent 87882203b3
commit 02187b3825
2 changed files with 62 additions and 42 deletions

View File

@ -27,22 +27,14 @@ DEFINE_DEVICE_TYPE(O2_CART_SLOT, o2_cart_slot_device, "o2_cart_slot", "Odyssey 2
// device_o2_cart_interface - constructor
//-------------------------------------------------
device_o2_cart_interface::device_o2_cart_interface(const machine_config &mconfig, device_t &device)
: device_interface(device, "odyssey2cart")
, m_rom_size(0)
, m_exrom_size(0)
, m_voice_size(0)
{
}
device_o2_cart_interface::device_o2_cart_interface(const machine_config &mconfig, device_t &device) :
device_interface(device, "odyssey2cart"),
m_rom_size(0),
m_exrom_size(0),
m_voice_size(0)
{ }
//-------------------------------------------------
// ~device_o2_cart_interface - destructor
//-------------------------------------------------
device_o2_cart_interface::~device_o2_cart_interface()
{
}
device_o2_cart_interface::~device_o2_cart_interface() { }
//**************************************************************************
@ -53,24 +45,18 @@ device_o2_cart_interface::~device_o2_cart_interface()
// o2_cart_slot_device - constructor
//-------------------------------------------------
o2_cart_slot_device::o2_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, O2_CART_SLOT, tag, owner, clock)
, device_cartrom_image_interface(mconfig, *this)
, device_single_card_slot_interface<device_o2_cart_interface>(mconfig, *this)
, m_type(O2_STD)
, m_cart(nullptr)
, m_b(0)
{
}
o2_cart_slot_device::o2_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
device_t(mconfig, O2_CART_SLOT, tag, owner, clock),
device_cartrom_image_interface(mconfig, *this),
device_single_card_slot_interface<device_o2_cart_interface>(mconfig, *this),
m_type(O2_STD),
m_cart(nullptr),
m_conf(*this, "CONF"),
m_b(0)
{ }
o2_cart_slot_device::~o2_cart_slot_device() { }
//-------------------------------------------------
// o2_cart_slot_device - destructor
//-------------------------------------------------
o2_cart_slot_device::~o2_cart_slot_device()
{
}
//-------------------------------------------------
// device_start - device-specific startup
@ -88,8 +74,8 @@ void o2_cart_slot_device::device_start()
struct o2_slot
{
int pcb_id;
const char *slot_option;
int pcb_id;
const char *slot_option;
};
// Here, we take the feature attribute from .xml (i.e. the PCB name) and we assign a unique ID to it
@ -109,11 +95,13 @@ static const o2_slot slot_list[] =
static int o2_get_pcb_id(const char *slot)
{
if (slot)
{
for (auto & elem : slot_list)
{
if (!strcmp(elem.slot_option, slot))
return elem.pcb_id;
}
}
return 0;
}
@ -263,14 +251,42 @@ int o2_cart_slot_device::t0_read()
int o2_cart_slot_device::b_read()
{
int b_user = m_conf->read() & 3;
int b = b_user & 1;
if (m_cart)
{
int b = m_cart->b_read();
const bool override = b != -1;
return override ? b : m_b;
// cartridge may override pin B setting
int b_cart = m_cart->b_read();
if (b_cart >= 0)
b = b_cart;
else if (b_user & 2)
b = m_b;
}
else
return 0;
return b;
}
/*-------------------------------------------------
input ports
-------------------------------------------------*/
// Pin B only affects Videopac+ consoles: cartridges can decide whether to mask display edges or not,
// by wiring the pin to either VCC or GND.
static INPUT_PORTS_START( o2_cart_slot )
PORT_START("CONF")
PORT_CONFNAME( 0x03, 0x02, "Cartridge Pin B" )
PORT_CONFSETTING( 0x02, "Auto" ) // get setting from softwarelist
PORT_CONFSETTING( 0x00, "0" )
PORT_CONFSETTING( 0x01, "1" )
INPUT_PORTS_END
ioport_constructor o2_cart_slot_device::device_input_ports() const
{
return INPUT_PORTS_NAME(o2_cart_slot);
}

View File

@ -95,14 +95,14 @@ protected:
// ======================> o2_cart_slot_device
class o2_cart_slot_device : public device_t,
public device_cartrom_image_interface,
public device_single_card_slot_interface<device_o2_cart_interface>
public device_cartrom_image_interface,
public device_single_card_slot_interface<device_o2_cart_interface>
{
public:
// construction/destruction
template <typename T>
o2_cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
: o2_cart_slot_device(mconfig, tag, owner, 0)
o2_cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt) :
o2_cart_slot_device(mconfig, tag, owner, 0)
{
option_reset();
opts(*this);
@ -143,9 +143,13 @@ public:
protected:
// device_t implementation
virtual void device_start() override ATTR_COLD;
virtual ioport_constructor device_input_ports() const override ATTR_COLD;
private:
int m_type;
device_o2_cart_interface* m_cart;
required_ioport m_conf;
int m_b;
};