X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=ROM2%2Fsci.c;h=3241f23c2cd971b34b6a31f7705ebfe8b5ab1426;hb=8e227175f6eeb47fc66679478840dce339941f44;hp=39006bc0abc21277edfedba7e5a6be3e1660bfb6;hpb=b3523cf99eff476642609ad6537e460595f84e72;p=uccvend-snackrom.git diff --git a/ROM2/sci.c b/ROM2/sci.c index 39006bc..3241f23 100644 --- a/ROM2/sci.c +++ b/ROM2/sci.c @@ -1,11 +1,73 @@ #include "vend.h" #include "sci.h" +char sci_tx_buf[BUFFER_LEN]; +volatile char sci_rx_buf[BUFFER_LEN]; +volatile bool sci_have_packet; +volatile u8 sci_rx_buf_ptr; + void sci_init() { - _io_ports[M6811_BAUD] = M6811_DEF_BAUD; + /* assumes clock of 4.91Mhz */ + _io_ports[M6811_BAUD] = 0x03; /* 9600 baud */ + /* Setup character format 1 start, 8-bits, 1 stop. */ _io_ports[M6811_SCCR1] = 0; - /* Enable reciever and transmitter. */ - _io_ports[M6811_SCCR2] = 0xc; + /* Enable reciever and transmitter & rx interrupt. */ + _io_ports[M6811_SCCR2] = 0x2c; + + sci_have_packet = 0; + sci_rx_buf_ptr = 0; +} + +void send_packet() { + char* c; + for (c = sci_tx_buf; *c; c++) { + /* wait for TX ready */ + while (!(_io_ports[M6811_SCSR] & M6811_TDRE)); + + /* send byte */ + _io_ports[M6811_SCDR] = *c; + } +} + +void rx_int() { + if (sci_have_packet) return; + if (sci_rx_buf_ptr >= BUFFER_LEN) { + /* overrun :( */ + sci_rx_buf[BUFFER_LEN] = '\0'; + sci_have_packet = 1; + sci_rx_buf_ptr = 0; + 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] = '\0'; + sci_have_packet = 1; + sci_rx_buf_ptr = 0; + } + sci_rx_buf_ptr++; +} + +void msg_clr() { + sci_have_packet = 0; + 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'; + send_packet(); +} + +void send_nack() { + sci_tx_buf[0] = '?'; + sci_tx_buf[1] = '\n'; + sci_tx_buf[2] = '\0'; + send_packet(); }