diff --git a/cMIPS/include/structUart.h b/cMIPS/include/structUart.h
index 1572b41bb2163200db5108e248deb13e9574967e..c2fa9080934f9ba3d81e9ecb6f3ef0032f247d94 100644
--- a/cMIPS/include/structUart.h
+++ b/cMIPS/include/structUart.h
@@ -2,18 +2,18 @@
 #define __STRUCTUART__
 
 typedef struct UARTdriver {
-int rx_hd ; // reception queue head index
-int rx_tl ; // reception queue tail index
-char rx_q [16]; // reception queue
-int tx_hd ; // transmission queue head index
-int tx_tl ; // transmission queue tail index
-char tx_q [16]; // transmission queue
-int nrx ; // number of characters in rx_queue
-int ntx ; // number of spaces in tx_queue
+    int rx_hd ; // reception queue head index
+    int rx_tl ; // reception queue tail index
+    char rx_q [16]; // reception queue
+    int tx_hd ; // transmission queue head index
+    int tx_tl ; // transmission queue tail index
+    char tx_q [16]; // transmission queue
+    int nrx ; // number of characters in rx_queue
+    int ntx ; // number of spaces in tx_queue
 } UARTdriver;
 
 typedef struct control { // control register fields (uses only ls byte)
-  int ign   : 24,        // ignore uppermost bits
+    unsigned int ign   : 24,        // ignore uppermost bits
     rts     : 1,         // Request to Send output (bit 7)
     ign2    : 2,         // bits 6,5 ignored
     intTX   : 1,         // interrupt on TX buffer empty (bit 4)
@@ -22,35 +22,29 @@ typedef struct control { // control register fields (uses only ls byte)
 } Tcontrol;
 
 typedef struct status { // status register fields (uses only ls byte)
-  int ign : 24,       // ignore uppermost bits
-  ign7    : 1,        // ignored (bit 7)
-  txEmpty : 1,        // TX register is empty (bit 6)
-  rxFull  : 1,        // octet available from RX register (bit 5)
-  int_TX_empt: 1,     // interrupt pending on TX empty (bit 4)
-  int_RX_full: 1,     // interrupt pending on RX full (bit 3)
-  ign2    : 1,        // ignored (bit 2)
-  framing : 1,        // framing error (bit 1)
-  overun  : 1;        // overun error (bit 0)
-} Tstatus;
+    unsigned int ign : 24,       // ignore uppermost bits
+    ign7    : 1,        // ignored (bit 7)
+    txEmpty : 1,        // TX register is empty (bit 6)
+    rxFull  : 1,        // octet available from RX register (bit 5)
+    int_TX_empt: 1,     // interrupt pending on TX empty (bit 4)
+    int_RX_full: 1,     // interrupt pending on RX full (bit 3)
+    ign2    : 1,        // ignored (bit 2)
+    framing : 1,        // framing error (bit 1)
+    overun  : 1;        // overun error (bit 0)
+}   Tstatus;
 
 typedef union ctlStat { // control + status on same address
-  Tcontrol  ctl;        // write-only
-  Tstatus   stat;       // read-only
+    Tcontrol  ctl;        // write-only
+    Tstatus   stat;       // read-only
 } TctlStat;
 
 typedef union data {    // data registers on same address
-  int tx;               // write-only
-  int rx;               // read-only
+    int tx;               // write-only
+    int rx;               // read-only
 } Tdata;
 
-/*****************************************************
-?typedef struct serial {                            **
-?  TctlStat cs;          // @ (int *)IO_UART_ADDR   **
-?}                                                  **
-*****************************************************/
-
 typedef struct serial {
-  TctlStat cs;          // @ (int *)IO_UART_ADDR
-  Tdata    d;           // @ (int *)(IO_UART_ADDR+1)
+    TctlStat cs;          // @ (int *)IO_UART_ADDR
+    Tdata    d;           // @ (int *)(IO_UART_ADDR+1)
 } Tserial;
 #endif
diff --git a/cMIPS/serial.inp b/cMIPS/serial.inp
index 15134bdec23a345e5987e25f1fd697d0a553d472..f98e928dd92f29a59385f0c3de6f5b395f9dd2e8 100644
--- a/cMIPS/serial.inp
+++ b/cMIPS/serial.inp
@@ -44,3 +44,4 @@ f
 2a
 2b
 
+
diff --git a/cMIPS/tests/handlerUART.s b/cMIPS/tests/handlerUART.s
index 68251591a599a6cb34c024ea31c1e83369d253ac..2c4d73912e3fe8009bd0e30cc5acf761aa8e0433 100644
--- a/cMIPS/tests/handlerUART.s
+++ b/cMIPS/tests/handlerUART.s
@@ -107,7 +107,7 @@ UARTrxinter:
 
 overrun:
     jal print
-    li $a0, 111
+    li $a0, 64017 
     # move $a0, $7
     # do something if rx queue is full or tx is empty
     # set overrun bit on uart statusReg
diff --git a/cMIPS/tests/jedidafu.c b/cMIPS/tests/jedidafu.c
index ec077d668472eb761480c1ae62c23f7d70bb4a90..eaa8b3bff79918ca29432468519b20a16cdbe108 100644
--- a/cMIPS/tests/jedidafu.c
+++ b/cMIPS/tests/jedidafu.c
@@ -1,58 +1,66 @@
 #include "cMIPS.h"
 #include "../include/vetorFib.h"
+#include "../include/structUart.h"
 
 #define MAXPOW 7
-typedef struct UARTdriver {
-int rx_hd ; // reception queue head index
-int rx_tl ; // reception queue tail index
-char rx_q [16]; // reception queue
-int tx_hd ; // transmission queue head index
-int tx_tl ; // transmission queue tail index
-char tx_q [16]; // transmission queue
-int nrx ; // number of characters in rx_queue
-int ntx ; // number of spaces in tx_queue
-} UARTdriver ;
+
 extern UARTdriver Ud ;
+volatile Tserial *uart;  // tell GCC not to optimize away code
+
+int proberx () {
+    return Ud.nrx;
+}
+
+int probetx () {
+    return Ud.ntx;
+}
 
+int ctrl_util(int speed, int trx, int ttx, int rts) {
+    int ctl = 0;
+    ctl |= speed;
+    ctl |= trx<<3;
+    ctl |= ttx<<4;
+    ctl |= rts<<6;
+    return ctl;
+}
+
+void ioctl(int ctl){  
+    Tcontrol aux;
+    aux.speed = ctl;
+    aux.intRX = ctl>>3;
+    aux.intTX = ctl>>4;
+    aux.rts = ctl>>6;
+    uart->cs.ctl= aux;
+}
+
+int iostat(){
+    int stat = 0;
+    stat |= uart->cs.stat.overun;
+    stat |= uart->cs.stat.framing<<1;
+    stat |= uart->cs.stat.int_RX_full<<3;
+    stat |= uart->cs.stat.int_TX_empt<<4;
+    stat |= uart->cs.stat.rxFull<<5;
+    stat |= uart->cs.stat.txEmpty<<6;
+    return stat;
+}
+
+int Putc (char c) {
+    int ntx = Ud.ntx;
+    if (ntx == 0)
+        return 0;
+    if (ntx == 16 && uart->cs.stat.txEmpty)  // Empty Q && Tx
+        uart->d.tx = (unsigned int) c;                   // 32-bits
+    else {                                      // Sending smthng
+        disableInterr();
+        Ud.ntx--;
+        // INCREMENTS AND THEN STORE
+        Ud.tx_tl = (Ud.tx_tl+1)&0xF;          // modulo 16
+        Ud.tx_q[Ud.tx_tl] = c;
+        enableInterr();
+    }
+    return 1;
+}
 
-typedef struct control { // control register fields (uses only ls byte)
-  int ign   : 24,        // ignore uppermost bits
-    rts     : 1,         // Request to Send output (bit 7)
-    ign2    : 2,         // bits 6,5 ignored
-    intTX   : 1,         // interrupt on TX buffer empty (bit 4)
-    intRX   : 1,         // interrupt on RX buffer full (bit 3)
-    speed   : 3;         // 4,8,16..256 tx-rx clock data rates  (bits 0..2)
-} Tcontrol;
-
-typedef struct status {  // status register fields (uses only ls byte)
-  unsigned int ign : 24, // ignore uppermost 3 bytes
-  cts     : 1,           // Clear To Send input=1 (bit 7)
-  txEmpty : 1,           // TX register is empty (bit 6)
-  rxFull  : 1,           // octet available from RX register (bit 5)
-  int_TX_empt: 1,        // interrupt pending on TX empty (bit 4)
-  int_RX_full: 1,        // interrupt pending on RX full (bit 3)
-  ign1    : 1,           // ignored (bit 2)
-  framing : 1,           // framing error (bit 1)
-  overun  : 1;           // overun error (bit 0)
-} Tstatus;
-
-
-typedef union ctlStat { // control + status on same address
-  Tcontrol  ctl;        // write-only
-  Tstatus   stat;       // read-only
-} TctlStat;
-
-typedef union data {    // data registers on same address
-  int tx;               // write-only
-  int rx;               // read-only
-} Tdata;
-
-typedef struct serial {
-  TctlStat cs;
-  Tdata    d;
-} Tserial;
-
-  volatile Tserial *uart;  // tell GCC not to optimize away code
 char Getc () {
     char c ;
     if ( Ud.nrx > 0) {
@@ -68,9 +76,6 @@ char Getc () {
     return c ;
 }
 
-int proberx () {
-    return Ud.nrx;
-}
 int Strlen (char *c) {
     int i= 0;
     while(c[i++]-10);
@@ -85,28 +90,9 @@ int pow16 (int ex) {
     return (ex%2?ret*16:ret);
 }
 
-int hex2int (char *hex) {
-    int s= Strlen(hex), i, ans= 0;
-    #if 0
-        Test Signal...
-    switch (hex[0]) {
-        case 'F':
-        case 'f':
-        case 'E':
-        case 'e':
-        case 'D':
-        case 'd':
-        case 'C':
-        case 'c':
-        case 'B':
-        case 'b':
-        case 'A':
-        case 'a':
-        case '9':
-            ans = hex[0]*pow16(s-1);
-    }
-    #endif
-    for (i= 0; i< s; i++) {
+int hex2int (int tam, char *hex) {
+    int i, ans= 0;
+    for (i = 0; i < tam; i++) {
         hex[i]-= 48; 
         if (hex[i] > 9)
             hex[i] -= 7;
@@ -114,10 +100,11 @@ int hex2int (char *hex) {
             hex[i] -= 32; 
         if(hex[i] < 0)
             hex[i]=0;
-        ans += hex[i] * pow16(s-(i+1));
+        ans += hex[i] * pow16(tam-(i+1));
     }   
     return ans;
 }
+
 int int2hex (char *c, int i) {
     int j= 0, val;
     int p;
@@ -138,105 +125,78 @@ int int2hex (char *c, int i) {
     c[j] = 0; 
     return j-1;
 }
-int Putc (char c) {
-    int ntx = Ud.ntx;
-    if (ntx == 0)
-        return 0;
-    if (ntx == 16 && uart->cs.stat.txEmpty)  // Empty Q && Tx
-        uart->d.tx = (unsigned int) c;                   // 32-bits
-    else {                                      // Sending smthng
-        disableInterr();
-        Ud.ntx--;
-        // INCREMENTS AND THEN STORE
-        Ud.tx_tl = (Ud.tx_tl+1)&0xF;          // modulo 16
-        Ud.tx_q[Ud.tx_tl] = c;
-        enableInterr();
-    }
-    return 1;
-}
+
 
 
 int main(void) { // receive a string through the UART serial interface
-  int i, j;
-  volatile int state;
-  volatile Tstatus status;
-  char filona[145], c;
-  int hdona=0;
-  int tlona=0;
-  int filonx = 0;
-  int valfib, qt, rxz, q;
-  char p[15];
-  Tcontrol ctrl;
-
-  uart = (void *)IO_UART_ADDR; // bottom of UART address range
-
-  ctrl.ign   = 0;
-  ctrl.rts   = 0;   // make RTS=0 to hold RemoteUnit
-  ctrl.ign2  = 0;
-  ctrl.intTX = 1;
-  ctrl.intRX = 1;
-  ctrl.speed = 2;   // operate at the second highest data rate
-  uart->cs.ctl = ctrl;
-
-  i = -1;
-
-  ctrl.ign   = 0;
-  ctrl.rts   = 1;   // make RTS=1 to activate RemoteUnit
-  ctrl.ign2  = 0;
-  ctrl.intTX = 1;
-  ctrl.intRX = 1;
-  ctrl.speed = 2;   // operate at the second highest data rate
-  uart->cs.ctl = ctrl;
-  Ud.ntx = 16;
-  do {
-    state = i = i+1;
-    // se tirar fode (b520 vira 15)
-    while(!proberx()) to_stdout('-');//i = 1 - i;
-    //to_stdout('\0');    
-    // es
-    while((c=Getc()) != -1){
-        filona[tlona] = c;
+    int i, j;
+    volatile int state;
+    volatile Tstatus status;
+    char filona[145], c;
+    int hdona=0;
+    int tlona=0;
+    int filonx = 0;
+    int valfib, qt, rxz, q;
+    int fim = 0;
+    char p[15];
+    Tcontrol ctrl;
+    uart = (void *)IO_UART_ADDR; // bottom of UART address range
+
+    i = -1;
+    ioctl(ctrl_util(2, 1, 1, 1));
+    Ud.ntx = 16;
+
+    do {
+        state = i = i+1;
         // se tirar fode (b520 vira 15)
-        to_stdout('*');
+        while(!proberx()) to_stdout('-');//i = 1 - i;
         //to_stdout('\0');    
         // es
-        tlona++;
-        tlona%=145;
-        if(c=='\n'){
-            filonx++;
-            filona[tlona] = 10;
+        while((c=Getc()) != -1){
+            filona[tlona] = c;
+            // se tirar fode (b520 vira 15)
+            to_stdout('*');
+            //to_stdout('\0');    
+            // es
+            tlona++;
+            tlona%=145;
+            if(c=='\n'){
+                filonx++;
+                filona[tlona] = 10;
+            }
         }
-    }
-    while(filonx > 0){
-        qt = Strlen(filona+hdona);
-        valfib = hex2int((filona+hdona));
-        valfib = buf[valfib];
-        hdona += qt+1;
-        hdona %= 145;
-        //print(valfib);
-        qt = int2hex(p, valfib);
-        j = -1;
-        do {
-            j++;
-            while(((rxz = proberx())<10) && !(q=Putc(p[j])));
-                     while((c=Getc()) != -1){
-                        filona[tlona] = c;
-                         tlona++;
-                         tlona%=145;
-                         if(c=='\n'){
-                             filonx++;
-                             filona[tlona] = 10;
-                         }
-                    }
-                    if(!q)                 
-                        j--;
-            
-        } while (p[j] != 0);
-        filonx--;
-    }
-    
-  } while (i<20);
+        while(filonx > 0){
+            qt = Strlen(filona+hdona);
+            valfib = hex2int(qt, (filona+hdona));
+            valfib = buf[valfib];
+            hdona += qt+1;
+            hdona %= 145;
+            qt = int2hex(p, valfib);
+            j = -1;
+            do {
+                j++;
+                while(((rxz = proberx())<10) && !(q=Putc(p[j])));
+                         while((c=Getc()) != -1){
+                            filona[tlona] = c;
+                             tlona++;
+                             tlona%=145;
+                             if(c=='\n'){
+                                 filonx++;
+                                 filona[tlona] = 10;
+                             }
+                        }
+                        if(!q)                 
+                            j--;
+                
+            } while (p[j] != 0);
+            filonx--;
+        }
+      if(filonx == 0 && !fim)
+          fim = 1;
+      else if (filonx == 0 && fim)
+          return state+i;
+    } while (i<20);
 
-  return(state+i);
+    return(state+i);
 
 }