From dbf61f379d9e90a9ae3ffca2d53c46df0055a197 Mon Sep 17 00:00:00 2001 From: Nathan Woods Date: Thu, 18 Aug 2016 11:38:02 -0400 Subject: [PATCH] Rough C++ modernization of CoCo cartridge infrastructure (usage of 'enum class', scoping etc) --- src/devices/bus/coco/coco_fdc.cpp | 16 +++---- src/devices/bus/coco/coco_pak.cpp | 13 +++--- src/devices/bus/coco/cococart.cpp | 53 +++++++++++----------- src/devices/bus/coco/cococart.h | 75 +++++++++++++++---------------- src/mame/machine/coco.cpp | 4 +- 5 files changed, 81 insertions(+), 80 deletions(-) diff --git a/src/devices/bus/coco/coco_fdc.cpp b/src/devices/bus/coco/coco_fdc.cpp index ae66083b403..52c31c0d71d 100644 --- a/src/devices/bus/coco/coco_fdc.cpp +++ b/src/devices/bus/coco/coco_fdc.cpp @@ -252,12 +252,12 @@ void coco_fdc_device::update_lines() m_dskreg &= ~0x80; /* clear halt enable */ /* set the NMI line */ - m_owner->cart_set_line(COCOCART_LINE_NMI, - ((m_intrq != 0) && (m_dskreg & 0x20)) ? COCOCART_LINE_VALUE_ASSERT : COCOCART_LINE_VALUE_CLEAR); + m_owner->cart_set_line(cococart_slot_device::line::NMI, + ((m_intrq != 0) && (m_dskreg & 0x20)) ? cococart_slot_device::line_value::ASSERT : cococart_slot_device::line_value::CLEAR); /* set the HALT line */ - m_owner->cart_set_line(COCOCART_LINE_HALT, - ((m_drq == 0) && (m_dskreg & 0x80)) ? COCOCART_LINE_VALUE_ASSERT : COCOCART_LINE_VALUE_CLEAR); + m_owner->cart_set_line(cococart_slot_device::line::HALT, + ((m_drq == 0) && (m_dskreg & 0x80)) ? cococart_slot_device::line_value::ASSERT : cococart_slot_device::line_value::CLEAR); } /*------------------------------------------------- @@ -497,12 +497,12 @@ const tiny_rom_entry *dragon_fdc_device::device_rom_region() const void dragon_fdc_device::update_lines() { /* set the NMI line */ - m_owner->cart_set_line(COCOCART_LINE_NMI, - ((m_intrq != 0) && (m_dskreg & 0x20)) ? COCOCART_LINE_VALUE_ASSERT : COCOCART_LINE_VALUE_CLEAR); + m_owner->cart_set_line(cococart_slot_device::line::NMI, + ((m_intrq != 0) && (m_dskreg & 0x20)) ? cococart_slot_device::line_value::ASSERT : cococart_slot_device::line_value::CLEAR); /* set the CART line */ - m_owner->cart_set_line(COCOCART_LINE_CART, - (m_drq != 0) ? COCOCART_LINE_VALUE_ASSERT : COCOCART_LINE_VALUE_CLEAR); + m_owner->cart_set_line(cococart_slot_device::line::CART, + (m_drq != 0) ? cococart_slot_device::line_value::ASSERT : cococart_slot_device::line_value::CLEAR); } diff --git a/src/devices/bus/coco/coco_pak.cpp b/src/devices/bus/coco/coco_pak.cpp index 84b03657ec8..40c250dd4ac 100644 --- a/src/devices/bus/coco/coco_pak.cpp +++ b/src/devices/bus/coco/coco_pak.cpp @@ -88,13 +88,14 @@ const tiny_rom_entry *coco_pak_device::device_rom_region() const void coco_pak_device::device_reset() { - if (m_cart->exists()) { - cococart_line_value cart_line = m_autostart.read_safe(0x01) - ? COCOCART_LINE_VALUE_Q - : COCOCART_LINE_VALUE_CLEAR; + if (m_cart->exists()) + { + auto cart_line = m_autostart.read_safe(0x01) + ? cococart_slot_device::line_value::Q + : cococart_slot_device::line_value::CLEAR; - /* normal CoCo PAKs tie their CART line to Q - the system clock */ - m_owner->cart_set_line(COCOCART_LINE_CART,cart_line); + // normal CoCo PAKs tie their CART line to Q - the system clock + m_owner->cart_set_line(cococart_slot_device::line::CART, cart_line); } } diff --git a/src/devices/bus/coco/cococart.cpp b/src/devices/bus/coco/cococart.cpp index d0955c42f9a..bd293b60a4a 100644 --- a/src/devices/bus/coco/cococart.cpp +++ b/src/devices/bus/coco/cococart.cpp @@ -61,7 +61,7 @@ void cococart_slot_device::device_start() m_cart_line.timer_index = 0; m_cart_line.delay = 0; - m_cart_line.value = COCOCART_LINE_VALUE_CLEAR; + m_cart_line.value = line_value::CLEAR; m_cart_line.line = 0; m_cart_line.q_count = 0; m_cart_callback.resolve(); @@ -70,7 +70,7 @@ void cococart_slot_device::device_start() m_nmi_line.timer_index = 0; /* 12 allowed one more instruction to finished after the line is pulled */ m_nmi_line.delay = 12; - m_nmi_line.value = COCOCART_LINE_VALUE_CLEAR; + m_nmi_line.value = line_value::CLEAR; m_nmi_line.line = 0; m_nmi_line.q_count = 0; m_nmi_callback.resolve(); @@ -79,7 +79,7 @@ void cococart_slot_device::device_start() m_halt_line.timer_index = 0; /* 6 allowed one more instruction to finished after the line is pulled */ m_halt_line.delay = 6; - m_halt_line.value = COCOCART_LINE_VALUE_CLEAR; + m_halt_line.value = line_value::CLEAR; m_halt_line.line = 0; m_halt_line.q_count = 0; m_halt_callback.resolve(); @@ -113,15 +113,15 @@ void cococart_slot_device::device_timer(emu_timer &timer, device_timer_id id, in switch(id) { case TIMER_CART: - set_line("CART", m_cart_line, (cococart_line_value) param); + set_line("CART", m_cart_line, (line_value) param); break; case TIMER_NMI: - set_line("NMI", m_nmi_line, (cococart_line_value) param); + set_line("NMI", m_nmi_line, (line_value) param); break; case TIMER_HALT: - set_line("HALT", m_halt_line, (cococart_line_value) param); + set_line("HALT", m_halt_line, (line_value) param); break; } } @@ -157,18 +157,18 @@ WRITE8_MEMBER(cococart_slot_device::write) // line_value_string //------------------------------------------------- -static const char *line_value_string(cococart_line_value value) +const char *cococart_slot_device::line_value_string(line_value value) { const char *s; switch(value) { - case COCOCART_LINE_VALUE_CLEAR: + case line_value::CLEAR: s = "CLEAR"; break; - case COCOCART_LINE_VALUE_ASSERT: + case line_value::ASSERT: s = "ASSERT"; break; - case COCOCART_LINE_VALUE_Q: + case line_value::Q: s = "Q"; break; default: @@ -183,28 +183,29 @@ static const char *line_value_string(cococart_line_value value) // set_line //------------------------------------------------- -void cococart_slot_device::set_line(const char *line_name, coco_cartridge_line &line, cococart_line_value value) +void cococart_slot_device::set_line(const char *line_name, coco_cartridge_line &line, cococart_slot_device::line_value value) { - if ((line.value != value) || (value == COCOCART_LINE_VALUE_Q)) + if ((line.value != value) || (value == line_value::Q)) { line.value = value; if (LOG_LINE) logerror("[%s]: set_line(): %s <= %s\n", machine().describe_context(), line_name, line_value_string(value)); - /* engage in a bit of gymnastics for this odious 'Q' value */ + + // engage in a bit of gymnastics for this odious 'Q' value switch(line.value) { - case COCOCART_LINE_VALUE_CLEAR: + case line_value::CLEAR: line.line = 0x00; line.q_count = 0; break; - case COCOCART_LINE_VALUE_ASSERT: + case line_value::ASSERT: line.line = 0x01; line.q_count = 0; break; - case COCOCART_LINE_VALUE_Q: + case line_value::Q: line.line = line.line ? 0x00 : 0x01; if (line.q_count++ < 4) set_line_timer(line, value); @@ -223,9 +224,9 @@ void cococart_slot_device::set_line(const char *line_name, coco_cartridge_line & // set_line_timer() //------------------------------------------------- -void cococart_slot_device::set_line_timer(coco_cartridge_line &line, cococart_line_value value) +void cococart_slot_device::set_line_timer(coco_cartridge_line &line, cococart_slot_device::line_value value) { - /* calculate delay; delay dependant on cycles per second */ + // calculate delay; delay dependant on cycles per second attotime delay = (line.delay != 0) ? machine().firstcpu->cycles_to_attotime(line.delay) : attotime::zero; @@ -242,10 +243,10 @@ void cococart_slot_device::set_line_timer(coco_cartridge_line &line, cococart_li void cococart_slot_device::twiddle_line_if_q(coco_cartridge_line &line) { - if (line.value == COCOCART_LINE_VALUE_Q) + if (line.value == line_value::Q) { line.q_count = 0; - set_line_timer(line, COCOCART_LINE_VALUE_Q); + set_line_timer(line, line_value::Q); } } @@ -268,23 +269,23 @@ void cococart_slot_device::twiddle_q_lines() // coco_cartridge_set_line //------------------------------------------------- -void cococart_slot_device::cart_set_line(cococart_line line, cococart_line_value value) +void cococart_slot_device::cart_set_line(cococart_slot_device::line which, cococart_slot_device::line_value value) { - switch (line) + switch (which) { - case COCOCART_LINE_CART: + case line::CART: set_line_timer(m_cart_line, value); break; - case COCOCART_LINE_NMI: + case line::NMI: set_line_timer(m_nmi_line, value); break; - case COCOCART_LINE_HALT: + case line::HALT: set_line_timer(m_halt_line, value); break; - case COCOCART_LINE_SOUND_ENABLE: + case line::SOUND_ENABLE: // do nothing for now break; } diff --git a/src/devices/bus/coco/cococart.h b/src/devices/bus/coco/cococart.h index 9415b5956c8..925b942038a 100644 --- a/src/devices/bus/coco/cococart.h +++ b/src/devices/bus/coco/cococart.h @@ -14,45 +14,10 @@ #include "softlist_dev.h" -/*************************************************************************** - CONSTANTS -***************************************************************************/ - -/* TIMER_POOL: Must be power of two */ -#define TIMER_POOL 2 - /*************************************************************************** TYPE DEFINITIONS ***************************************************************************/ -/* output lines on the CoCo cartridge slot */ -enum cococart_line -{ - COCOCART_LINE_CART, /* connects to PIA1 CB1 */ - COCOCART_LINE_NMI, /* connects to NMI line on CPU */ - COCOCART_LINE_HALT, /* connects to HALT line on CPU */ - COCOCART_LINE_SOUND_ENABLE /* sound enable */ -}; - -/* since we have a special value "Q" - we have to use a special enum here */ -enum cococart_line_value -{ - COCOCART_LINE_VALUE_CLEAR, - COCOCART_LINE_VALUE_ASSERT, - COCOCART_LINE_VALUE_Q -}; - -struct coco_cartridge_line -{ - emu_timer *timer[TIMER_POOL]; - int timer_index; - int delay; - cococart_line_value value; - int line; - int q_count; - devcb_write_line *callback; -}; - // ======================> cococart_base_update_delegate // direct region update handler @@ -76,6 +41,23 @@ class cococart_slot_device : public device_t, public device_image_interface { public: + // output lines on the CoCo cartridge slot + enum class line + { + CART, // connects to PIA1 CB1 + NMI, // connects to NMI line on CPU + HALT, // connects to HALT line on CPU + SOUND_ENABLE // sound enable + }; + + // since we have a special value "Q" - we have to use a special enum here + enum class line_value + { + CLEAR, + ASSERT, + Q + }; + // construction/destruction cococart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); @@ -110,7 +92,7 @@ public: DECLARE_WRITE8_MEMBER(write); // sets a cartridge line - void cart_set_line(cococart_line line, cococart_line_value value); + void cart_set_line(line line, line_value value); // hack to support twiddling the Q line void twiddle_q_lines(); @@ -120,6 +102,9 @@ public: void set_cart_base_update(cococart_base_update_delegate update); private: + // TIMER_POOL: Must be power of two + static constexpr int TIMER_POOL = 2; + enum { TIMER_CART, @@ -127,6 +112,17 @@ private: TIMER_HALT }; + struct coco_cartridge_line + { + emu_timer *timer[TIMER_POOL]; + int timer_index; + int delay; + line_value value; + int line; + int q_count; + devcb_write_line * callback; + }; + // configuration coco_cartridge_line m_cart_line; coco_cartridge_line m_nmi_line; @@ -140,9 +136,10 @@ private: device_cococart_interface *m_cart; // methods - void set_line(const char *line_name, coco_cartridge_line &line, cococart_line_value value); - void set_line_timer(coco_cartridge_line &line, cococart_line_value value); + void set_line(const char *line_name, coco_cartridge_line &line, line_value value); + void set_line_timer(coco_cartridge_line &line, line_value value); void twiddle_line_if_q(coco_cartridge_line &line); + static const char *line_value_string(line_value value); }; // device type definition @@ -181,4 +178,4 @@ private: #define MCFG_COCO_CARTRIDGE_REMOVE(_tag) \ MCFG_DEVICE_REMOVE(_tag) -#endif /* __COCOCART_H__ */ +#endif // __COCOCART_H__ diff --git a/src/mame/machine/coco.cpp b/src/mame/machine/coco.cpp index fca8a67d2cf..8cdf9d4a686 100644 --- a/src/mame/machine/coco.cpp +++ b/src/mame/machine/coco.cpp @@ -708,7 +708,9 @@ void coco_state::update_sound(void) m_cassette->change_state(cas_sound, CASSETTE_MASK_SPEAKER); /* determine the cartridge sound status */ - m_cococart->cart_set_line(COCOCART_LINE_SOUND_ENABLE, bCartSoundEnable ? COCOCART_LINE_VALUE_ASSERT : COCOCART_LINE_VALUE_CLEAR); + m_cococart->cart_set_line( + cococart_slot_device::line::SOUND_ENABLE, + bCartSoundEnable ? cococart_slot_device::line_value::ASSERT : cococart_slot_device::line_value::CLEAR); }