X-Git-Url: https://git.ucc.asn.au/?p=uccvend-snackrom.git;a=blobdiff_plain;f=ROM2%2Fsci.c;h=d7c9f287df6f4c84918681b88b159855b6ddaac0;hp=668e865d646e09a02dc0c18ca74aa0523a08a1de;hb=f5bc521c83d95d35e852747402a44d1411252c2b;hpb=17af89d1b2f699e0fc9dbe6132b6b8e0c6c81068 diff --git a/ROM2/sci.c b/ROM2/sci.c index 668e865..d7c9f28 100644 --- a/ROM2/sci.c +++ b/ROM2/sci.c @@ -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); }