+ /* 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();