From 47ccc4dcb3e35d80f402793e3715e4a6166b3629 Mon Sep 17 00:00:00 2001
From: Bernard Blackham <dagobah@ucc.asn.au>
Date: Mon, 21 Jun 2004 16:40:16 +0000
Subject: [PATCH] Bug fixes when buffer is full.

---
 ROM2/sci.c | 24 +++++++++++++-----------
 1 file changed, 13 insertions(+), 11 deletions(-)

diff --git a/ROM2/sci.c b/ROM2/sci.c
index 3241f23..4ce0d36 100644
--- a/ROM2/sci.c
+++ b/ROM2/sci.c
@@ -14,7 +14,7 @@ void sci_init() {
 	_io_ports[M6811_SCCR1] = 0;
 
 	/* Enable reciever and transmitter & rx interrupt.  */
-	_io_ports[M6811_SCCR2] = 0x2c;
+	_io_ports[M6811_SCCR2] = M6811_RIE | M6811_TE | M6811_RE;
 
 	sci_have_packet = 0;
 	sci_rx_buf_ptr = 0;
@@ -31,13 +31,10 @@ void send_packet() {
 	}
 }
 
-void rx_int() {
-	if (sci_have_packet) return;
-	if (sci_rx_buf_ptr >= BUFFER_LEN) {
+void sci_rx_int() {
+	if (sci_have_packet) {
 		/* overrun :( */
-		sci_rx_buf[BUFFER_LEN] = '\0';
-		sci_have_packet = 1;
-		sci_rx_buf_ptr = 0;
+		_io_ports[M6811_SCDR]; /* read it anyway */
 		return;
 	}
 	sci_rx_buf[sci_rx_buf_ptr] = _io_ports[M6811_SCDR];
@@ -47,6 +44,15 @@ void rx_int() {
 		sci_rx_buf_ptr = 0;
 	}
 	sci_rx_buf_ptr++;
+	if (sci_rx_buf_ptr >= BUFFER_LEN) {
+		sci_rx_buf[BUFFER_LEN] = '\0'; /* this is as much as we could fit */
+		sci_have_packet = 1;
+		sci_rx_buf_ptr = 0;
+	}
+}
+
+void sci_interrupt_serial() {
+	if (_io_ports[M6811_SCSR] & M6811_RDRF) sci_rx_int();
 }
 
 void msg_clr() {
@@ -54,10 +60,6 @@ void msg_clr() {
 	sci_rx_buf_ptr = 0;
 }
 
-void sci_interrupt_serial() {
-	if (_io_ports[M6811_SCSR] & M6811_RDRF) rx_int();
-}
-
 void send_ack() {
 	sci_tx_buf[0] = '!';
 	sci_tx_buf[1] = '\n';
-- 
GitLab