diff options
Diffstat (limited to 'src/devices/bus/coco/coco_multi.cpp')
-rw-r--r-- | src/devices/bus/coco/coco_multi.cpp | 59 |
1 files changed, 56 insertions, 3 deletions
diff --git a/src/devices/bus/coco/coco_multi.cpp b/src/devices/bus/coco/coco_multi.cpp index 3b3ec13f0ca..e46d094aa8d 100644 --- a/src/devices/bus/coco/coco_multi.cpp +++ b/src/devices/bus/coco/coco_multi.cpp @@ -70,6 +70,14 @@ #define SLOT3_TAG "slot3" #define SLOT4_TAG "slot4" +#define SWITCH_CONFIG_TAG "switch" + + +//************************************************************************** +// MACROS / CONSTANTS +//************************************************************************** + +static constexpr uint8_t MULTI_SLOT_LOOKUP[] = {0xcc, 0xdd, 0xee, 0xff}; //************************************************************************** // TYPE DEFINITIONS @@ -109,6 +117,8 @@ namespace DECLARE_WRITE_LINE_MEMBER(multi_slot4_halt_w); virtual address_space &cartridge_space() override; + virtual ioport_constructor device_input_ports() const override; + INPUT_CHANGED_MEMBER( switch_changed ); protected: // device-level overrides @@ -124,6 +134,7 @@ namespace // internal state uint8_t m_select; + uint8_t m_block; // internal accessors int active_scs_slot_number() const; @@ -134,6 +145,7 @@ namespace // methods void set_select(uint8_t new_select); + DECLARE_READ8_MEMBER(ff7f_read); DECLARE_WRITE8_MEMBER(ff7f_write); void update_line(int slot_number, line ln); }; @@ -185,6 +197,14 @@ MACHINE_CONFIG_START(coco_multipak_device::device_add_mconfig) MCFG_COCO_CARTRIDGE_HALT_CB(DEVWRITELINE(DEVICE_SELF, coco_multipak_device, multi_slot4_halt_w)) MACHINE_CONFIG_END +INPUT_PORTS_START( coco_multipack ) + PORT_START( SWITCH_CONFIG_TAG ) + PORT_CONFNAME( 0x03, 0x03, "Multi-Pak Slot Switch" ) PORT_CHANGED_MEMBER(DEVICE_SELF, coco_multipak_device, switch_changed, nullptr) + PORT_CONFSETTING( 0x00, "Slot 1" ) + PORT_CONFSETTING( 0x01, "Slot 2" ) + PORT_CONFSETTING( 0x02, "Slot 3" ) + PORT_CONFSETTING( 0x03, "Slot 4" ) +INPUT_PORTS_END //************************************************************************** // GLOBAL VARIABLES @@ -199,13 +219,22 @@ DEFINE_DEVICE_TYPE(COCO_MULTIPAK, coco_multipak_device, "coco_multipack", "CoCo //************************************************************************** //------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor coco_multipak_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( coco_multipack ); +} + +//------------------------------------------------- // coco_multipak_device - constructor //------------------------------------------------- coco_multipak_device::coco_multipak_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, COCO_MULTIPAK, tag, owner, clock) , device_cococart_interface(mconfig, *this) - , m_slots(*this, "slot%u", 1), m_select(0) + , m_slots(*this, "slot%u", 1), m_select(0), m_block(0) { } @@ -217,13 +246,15 @@ coco_multipak_device::coco_multipak_device(const machine_config &mconfig, const void coco_multipak_device::device_start() { // install $FF7F handler - install_write_handler(0xFF7F, 0xFF7F, write8_delegate(FUNC(coco_multipak_device::ff7f_write), this)); + install_readwrite_handler(0xFF7F, 0xFF7F, read8_delegate(FUNC(coco_multipak_device::ff7f_read), this),write8_delegate(FUNC(coco_multipak_device::ff7f_write), this)); // initial state m_select = 0xFF; + m_block = 0; // save state save_item(NAME(m_select)); + save_item(NAME(m_block)); } @@ -233,7 +264,19 @@ void coco_multipak_device::device_start() void coco_multipak_device::device_reset() { - m_select = 0xFF; + set_select(MULTI_SLOT_LOOKUP[ioport(SWITCH_CONFIG_TAG)->read()]); + m_block = 0; +} + + +//------------------------------------------------- +// switch_changed - panel switch changed +//------------------------------------------------- + +INPUT_CHANGED_MEMBER( coco_multipak_device::switch_changed ) +{ + if (m_block == 0) + set_select(MULTI_SLOT_LOOKUP[newval]); } @@ -323,11 +366,21 @@ void coco_multipak_device::set_select(uint8_t new_select) //------------------------------------------------- +// ff7f_read +//------------------------------------------------- + +READ8_MEMBER(coco_multipak_device::ff7f_read) +{ + return m_select | 0xcc; +} + +//------------------------------------------------- // ff7f_write //------------------------------------------------- WRITE8_MEMBER(coco_multipak_device::ff7f_write) { + m_block = 0xff; set_select(data); } |