Lots of changes! Takes us to rom S
[uccvend-snackrom.git] / ROM2 / sci.c
index 668e865..d7c9f28 100644 (file)
@@ -5,6 +5,7 @@ char sci_tx_buf[BUFFER_LEN];
 volatile char sci_rx_buf[BUFFER_LEN];
 volatile bool sci_have_packet;
 volatile u8 sci_rx_buf_ptr;
+volatile bool sci_echo;
 
 void sci_init() {
        /* assumes clock of 4.91Mhz */
@@ -18,9 +19,10 @@ void sci_init() {
 
        sci_have_packet = 0;
        sci_rx_buf_ptr = 0;
+       sci_echo = 0;
 }
 
-void send_packet() {
+void send_buffer(bool crlf) {
        char* c;
        for (c = sci_tx_buf; *c; c++) {
                /* wait for TX ready */
@@ -29,28 +31,44 @@ void send_packet() {
                /* send byte */
                _io_ports[M6811_SCDR] = *c;
        }
+       if (!crlf) return;
+       /* send CRLF */
+       while (!(_io_ports[M6811_SCSR] & M6811_TDRE));
+       _io_ports[M6811_SCDR] = '\r';
+       while (!(_io_ports[M6811_SCSR] & M6811_TDRE));
+       _io_ports[M6811_SCDR] = '\n';
+}
+
+void send_string(char* c) {
+       for (; *c; c++) {
+               while (!(_io_ports[M6811_SCSR] & M6811_TDRE)); /* wait for TX ready */
+               _io_ports[M6811_SCDR] = *c; /* send byte */
+       }
 }
 
 void sci_rx_int() {
+       char buf = _io_ports[M6811_SCDR];
+       if (sci_echo) {
+               while (!(_io_ports[M6811_SCSR] & M6811_TDRE)); /* wait for TX ready */
+               _io_ports[M6811_SCDR] = buf; /* send byte */
+       }
+
        /* XXX FIXME we should do something about errors. nack? */
        if (sci_have_packet) {
                /* overrun :( */
-               _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' ||
-                       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] = buf;
+
+       if (buf == '\n' || buf == '\r') {
                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;
+
+       if (sci_rx_buf_ptr+1 < BUFFER_LEN)
+               sci_rx_buf_ptr++;
+       else {
+               sci_rx_buf[BUFFER_LEN-1] = '\0'; /* this is as much as we could fit */
        }
 }
 
@@ -67,11 +85,9 @@ void msg_clr() {
 }
 
 void send_ack() {
-       my_strncpy(sci_tx_buf, "!\n", BUFFER_LEN);
-       send_packet();
+       send_string("!" CRLF);
 }
 
 void send_nack() {
-       my_strncpy(sci_tx_buf, "?\n", BUFFER_LEN);
-       send_packet();
+       send_string("?" CRLF);
 }

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