summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2014-04-26 10:31:13 +0000
committer Olivier Galibert <galibert@pobox.com>2014-04-26 10:31:13 +0000
commitbb221d260a2531cdbc0125071bc73583cee39e1a (patch)
tree4c6c6b622fa813d037b0b0fdc29459269cdc5053 /src
parent862d0e262d91d20f736b3be0d2285f1f71b2b5f2 (diff)
h8_sci: Implement sync-start [O. Galibert]
h8: Fix problem in the sleep instruction [O. Galibert] at45dbxx: Fix communications [O. Galibert]
Diffstat (limited to 'src')
-rw-r--r--src/emu/cpu/h8/h8_sci.c22
-rw-r--r--src/emu/cpu/h8/h8_sci.h3
-rw-r--r--src/emu/cpu/h8/h8make.py4
-rw-r--r--src/emu/machine/at45dbxx.c27
4 files changed, 38 insertions, 18 deletions
diff --git a/src/emu/cpu/h8/h8_sci.c b/src/emu/cpu/h8/h8_sci.c
index e5213bc109b..bf7579b57df 100644
--- a/src/emu/cpu/h8/h8_sci.c
+++ b/src/emu/cpu/h8/h8_sci.c
@@ -61,6 +61,16 @@ READ8_MEMBER(h8_sci_device::brr_r)
return brr;
}
+bool h8_sci_device::is_sync_start() const
+{
+ return (ssr & SMR_CA) && ((scr & (SCR_TE|SCR_RE)) == (SCR_TE|SCR_RE));
+}
+
+bool h8_sci_device::has_recv_error() const
+{
+ return ssr & (SSR_ORER|SSR_PER|SSR_FER);
+}
+
WRITE8_MEMBER(h8_sci_device::scr_w)
{
logerror("%s: scr_w %02x%s%s%s%s%s%s clk=%d (%06x)\n", tag(), data,
@@ -82,7 +92,7 @@ WRITE8_MEMBER(h8_sci_device::scr_w)
clock_stop(CLK_RX);
}
- if((delta & SCR_RE) && (scr & SCR_RE) && rx_state == ST_IDLE && !(ssr & (SSR_ORER|SSR_PER|SSR_FER)))
+ if((delta & SCR_RE) && (scr & SCR_RE) && rx_state == ST_IDLE && !has_recv_error() && !is_sync_start())
rx_start();
if((delta & SCR_TIE) && (scr & SCR_TIE) && (ssr & SSR_TDRE))
intc->internal_interrupt(txi_int);
@@ -90,7 +100,7 @@ WRITE8_MEMBER(h8_sci_device::scr_w)
intc->internal_interrupt(tei_int);
if((delta & SCR_RIE) && (scr & SCR_RIE) && (ssr & SSR_RDRF))
intc->internal_interrupt(rxi_int);
- if((delta & SCR_RIE) && (scr & SCR_RIE) && (ssr & (SSR_ORER|SSR_PER|SSR_FER)))
+ if((delta & SCR_RIE) && (scr & SCR_RIE) && has_recv_error())
intc->internal_interrupt(eri_int);
}
@@ -126,7 +136,7 @@ WRITE8_MEMBER(h8_sci_device::ssr_w)
if(tx_state == ST_IDLE && !(ssr & SSR_TDRE))
tx_start();
- if((scr & SCR_RE) && rx_state == ST_IDLE && !(ssr & (SSR_ORER|SSR_PER|SSR_FER)))
+ if((scr & SCR_RE) && rx_state == ST_IDLE && !has_recv_error() && !is_sync_start())
rx_start();
}
@@ -502,6 +512,8 @@ void h8_sci_device::tx_start()
tx_bit = 1;
}
clock_start(CLK_TX);
+ if(rx_state == ST_IDLE && !has_recv_error() && is_sync_start())
+ rx_start();
}
void h8_sci_device::tx_dropped_edge()
@@ -608,12 +620,12 @@ void h8_sci_device::rx_done()
}
}
if(scr & SCR_RIE) {
- if(ssr & (SSR_ORER|SSR_PER|SSR_FER))
+ if(has_recv_error())
intc->internal_interrupt(eri_int);
else
intc->internal_interrupt(rxi_int);
}
- if((scr & SCR_RE) && !(ssr & (SSR_ORER|SSR_PER|SSR_FER)))
+ if((scr & SCR_RE) && !has_recv_error() && !is_sync_start())
rx_start();
else {
clock_stop(CLK_RX);
diff --git a/src/emu/cpu/h8/h8_sci.h b/src/emu/cpu/h8/h8_sci.h
index bd508e44061..555db757335 100644
--- a/src/emu/cpu/h8/h8_sci.h
+++ b/src/emu/cpu/h8/h8_sci.h
@@ -165,6 +165,9 @@ protected:
void rx_start();
void rx_done();
void rx_raised_edge();
+
+ bool is_sync_start() const;
+ bool has_recv_error() const;
};
extern const device_type H8_SCI;
diff --git a/src/emu/cpu/h8/h8make.py b/src/emu/cpu/h8/h8make.py
index 9d32cf6d912..543087708f3 100644
--- a/src/emu/cpu/h8/h8make.py
+++ b/src/emu/cpu/h8/h8make.py
@@ -54,7 +54,7 @@ def save_full_one(f, t, name, source):
print >>f, line
substate = substate + 1
elif has_eat(line):
- print >>f, "\ticount = bcount; inst_substate = %d; return;" % substate
+ print >>f, "\tif(icount) icount = bcount; inst_substate = %d; return;" % substate
substate = substate + 1
else:
print >>f, line
@@ -74,7 +74,7 @@ def save_partial_one(f, t, name, source):
print >>f, line
substate = substate + 1
elif has_eat(line):
- print >>f, "\ticount = bcount; inst_substate = %d; return;" % substate
+ print >>f, "\tif(icount) icount = bcount; inst_substate = %d; return;" % substate
print >>f, "case %d:;" % substate
substate = substate + 1
else:
diff --git a/src/emu/machine/at45dbxx.c b/src/emu/machine/at45dbxx.c
index 869c9fec50d..657ce88f008 100644
--- a/src/emu/machine/at45dbxx.c
+++ b/src/emu/machine/at45dbxx.c
@@ -82,6 +82,14 @@ void at45db041_device::device_start()
m_buffer1.resize(page_size());
//m_buffer2.resize(page_size());
+ // pins
+ m_pin.cs = 0;
+ m_pin.sck = 0;
+ m_pin.si = 0;
+ m_pin.wp = 0;
+ m_pin.reset = 0;
+ m_pin.busy = 0;
+
// data
save_item(NAME(m_data));
// pins
@@ -115,13 +123,7 @@ void at45db041_device::device_reset()
m_io.size = 0;
m_io.pos = 0;
// pins
- m_pin.cs = 0;
- m_pin.sck = 0;
- m_pin.si = 0;
- m_pin.so = 0;
- m_pin.wp = 0;
- m_pin.reset = 0;
- m_pin.busy = 0;
+ m_pin.so = 0;
// output
m_so_byte = 0;
m_so_bits = 0;
@@ -362,6 +364,13 @@ WRITE_LINE_MEMBER(at45db041_device::sck_w)
m_so_bits = 0;
m_so_byte = read_byte();
}
+ // output (part 2)
+ m_pin.so = (m_so_byte >> m_so_bits) & 1;
+ write_so(m_pin.so);
+ m_so_bits++;
+ }
+ else
+ {
// input
if (m_pin.si) m_si_byte = m_si_byte | (1 << m_si_bits);
m_si_bits++;
@@ -371,10 +380,6 @@ WRITE_LINE_MEMBER(at45db041_device::sck_w)
write_byte(m_si_byte);
m_si_byte = 0;
}
- // output (part 2)
- m_pin.so = (m_so_byte >> m_so_bits) & 1;
- write_so(m_pin.so);
- m_so_bits++;
}
// save sck
m_pin.sck = state;