summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Miodrag Milanović <mmicko@gmail.com>2014-11-10 08:26:39 +0100
committer Miodrag Milanović <mmicko@gmail.com>2014-11-10 08:26:39 +0100
commit53dc8fab6bcabbd9600db74ceef02626fd77644a (patch)
treeea6efeb37619d1b44945c7fe125f8838820f7ccd
parent97b133dfb75b6f44fd9a1e1a3cd25c25a5045b4b (diff)
parent5803dca3b82ffa507f72eec6514661acdb10ca29 (diff)
Merge pull request #43 from ramiropolla/upd7810
upd7810: use intermediate flip flops for extended timer/event counter
-rw-r--r--src/emu/cpu/upd7810/upd7810.c104
-rw-r--r--src/emu/cpu/upd7810/upd7810.h8
-rw-r--r--src/emu/cpu/upd7810/upd7810_macros.h2
3 files changed, 69 insertions, 45 deletions
diff --git a/src/emu/cpu/upd7810/upd7810.c b/src/emu/cpu/upd7810/upd7810.c
index cbd70a18cca..f6d8ddc353f 100644
--- a/src/emu/cpu/upd7810/upd7810.c
+++ b/src/emu/cpu/upd7810/upd7810.c
@@ -862,45 +862,63 @@ void upd7801_device::upd7810_take_irq()
}
}
+void upd7810_device::upd7810_co0_output_change()
+{
+ /* Output LV0 Content to CO0 */
+ CO0 = LV0;
+
+ /* LV0 Level Inversion */
+ if (EOM & 0x02)
+ LV0 ^= 1;
+
+ m_co0_func(CO0);
+}
+void upd7810_device::upd7810_co1_output_change()
+{
+ /* Output LV1 Content to CO1 */
+ CO1 = LV1;
+
+ /* LV1 Level Inversion */
+ if (EOM & 0x20)
+ LV1 ^= 1;
+
+ m_co1_func(CO1);
+}
+
void upd7810_device::upd7810_write_EOM()
{
- if (EOM & 0x01) /* output LV0 content */
+ switch (EOM & 0x0c)
{
- switch (EOM & 0x0e)
- {
- case 0x02: /* toggle CO0 */
- 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);
+ case 0x04: /* To Reset LV0 */
+ LV0 = 0;
+ EOM &= 0xfb; /* LRE0 is reset to 0 */
+ break;
+ case 0x08: /* To Set LV0 */
+ LV0 = 1;
+ EOM &= 0xf7; /* LRE1 is reset to 0 */
+ break;
}
- if (EOM & 0x10) /* output LV1 content */
+ /* Output LV0 Content */
+ if (EOM & 0x01) {
+ upd7810_co0_output_change();
+ EOM &= 0xfe; /* LO0 is reset to 0 */
+ }
+
+ switch (EOM & 0xc0)
{
- switch (EOM & 0xe0)
- {
- case 0x20: /* toggle CO1 */
- 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);
+ case 0x40: /* To Reset LV1 */
+ LV1 = 0;
+ EOM &= 0xbf; /* LRE2 is reset to 0 */
+ break;
+ case 0x80: /* To Set LV1 */
+ LV1 = 1;
+ EOM &= 0x7f; /* LRE3 is reset to 0 */
+ break;
+ }
+ /* Output LV1 Content */
+ if (EOM & 0x10) {
+ upd7810_co1_output_change();
+ EOM &= 0xef; /* LO1 is reset to 0 */
}
}
@@ -1331,11 +1349,7 @@ void upd7810_device::handle_timers(int cycles)
((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);
- }
+ upd7810_co0_output_change();
}
/* Conditions When ECNT Causes a CO1 Output Change */
if (((0x00 == (ETMM & 0xc0)) && (ETM1 == ECNT)) || /* set CO1 if ECNT == ETM1 */
@@ -1343,11 +1357,7 @@ void upd7810_device::handle_timers(int cycles)
((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);
- }
+ upd7810_co1_output_change();
}
/* How and When ECNT is Cleared */
switch (ETMM & 0x0c)
@@ -1607,6 +1617,8 @@ void upd7810_device::base_device_start()
save_item(NAME(m_ti));
save_item(NAME(m_to));
save_item(NAME(m_ci));
+ save_item(NAME(m_lv0));
+ save_item(NAME(m_lv1));
save_item(NAME(m_co0));
save_item(NAME(m_co1));
save_item(NAME(m_irr));
@@ -1677,6 +1689,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_LV0, "LV0", m_lv0).formatstr("%3u");
+ state_add( UPD7810_LV1, "LV1", m_lv1).formatstr("%3u");
state_add( UPD7810_CO0, "CO0", m_co0).formatstr("%3u");
state_add( UPD7810_CO1, "CO1", m_co1).formatstr("%3u");
@@ -1794,6 +1808,8 @@ void upd7810_device::device_reset()
m_ti = 0;
m_to = 0;
m_ci = 0;
+ m_lv0 = 0;
+ m_lv1 = 0;
m_co0 = 0;
m_co1 = 0;
m_irr = 0;
diff --git a/src/emu/cpu/upd7810/upd7810.h b/src/emu/cpu/upd7810/upd7810.h
index 91b1a100e42..f1af30ae95c 100644
--- a/src/emu/cpu/upd7810/upd7810.h
+++ b/src/emu/cpu/upd7810/upd7810.h
@@ -24,7 +24,8 @@ enum
UPD7810_ANM, UPD7810_MKL, UPD7810_MKH, UPD7810_ZCM,
UPD7810_TXB, UPD7810_RXB, UPD7810_CR0, UPD7810_CR1, UPD7810_CR2, UPD7810_CR3,
UPD7810_AN0, UPD7810_AN1, UPD7810_AN2, UPD7810_AN3, UPD7810_AN4, UPD7810_AN5, UPD7810_AN6, UPD7810_AN7,
- UPD7810_TXD, UPD7810_RXD, UPD7810_SCK, UPD7810_TI, UPD7810_TO, UPD7810_CI, UPD7810_CO0, UPD7810_CO1
+ UPD7810_TXD, UPD7810_RXD, UPD7810_SCK, UPD7810_TI, UPD7810_TO, UPD7810_CI, UPD7810_CO0, UPD7810_CO1,
+ UPD7810_LV0, UPD7810_LV1
};
/* port numbers for PA,PB,PC,PD and PF */
@@ -180,6 +181,9 @@ protected:
void upd7810_handle_timer0(int cycles, int clkdiv);
void upd7810_handle_timer1(int cycles, int clkdiv);
+ void upd7810_co0_output_change();
+ void upd7810_co1_output_change();
+
devcb_write_line m_to_func;
devcb_write_line m_co0_func;
devcb_write_line m_co1_func;
@@ -300,6 +304,8 @@ protected:
UINT8 m_ti;
UINT8 m_to;
UINT8 m_ci;
+ UINT8 m_lv0; /* level flip flop for co0 */
+ UINT8 m_lv1; /* level flip flop for co1 */
UINT8 m_co0;
UINT8 m_co1;
UINT16 m_irr; /* interrupt request register */
diff --git a/src/emu/cpu/upd7810/upd7810_macros.h b/src/emu/cpu/upd7810/upd7810_macros.h
index 0c11e037281..59f5791baea 100644
--- a/src/emu/cpu/upd7810/upd7810_macros.h
+++ b/src/emu/cpu/upd7810/upd7810_macros.h
@@ -89,6 +89,8 @@
#define TI m_ti
#define TO m_to
#define CI m_ci
+#define LV0 m_lv0
+#define LV1 m_lv1
#define CO0 m_co0
#define CO1 m_co1