mirror of
https://github.com/holub/mame
synced 2025-05-23 06:08:48 +03:00
Merge pull request #43 from ramiropolla/upd7810
upd7810: use intermediate flip flops for extended timer/event counter
This commit is contained in:
commit
53dc8fab6b
@ -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()
|
void upd7810_device::upd7810_write_EOM()
|
||||||
{
|
{
|
||||||
if (EOM & 0x01) /* output LV0 content */
|
switch (EOM & 0x0c)
|
||||||
{
|
{
|
||||||
switch (EOM & 0x0e)
|
case 0x04: /* To Reset LV0 */
|
||||||
{
|
LV0 = 0;
|
||||||
case 0x02: /* toggle CO0 */
|
EOM &= 0xfb; /* LRE0 is reset to 0 */
|
||||||
CO0 ^= 1;
|
break;
|
||||||
break;
|
case 0x08: /* To Set LV0 */
|
||||||
case 0x04: /* reset CO0 */
|
LV0 = 1;
|
||||||
CO0 = 0;
|
EOM &= 0xf7; /* LRE1 is reset to 0 */
|
||||||
EOM &= 0xfb; /* LRE0 is reset t0 0 */
|
break;
|
||||||
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 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 0x40: /* To Reset LV1 */
|
||||||
{
|
LV1 = 0;
|
||||||
case 0x20: /* toggle CO1 */
|
EOM &= 0xbf; /* LRE2 is reset to 0 */
|
||||||
CO1 ^= 1;
|
break;
|
||||||
break;
|
case 0x80: /* To Set LV1 */
|
||||||
case 0x40: /* reset CO1 */
|
LV1 = 1;
|
||||||
CO1 = 0;
|
EOM &= 0x7f; /* LRE3 is reset to 0 */
|
||||||
EOM &= 0xbf; /* LRE2 is reset t0 0 */
|
break;
|
||||||
break;
|
}
|
||||||
case 0x80: /* set CO1 */
|
/* Output LV1 Content */
|
||||||
CO1 = 1;
|
if (EOM & 0x10) {
|
||||||
EOM &= 0x7f; /* LRE3 is reset t0 0 */
|
upd7810_co1_output_change();
|
||||||
break;
|
EOM &= 0xef; /* LO1 is reset to 0 */
|
||||||
}
|
|
||||||
EOM &= 0xef; /* LO1 is reset t0 0 */
|
|
||||||
m_co1_func(CO1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -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 */
|
((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 */
|
((0x30 == (ETMM & 0x30)) && (ETM0 == ECNT || ETM1 == ECNT))) /* latch CO0 if ECNT == ETM0 or ECNT == ETM1 */
|
||||||
{
|
{
|
||||||
if (EOM & 0x02) {
|
upd7810_co0_output_change();
|
||||||
/* toggle CO0 */
|
|
||||||
CO0 ^= 1;
|
|
||||||
m_co0_func(CO0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/* Conditions When ECNT Causes a CO1 Output Change */
|
/* Conditions When ECNT Causes a CO1 Output Change */
|
||||||
if (((0x00 == (ETMM & 0xc0)) && (ETM1 == ECNT)) || /* set CO1 if ECNT == ETM1 */
|
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 */
|
((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 */
|
((0xc0 == (ETMM & 0xc0)) && (ETM0 == ECNT || ETM1 == ECNT))) /* latch CO1 if ECNT == ETM0 or ECNT == ETM1 */
|
||||||
{
|
{
|
||||||
if (EOM & 0x20) {
|
upd7810_co1_output_change();
|
||||||
/* toggle CO1 */
|
|
||||||
CO1 ^= 1;
|
|
||||||
m_co1_func(CO1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/* How and When ECNT is Cleared */
|
/* How and When ECNT is Cleared */
|
||||||
switch (ETMM & 0x0c)
|
switch (ETMM & 0x0c)
|
||||||
@ -1607,6 +1617,8 @@ void upd7810_device::base_device_start()
|
|||||||
save_item(NAME(m_ti));
|
save_item(NAME(m_ti));
|
||||||
save_item(NAME(m_to));
|
save_item(NAME(m_to));
|
||||||
save_item(NAME(m_ci));
|
save_item(NAME(m_ci));
|
||||||
|
save_item(NAME(m_lv0));
|
||||||
|
save_item(NAME(m_lv1));
|
||||||
save_item(NAME(m_co0));
|
save_item(NAME(m_co0));
|
||||||
save_item(NAME(m_co1));
|
save_item(NAME(m_co1));
|
||||||
save_item(NAME(m_irr));
|
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_TI, "TI", m_ti).formatstr("%3u");
|
||||||
state_add( UPD7810_TO, "TO", m_to).formatstr("%3u");
|
state_add( UPD7810_TO, "TO", m_to).formatstr("%3u");
|
||||||
state_add( UPD7810_CI, "CI", m_ci).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_CO0, "CO0", m_co0).formatstr("%3u");
|
||||||
state_add( UPD7810_CO1, "CO1", m_co1).formatstr("%3u");
|
state_add( UPD7810_CO1, "CO1", m_co1).formatstr("%3u");
|
||||||
|
|
||||||
@ -1794,6 +1808,8 @@ void upd7810_device::device_reset()
|
|||||||
m_ti = 0;
|
m_ti = 0;
|
||||||
m_to = 0;
|
m_to = 0;
|
||||||
m_ci = 0;
|
m_ci = 0;
|
||||||
|
m_lv0 = 0;
|
||||||
|
m_lv1 = 0;
|
||||||
m_co0 = 0;
|
m_co0 = 0;
|
||||||
m_co1 = 0;
|
m_co1 = 0;
|
||||||
m_irr = 0;
|
m_irr = 0;
|
||||||
|
@ -24,7 +24,8 @@ enum
|
|||||||
UPD7810_ANM, UPD7810_MKL, UPD7810_MKH, UPD7810_ZCM,
|
UPD7810_ANM, UPD7810_MKL, UPD7810_MKH, UPD7810_ZCM,
|
||||||
UPD7810_TXB, UPD7810_RXB, UPD7810_CR0, UPD7810_CR1, UPD7810_CR2, UPD7810_CR3,
|
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_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 */
|
/* 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_timer0(int cycles, int clkdiv);
|
||||||
void upd7810_handle_timer1(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_to_func;
|
||||||
devcb_write_line m_co0_func;
|
devcb_write_line m_co0_func;
|
||||||
devcb_write_line m_co1_func;
|
devcb_write_line m_co1_func;
|
||||||
@ -300,6 +304,8 @@ protected:
|
|||||||
UINT8 m_ti;
|
UINT8 m_ti;
|
||||||
UINT8 m_to;
|
UINT8 m_to;
|
||||||
UINT8 m_ci;
|
UINT8 m_ci;
|
||||||
|
UINT8 m_lv0; /* level flip flop for co0 */
|
||||||
|
UINT8 m_lv1; /* level flip flop for co1 */
|
||||||
UINT8 m_co0;
|
UINT8 m_co0;
|
||||||
UINT8 m_co1;
|
UINT8 m_co1;
|
||||||
UINT16 m_irr; /* interrupt request register */
|
UINT16 m_irr; /* interrupt request register */
|
||||||
|
@ -89,6 +89,8 @@
|
|||||||
#define TI m_ti
|
#define TI m_ti
|
||||||
#define TO m_to
|
#define TO m_to
|
||||||
#define CI m_ci
|
#define CI m_ci
|
||||||
|
#define LV0 m_lv0
|
||||||
|
#define LV1 m_lv1
|
||||||
#define CO0 m_co0
|
#define CO0 m_co0
|
||||||
#define CO1 m_co1
|
#define CO1 m_co1
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user