mirror of
https://github.com/holub/mame
synced 2025-04-22 16:31:49 +03:00
mos6530n: Fixed edge detect. (nw)
This commit is contained in:
parent
a474c0e5e6
commit
e0b676f26a
@ -123,14 +123,15 @@ mos6530_base_t::mos6530_base_t(const machine_config &mconfig, device_type type,
|
||||
m_pa_in(0xff),
|
||||
m_pa_out(0),
|
||||
m_pa_ddr(0),
|
||||
m_pa7(0),
|
||||
m_pa7_dir(0),
|
||||
m_pb_in(0xff),
|
||||
m_pb_out(0),
|
||||
m_pb_ddr(0),
|
||||
m_ie_timer(false),
|
||||
m_irq_timer(true),
|
||||
m_ie_edge(false),
|
||||
m_irq_edge(false),
|
||||
m_positive(false)
|
||||
m_irq_edge(false)
|
||||
{
|
||||
cur_live.tm = attotime::never;
|
||||
cur_live.state = IDLE;
|
||||
@ -206,6 +207,8 @@ void mos6530_base_t::device_start()
|
||||
save_item(NAME(m_pa_in));
|
||||
save_item(NAME(m_pa_out));
|
||||
save_item(NAME(m_pa_ddr));
|
||||
save_item(NAME(m_pa7));
|
||||
save_item(NAME(m_pa7_dir));
|
||||
save_item(NAME(m_pb_in));
|
||||
save_item(NAME(m_pb_out));
|
||||
save_item(NAME(m_pb_ddr));
|
||||
@ -213,7 +216,6 @@ void mos6530_base_t::device_start()
|
||||
save_item(NAME(m_irq_timer));
|
||||
save_item(NAME(m_ie_edge));
|
||||
save_item(NAME(m_irq_edge));
|
||||
save_item(NAME(m_positive));
|
||||
save_item(NAME(m_shift));
|
||||
save_item(NAME(m_timer));
|
||||
}
|
||||
@ -250,11 +252,12 @@ void mos6530_base_t::device_reset()
|
||||
m_irq_timer = false;
|
||||
m_ie_edge = false;
|
||||
m_irq_edge = false;
|
||||
m_positive = false;
|
||||
m_pa7_dir = 0;
|
||||
|
||||
update_pa();
|
||||
update_pb();
|
||||
update_irq();
|
||||
edge_detect();
|
||||
|
||||
live_abort();
|
||||
}
|
||||
@ -407,19 +410,22 @@ UINT8 mos6530_t::get_irq_flags()
|
||||
// edge_detect -
|
||||
//-------------------------------------------------
|
||||
|
||||
void mos6530_base_t::edge_detect(int old, int state)
|
||||
void mos6530_base_t::edge_detect()
|
||||
{
|
||||
if (!m_irq_edge)
|
||||
UINT8 ddr_out = m_pa_ddr;
|
||||
UINT8 ddr_in = m_pa_ddr ^ 0xff;
|
||||
UINT8 data = (m_pa_out & ddr_out) | (m_pa_in & ddr_in);
|
||||
int state = BIT(data, 7);
|
||||
|
||||
if ((m_pa7 ^ state) && (m_pa7_dir ^ state) == 0)
|
||||
{
|
||||
if (m_positive && !old && state) m_irq_edge = true;
|
||||
if (!m_positive && old && !state) m_irq_edge = true;
|
||||
if (LOG) logerror("%s %s '%s' edge-detect IRQ\n", machine().time().as_string(), name(), tag());
|
||||
|
||||
if (m_irq_edge) {
|
||||
if (LOG) logerror("%s %s '%s' edge-detect IRQ\n", machine().time().as_string(), name(), tag());
|
||||
|
||||
update_irq();
|
||||
}
|
||||
m_irq_edge = true;
|
||||
update_irq();
|
||||
}
|
||||
|
||||
m_pa7 = state;
|
||||
}
|
||||
|
||||
|
||||
@ -433,6 +439,8 @@ void mos6530_base_t::pa_w(int bit, int state)
|
||||
|
||||
m_pa_in &= ~(1 << bit);
|
||||
m_pa_in |= (state << bit);
|
||||
|
||||
edge_detect();
|
||||
}
|
||||
|
||||
|
||||
@ -495,13 +503,7 @@ WRITE8_MEMBER( mos6530_base_t::pa_data_w )
|
||||
if (LOG) logerror("%s %s %s '%s' Port A Data Out %02x\n", machine().time().as_string(), machine().describe_context(), name(), tag(), data);
|
||||
|
||||
update_pa();
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( mos6532_t::pa_data_w )
|
||||
{
|
||||
edge_detect(BIT(m_pa_out, 7), BIT(data, 7));
|
||||
|
||||
mos6530_base_t::pa_data_w(space, offset, data);
|
||||
edge_detect();
|
||||
}
|
||||
|
||||
|
||||
@ -516,6 +518,7 @@ WRITE8_MEMBER( mos6530_base_t::pa_ddr_w )
|
||||
if (LOG) logerror("%s %s %s '%s' Port A DDR %02x\n", machine().time().as_string(), machine().describe_context(), name(), tag(), data);
|
||||
|
||||
update_pa();
|
||||
edge_detect();
|
||||
}
|
||||
|
||||
|
||||
@ -692,22 +695,10 @@ void mos6530_base_t::timer_w(offs_t offset, UINT8 data, bool ie)
|
||||
|
||||
WRITE8_MEMBER( mos6530_base_t::edge_w )
|
||||
{
|
||||
m_positive = BIT(data, 0) ? true : false;
|
||||
m_pa7_dir = BIT(data, 0);
|
||||
m_ie_edge = BIT(data, 1) ? false : true;
|
||||
|
||||
if (LOG) logerror("%s %s %s '%s' %s edge-detect, %s interrupt\n", machine().time().as_string(), machine().describe_context(), name(), tag(), m_positive ? "positive" : "negative", m_ie_edge ? "enable" : "disable");
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// pa7_w -
|
||||
//-------------------------------------------------
|
||||
|
||||
WRITE_LINE_MEMBER( mos6532_t::pa7_w )
|
||||
{
|
||||
edge_detect(BIT(m_pa_in, 7), state);
|
||||
|
||||
mos6530_base_t::pa7_w(state);
|
||||
if (LOG) logerror("%s %s %s '%s' %s edge-detect, %s interrupt\n", machine().time().as_string(), machine().describe_context(), name(), tag(), m_pa7_dir ? "positive" : "negative", m_ie_edge ? "enable" : "disable");
|
||||
}
|
||||
|
||||
|
||||
|
@ -262,7 +262,7 @@ protected:
|
||||
virtual void update_pb();
|
||||
virtual void update_irq();
|
||||
virtual UINT8 get_irq_flags();
|
||||
void edge_detect(int old, int state);
|
||||
void edge_detect();
|
||||
void pa_w(int bit, int state);
|
||||
void pb_w(int bit, int state);
|
||||
void timer_w(offs_t offset, UINT8 data, bool ie);
|
||||
@ -329,6 +329,8 @@ protected:
|
||||
UINT8 m_pa_in;
|
||||
UINT8 m_pa_out;
|
||||
UINT8 m_pa_ddr;
|
||||
int m_pa7;
|
||||
int m_pa7_dir;
|
||||
|
||||
UINT8 m_pb_in;
|
||||
UINT8 m_pb_out;
|
||||
@ -336,10 +338,8 @@ protected:
|
||||
|
||||
bool m_ie_timer;
|
||||
bool m_irq_timer;
|
||||
|
||||
bool m_ie_edge;
|
||||
bool m_irq_edge;
|
||||
bool m_positive;
|
||||
|
||||
int m_shift;
|
||||
UINT8 m_timer;
|
||||
@ -401,10 +401,6 @@ public:
|
||||
virtual DECLARE_ADDRESS_MAP(ram_map, 8);
|
||||
virtual DECLARE_ADDRESS_MAP(io_map, 8);
|
||||
|
||||
DECLARE_WRITE8_MEMBER( pa_data_w );
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER( pa7_w );
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
|
Loading…
Reference in New Issue
Block a user