Rough C++ modernization of CoCo cartridge infrastructure (usage of 'enum class', scoping etc)

This commit is contained in:
Nathan Woods 2016-08-18 11:38:02 -04:00
parent 6b83b0dbee
commit dbf61f379d
5 changed files with 81 additions and 80 deletions

View File

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

View File

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

View File

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

View File

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

View File

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