To rom Q - COMPLETELY WORKS!
[uccvend-snackrom.git] / ROM2 / sci.c
index 3241f23..668e865 100644 (file)
@@ -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,22 +31,34 @@ void send_packet() {
        }
 }
 
-void rx_int() {
-       if (sci_have_packet) return;
-       if (sci_rx_buf_ptr >= BUFFER_LEN) {
+void sci_rx_int() {
+       /* XXX FIXME we should do something about errors. nack? */
+       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];
-       if (sci_rx_buf[sci_rx_buf_ptr] == '\n') {
+       if (sci_rx_buf[sci_rx_buf_ptr] == '\n' ||
+                       sci_rx_buf[sci_rx_buf_ptr] == '\r') {
+               if (sci_rx_buf_ptr == 0) return; /* we've read a blank packet in */
                sci_rx_buf[sci_rx_buf_ptr] = '\0';
                sci_have_packet = 1;
                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();
+
+       if (_io_ports[M6811_SCSR] & M6811_OR)
+               _io_ports[M6811_SCDR]; /* declare it a lost cause */
 }
 
 void msg_clr() {
@@ -54,20 +66,12 @@ 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';
-       sci_tx_buf[2] = '\0';
+       my_strncpy(sci_tx_buf, "!\n", BUFFER_LEN);
        send_packet();
 }
 
 void send_nack() {
-       sci_tx_buf[0] = '?';
-       sci_tx_buf[1] = '\n';
-       sci_tx_buf[2] = '\0';
+       my_strncpy(sci_tx_buf, "?\n", BUFFER_LEN);
        send_packet();
 }

UCC git Repository :: git.ucc.asn.au