To rom Q - COMPLETELY WORKS!
[uccvend-snackrom.git] / ROM2 / sci.c
1 #include "vend.h"
2 #include "sci.h"
3
4 char sci_tx_buf[BUFFER_LEN];
5 volatile char sci_rx_buf[BUFFER_LEN];
6 volatile bool sci_have_packet;
7 volatile u8 sci_rx_buf_ptr;
8
9 void sci_init() {
10         /* assumes clock of 4.91Mhz */
11         _io_ports[M6811_BAUD] = 0x03; /* 9600 baud */
12
13         /* Setup character format 1 start, 8-bits, 1 stop.  */
14         _io_ports[M6811_SCCR1] = 0;
15
16         /* Enable reciever and transmitter & rx interrupt.  */
17         _io_ports[M6811_SCCR2] = M6811_RIE | M6811_TE | M6811_RE;
18
19         sci_have_packet = 0;
20         sci_rx_buf_ptr = 0;
21 }
22
23 void send_packet() {
24         char* c;
25         for (c = sci_tx_buf; *c; c++) {
26                 /* wait for TX ready */
27                 while (!(_io_ports[M6811_SCSR] & M6811_TDRE));
28
29                 /* send byte */
30                 _io_ports[M6811_SCDR] = *c;
31         }
32 }
33
34 void sci_rx_int() {
35         /* XXX FIXME we should do something about errors. nack? */
36         if (sci_have_packet) {
37                 /* overrun :( */
38                 _io_ports[M6811_SCDR]; /* read it anyway */
39                 return;
40         }
41         sci_rx_buf[sci_rx_buf_ptr] = _io_ports[M6811_SCDR];
42         if (sci_rx_buf[sci_rx_buf_ptr] == '\n' ||
43                         sci_rx_buf[sci_rx_buf_ptr] == '\r') {
44                 if (sci_rx_buf_ptr == 0) return; /* we've read a blank packet in */
45                 sci_rx_buf[sci_rx_buf_ptr] = '\0';
46                 sci_have_packet = 1;
47                 sci_rx_buf_ptr = 0;
48         }
49         sci_rx_buf_ptr++;
50         if (sci_rx_buf_ptr >= BUFFER_LEN) {
51                 sci_rx_buf[BUFFER_LEN] = '\0'; /* this is as much as we could fit */
52                 sci_have_packet = 1;
53                 sci_rx_buf_ptr = 0;
54         }
55 }
56
57 void sci_interrupt_serial() {
58         if (_io_ports[M6811_SCSR] & M6811_RDRF) sci_rx_int();
59
60         if (_io_ports[M6811_SCSR] & M6811_OR)
61                 _io_ports[M6811_SCDR]; /* declare it a lost cause */
62 }
63
64 void msg_clr() {
65         sci_have_packet = 0;
66         sci_rx_buf_ptr = 0;
67 }
68
69 void send_ack() {
70         my_strncpy(sci_tx_buf, "!\n", BUFFER_LEN);
71         send_packet();
72 }
73
74 void send_nack() {
75         my_strncpy(sci_tx_buf, "?\n", BUFFER_LEN);
76         send_packet();
77 }

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