xmodem support
[uccvend-snackrom.git] / ROM2 / sci.c
index d7c9f28..fe59f75 100644 (file)
@@ -5,7 +5,9 @@ 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 u8 sci_rx_buf_ptr_start;
 volatile bool sci_echo;
+bool sci_doing_xmodem;
 
 void sci_init() {
        /* assumes clock of 4.91Mhz */
@@ -19,7 +21,9 @@ void sci_init() {
 
        sci_have_packet = 0;
        sci_rx_buf_ptr = 0;
+       sci_rx_buf_ptr_start = 0;
        sci_echo = 0;
+       sci_doing_xmodem = 0;
 }
 
 void send_buffer(bool crlf) {
@@ -48,6 +52,16 @@ void send_string(char* c) {
 
 void sci_rx_int() {
        char buf = _io_ports[M6811_SCDR];
+       if (sci_doing_xmodem) {
+               if ((sci_rx_buf_ptr+1)%BUFFER_LEN == sci_rx_buf_ptr_start) {
+                       /* we drop following bytes :( */
+                       return;
+               }
+               sci_rx_buf[sci_rx_buf_ptr] = buf;
+               sci_rx_buf_ptr++;
+               sci_rx_buf_ptr %= BUFFER_LEN;
+               return;
+       }
        if (sci_echo) {
                while (!(_io_ports[M6811_SCSR] & M6811_TDRE)); /* wait for TX ready */
                _io_ports[M6811_SCDR] = buf; /* send byte */
@@ -91,3 +105,25 @@ void send_ack() {
 void send_nack() {
        send_string("?" CRLF);
 }
+
+u16 sci_timer;
+void serial_rti() { /* called every 6.6 ms */
+       if (sci_timer) sci_timer--;
+}
+
+/* for gdb compatibility */
+int serial_readchar(u8 timeout) {
+       sci_timer = timeout * 152;
+       while (sci_timer && sci_rx_buf_ptr_start == sci_rx_buf_ptr); /* spin */
+       if (sci_timer == 0) return SERIAL_TIMEOUT;
+       return sci_rx_buf[sci_rx_buf_ptr_start++];
+}
+
+void serial_write(const char *str, int len) {
+       char *c, *end;
+       end = (char*)(str + len);
+       for (c = (char*)str; c < end; c++) {
+               while (!(_io_ports[M6811_SCSR] & M6811_TDRE)); /* wait for TX ready */
+               _io_ports[M6811_SCDR] = *c; /* send byte */
+       }
+}

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