summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/cpu/upd7810/upd7810.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/cpu/upd7810/upd7810.c')
-rw-r--r--src/emu/cpu/upd7810/upd7810.c88
1 files changed, 44 insertions, 44 deletions
diff --git a/src/emu/cpu/upd7810/upd7810.c b/src/emu/cpu/upd7810/upd7810.c
index 70bdeafe766..cbd70a18cca 100644
--- a/src/emu/cpu/upd7810/upd7810.c
+++ b/src/emu/cpu/upd7810/upd7810.c
@@ -420,6 +420,8 @@ const device_type UPD78C06 = &device_creator<upd78c06_device>;
upd7810_device::upd7810_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: cpu_device(mconfig, UPD7810, "uPD7810", tag, owner, clock, "upd7810", __FILE__)
, m_to_func(*this)
+ , m_co0_func(*this)
+ , m_co1_func(*this)
, m_txd_func(*this)
, m_rxd_func(*this)
, m_an0_func(*this)
@@ -446,6 +448,8 @@ upd7810_device::upd7810_device(const machine_config &mconfig, const char *tag, d
upd7810_device::upd7810_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
: cpu_device(mconfig, type, name, tag, owner, clock, shortname, source)
, m_to_func(*this)
+ , m_co0_func(*this)
+ , m_co1_func(*this)
, m_txd_func(*this)
, m_rxd_func(*this)
, m_an0_func(*this)
@@ -860,35 +864,43 @@ void upd7801_device::upd7810_take_irq()
void upd7810_device::upd7810_write_EOM()
{
- if (EOM & 0x01) /* output LV0 content ? */
+ if (EOM & 0x01) /* output LV0 content */
{
switch (EOM & 0x0e)
{
case 0x02: /* toggle CO0 */
- CO0 = (CO0 >> 1) | ((CO0 ^ 2) & 2);
+ CO0 ^= 1;
break;
case 0x04: /* reset CO0 */
CO0 = 0;
+ EOM &= 0xfb; /* LRE0 is reset t0 0 */
break;
case 0x08: /* set CO0 */
CO0 = 1;
+ EOM &= 0xf7; /* LRE1 is reset t0 0 */
break;
}
+ EOM &= 0xfe; /* LO0 is reset t0 0 */
+ m_co0_func(CO0);
}
- if (EOM & 0x10) /* output LV0 content ? */
+ if (EOM & 0x10) /* output LV1 content */
{
switch (EOM & 0xe0)
{
case 0x20: /* toggle CO1 */
- CO1 = (CO1 >> 1) | ((CO1 ^ 2) & 2);
+ CO1 ^= 1;
break;
case 0x40: /* reset CO1 */
CO1 = 0;
+ EOM &= 0xbf; /* LRE2 is reset t0 0 */
break;
case 0x80: /* set CO1 */
CO1 = 1;
+ EOM &= 0x7f; /* LRE3 is reset t0 0 */
break;
}
+ EOM &= 0xef; /* LO1 is reset t0 0 */
+ m_co1_func(CO1);
}
}
@@ -1313,6 +1325,30 @@ void upd7810_device::handle_timers(int cycles)
IRR |= INTFE0;
if (ETM1 == ECNT)
IRR |= INTFE1;
+ /* Conditions When ECNT Causes a CO0 Output Change */
+ if (((0x00 == (ETMM & 0x30)) && (ETM0 == ECNT)) || /* set CO0 if ECNT == ETM0 */
+ /* ((0x10 == (ETMM & 0x30)) prohibited */
+ ((0x20 == (ETMM & 0x30)) && (ETM0 == ECNT)) || /* set CO0 if ECNT == ETM0 or at falling CI input */
+ ((0x30 == (ETMM & 0x30)) && (ETM0 == ECNT || ETM1 == ECNT))) /* latch CO0 if ECNT == ETM0 or ECNT == ETM1 */
+ {
+ if (EOM & 0x02) {
+ /* toggle CO0 */
+ CO0 ^= 1;
+ m_co0_func(CO0);
+ }
+ }
+ /* Conditions When ECNT Causes a CO1 Output Change */
+ if (((0x00 == (ETMM & 0xc0)) && (ETM1 == ECNT)) || /* set CO1 if ECNT == ETM1 */
+ /* ((0x40 == (ETMM & 0xc0)) prohibited */
+ ((0x80 == (ETMM & 0xc0)) && (ETM1 == ECNT)) || /* set CO1 if ECNT == ETM1 or at falling CI input */
+ ((0xc0 == (ETMM & 0xc0)) && (ETM0 == ECNT || ETM1 == ECNT))) /* latch CO1 if ECNT == ETM0 or ECNT == ETM1 */
+ {
+ if (EOM & 0x20) {
+ /* toggle CO1 */
+ CO1 ^= 1;
+ m_co1_func(CO1);
+ }
+ }
/* How and When ECNT is Cleared */
switch (ETMM & 0x0c)
{
@@ -1329,44 +1365,6 @@ void upd7810_device::handle_timers(int cycles)
ECNT = 0;
break;
}
- /* Conditions When ECNT Causes a CO0 Output Change */
- if (((0x00 == (ETMM & 0x30)) && (ETM0 == ECNT)) || /* set CO0 if ECNT == ETM0 */
- /* ((0x10 == (ETMM & 0x30)) prohibited */
- ((0x20 == (ETMM & 0x30)) && (ETM0 == ECNT)) || /* set CO0 if ECNT == ETM0 or at falling CI input */
- ((0x30 == (ETMM & 0x30)) && (ETM0 == ECNT || ETM1 == ECNT))) /* latch CO0 if ECNT == ETM0 or ECNT == ETM1 */
- {
- switch (EOM & 0x0e)
- {
- case 0x02: /* toggle CO0 */
- CO0 = (CO0 >> 1) | ((CO0 ^ 2) & 2);
- break;
- case 0x04: /* reset CO0 */
- CO0 = 0;
- break;
- case 0x08: /* set CO0 */
- CO0 = 1;
- break;
- }
- }
- /* Conditions When ECNT Causes a CO1 Output Change */
- if (((0x00 == (ETMM & 0xc0)) && (ETM0 == ECNT)) || /* set CO1 if ECNT == ETM0 */
- /* ((0x40 == (ETMM & 0xc0)) prohibited */
- ((0x80 == (ETMM & 0xc0)) && (ETM0 == ECNT)) || /* set CO1 if ECNT == ETM0 or at falling CI input */
- ((0xc0 == (ETMM & 0xc0)) && (ETM0 == ECNT || ETM1 == ECNT))) /* latch CO1 if ECNT == ETM0 or ECNT == ETM1 */
- {
- switch (EOM & 0xe0)
- {
- case 0x20: /* toggle CO1 */
- CO1 = (CO1 >> 1) | ((CO1 ^ 2) & 2);
- break;
- case 0x40: /* reset CO1 */
- CO1 = 0;
- break;
- case 0x80: /* set CO1 */
- CO1 = 1;
- break;
- }
- }
}
}
@@ -1543,6 +1541,8 @@ void upd7810_device::base_device_start()
m_io = &space(AS_IO);
m_to_func.resolve_safe();
+ m_co0_func.resolve_safe();
+ m_co1_func.resolve_safe();
m_txd_func.resolve_safe();
m_rxd_func.resolve_safe(0);
m_an0_func.resolve_safe(0);
@@ -1677,8 +1677,8 @@ void upd7810_device::device_start()
state_add( UPD7810_TI, "TI", m_ti).formatstr("%3u");
state_add( UPD7810_TO, "TO", m_to).formatstr("%3u");
state_add( UPD7810_CI, "CI", m_ci).formatstr("%3u");
- state_add( UPD7810_CO0, "CO0", m_co0).mask(0x01).formatstr("%1X");
- state_add( UPD7810_CO1, "CO1", m_co1).mask(0x01).formatstr("%1X");
+ state_add( UPD7810_CO0, "CO0", m_co0).formatstr("%3u");
+ state_add( UPD7810_CO1, "CO1", m_co1).formatstr("%3u");
state_add( STATE_GENPC, "GENPC", m_pc.w.l ).formatstr("%04X").noshow();
state_add( STATE_GENPCBASE, "GENPCBASE", m_ppc.w.l ).formatstr("%04X").noshow();