From eee0c716a49698ab6f744a9f465b0ae5ec9996ee Mon Sep 17 00:00:00 2001
From: "Israel B. Sant'Anna" <ibsa14@inf.ufpr.br>
Date: Sat, 13 Jun 2015 20:36:29 -0300
Subject: [PATCH] Transmission kind of working (on a very weird way)

Signed-off-by: Israel B. Sant'Anna <ibsa14@inf.ufpr.br>
---
 cMIPS/serial.inp          |  4 ++-
 cMIPS/tests/handlerUART.s | 18 +++++++---
 cMIPS/tests/uart.c        | 75 +++++++++++++++++++++++----------------
 3 files changed, 60 insertions(+), 37 deletions(-)

diff --git a/cMIPS/serial.inp b/cMIPS/serial.inp
index ce14040..a751930 100644
--- a/cMIPS/serial.inp
+++ b/cMIPS/serial.inp
@@ -1,5 +1,7 @@
 0
-00
+11
 ffffffff
 7C2
 
+
+
diff --git a/cMIPS/tests/handlerUART.s b/cMIPS/tests/handlerUART.s
index 6b4a998..a0a0e3b 100644
--- a/cMIPS/tests/handlerUART.s
+++ b/cMIPS/tests/handlerUART.s
@@ -31,9 +31,9 @@ RX:
     nop
     sb    $k1, 0($a0)           # Put data on RX_queue tail
 
-    # lui $a0, %hi(x_IO_BASE_ADDR)
-    # ori $a0, $a0, %lo(x_IO_BASE_ADDR)
-    # sw  $k1, 0($a0)               # Print for debug
+    lui $a0, %hi(x_IO_BASE_ADDR)
+    ori $a0, $a0, %lo(x_IO_BASE_ADDR)
+    sw  $k1, 0($a0)               # Print for debug
 
 
 
@@ -46,6 +46,10 @@ TX:
 
     lw    $a1, 52($a0)          # Read ntx
 
+    # lui $k1, %hi(x_IO_BASE_ADDR)
+    # ori $k1, $k1, %lo(x_IO_BASE_ADDR)
+    # sw  $a1, 0($k1)               # Print for debug
+
     addiu $k1, $zero, 16
     slt   $k1, $a1, $k1         # If ntx < 16 there's something on the queue
     beq   $k1, $zero, END      
@@ -59,13 +63,17 @@ TX:
     andi  $k1, $k1, 15          # It's a circular queue so: (tx_hd+1)%16
     sw    $k1, 40($a0)          # Save tx_hd
 
-    addiu $a1, $a1, 24          # tx_hd position on tx_queue
+    # addiu $a1, $a1, 24          # tx_hd position on tx_queue
     add   $a0, $a1, $a0         # tx_queue head address
-    lbu   $a1, 0($a0)           # Read TX_queue head
+    lbu   $a1, 24($a0)           # Read TX_queue head
 
     lui   $a0, %hi(HW_uart_addr)
     ori   $a0, $a0, %lo(HW_uart_addr)
     sb    $a1, 4($a0)           # Put data on UART
 
+    # lui $a0, %hi(x_IO_BASE_ADDR)
+    # ori $a0, $a0, %lo(x_IO_BASE_ADDR)
+    # sw  $a1, 0($a0)               # Print for debug
+
 END:
 
diff --git a/cMIPS/tests/uart.c b/cMIPS/tests/uart.c
index 05455d5..6ca6fd5 100644
--- a/cMIPS/tests/uart.c
+++ b/cMIPS/tests/uart.c
@@ -74,32 +74,55 @@ int main(){
 
 
     ctrl.ign   = 0;
-    ctrl.intTX = 0;
+    ctrl.intTX = 1;
     ctrl.intRX = 1;
-    ctrl.speed = 2;        // operate at 1/2 of the highest data rate
+    ctrl.speed = 1;        // operate at 1/2 of the highest data rate
     uart->cs.ctl = ctrl;
 
     initUd();
-
-    c = getc();
-    while(c != '\0') {
+    int lol;
+    char last = EOF;
+    char first = EOF;
+    while(!((c = getc()) == '\n' && c == last)) {
+        last = c;
+        print(c);
         if(c != EOF) {
-            int n = 0;
-            while(c != '\n' && c != '\0') {
-                int h = ctoi(c);
-                if(h != EOF) {
-                    n = n*16 + h;         
-                }
-                c = getc();
+            if(!Putc(c)){
+                print(0);
+                while(!(TXempty&uart->cs.stat.s));
+                disableInterr();
+                first = Ud.tx_q[Ud.tx_hd];
+                Ud.tx_hd = (Ud.tx_hd+1)%16;
+                Ud.ntx++;
+                enableInterr();
+                uart->d.tx = first;
+                Putc(c);
             }
-            //If it's a negative hex make it a negative integer as well
-            n = 0x8000&n ? (int)(0x7FFF&n)-0x8000 : n;
-            print(n);
-            //while(!Putc(c)); // Wait till there's space on queue
         }
-        c = getc();
     }
-    Putc(c); // Sends EOF
+    // for(i=0;i<Ud.ntx;i++){
+    //     print(Ud.tx_q[i]);
+    // }
+    // to_stdout('\n');
+    //uart->d.tx = '\n'; //Send STX (Start of Text)
+    
+    // while((c = getc()) != '\0') {
+    //     if(c != EOF) {
+    //         // while(!Putc(c)); // Wait till there's space on queue
+    //         int n = 0;
+    //         while(c != '\n' && c != '\0') {
+    //             int h = ctoi(c);
+    //             if(h != EOF) {
+    //                 n = n*16 + h;         
+    //             }
+    //             c = getc();
+    //         }
+    //         //If it's a negative hex make it a negative integer as well
+    //         n = 0x8000&n ? (int)(0x7FFF&n)-0x8000 : n;
+    //         // print(n);
+    //     }
+    // }
+    // Putc(c); // Sends EOF
 
     return 0;
 }
@@ -114,37 +137,27 @@ void initUd(){
 }
 
 char getc(){
-    char c;
+    char c = EOF;
     if(Ud.nrx > 0){
         disableInterr();
         c = Ud.rx_q[Ud.rx_hd];
         Ud.rx_hd = (Ud.rx_hd+1)%16;
         Ud.nrx--;
         enableInterr();
-    }else{
-        c = EOF;
     }
     return c;
 }
 
 int Putc(char c){
-    int sent;
-    if(Ud.ntx == 16) {
-        uart->d.tx = c;
-        return 1;
-    }
-
     if(Ud.ntx > 0){
         disableInterr();
         Ud.tx_q[Ud.tx_tl] = c;
         Ud.tx_tl = (Ud.tx_tl+1)%16;
         Ud.ntx--;
         enableInterr();
-        sent = 1;
-    }else{
-        sent = 0;
+        return 1;
     }
-    return sent;
+    return 0;
 }
 
 int proberx(){
-- 
GitLab