diff --git a/cMIPS/serial.inp b/cMIPS/serial.inp
index 99a7b7ea4231cb60d075d62decfc74843d4c2855..4c217f34a0b7588d9cc2a11aa4697b7b579d3395 100644
--- a/cMIPS/serial.inp
+++ b/cMIPS/serial.inp
@@ -1,6 +1,8 @@
 
-abcdef
-012345
-pqrstu
-098765
+1
+2
+3
+4
+5
+2a
 
diff --git a/cMIPS/tests/jedidafu.c b/cMIPS/tests/jedidafu.c
index 84ddda76a82171d9e53416bb3e87845d82042e7e..876f38a14bb2bdd8774394a9ad06696746c7c08f 100644
--- a/cMIPS/tests/jedidafu.c
+++ b/cMIPS/tests/jedidafu.c
@@ -1,5 +1,7 @@
 #include "cMIPS.h"
+#include "../include/vetorFib.h"
 
+#define MAXPOW 7
 typedef struct UARTdriver {
 int rx_hd ; // reception queue head index
 int rx_tl ; // reception queue tail index
@@ -50,6 +52,7 @@ typedef struct serial {
   Tdata    d;
 } Tserial;
 
+  volatile Tserial *uart;  // tell GCC not to optimize away code
 char Getc () {
     char c ;
     if ( Ud.nrx > 0) {
@@ -60,17 +63,109 @@ char Getc () {
         Ud.rx_hd = (Ud.rx_hd + 1) & 15; // modulo 16
         enableInterr();
     } else {
-        c = 0;
+        c = -1;
     }
     return c ;
 }
 
+int proberx () {
+    return Ud.nrx;
+}
+int Strlen (char *c) {
+    int i= 0;
+    while(c[i++]-10);
+    return i-1;
+}
+
+int pow16 (int ex) {
+    int i, ret=1;
+    for (i= 0; i< ex/2; i++)
+        ret*=16;
+    ret *= ret;
+    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++) {
+        hex[i]-= 48; 
+        if (hex[i] > 9)
+            hex[i] -= 7;
+        if (hex[i] > 15) 
+            hex[i] -= 32; 
+        if(hex[i] < 0)
+            hex[i]=0;
+        ans += hex[i] * pow16(s-(i+1));
+    }   
+    return ans;
+}
+int int2hex (char *c, int i) {
+    int j= 0, val;
+    int p;
+    p = pow16(MAXPOW);
+    while (p > 0) {
+        val= 0;
+        if (i/p) {
+            val= i/p;
+            i%= p;
+        }
+        if ((val < 10) && (j || val)) { // impede que '0' sejam escritos à esquerda
+            c[j++] = val+'0';
+        }
+        else if (val > 9)
+            c[j++] = 'a'+ (val-10);
+        p/=16;
+    }   
+    c[j] = 10; 
+    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 Tserial *uart;  // tell GCC not to optimize away code
   volatile Tstatus status;
+  char filona[145], c;
+  int hdona=0;
+  int tlona=0;
+  int filonx = 0;
+  int valfib, qt;
+  char p[15];
   Tcontrol ctrl;
 
   uart = (void *)IO_UART_ADDR; // bottom of UART address range
@@ -78,7 +173,7 @@ int main(void) { // receive a string through the UART serial interface
   ctrl.ign   = 0;
   ctrl.rts   = 0;   // make RTS=0 to hold RemoteUnit
   ctrl.ign2  = 0;
-  ctrl.intTX = 0;
+  ctrl.intTX = 1;
   ctrl.intRX = 1;
   ctrl.speed = 1;   // operate at the second highest data rate
   uart->cs.ctl = ctrl;
@@ -88,26 +183,49 @@ int main(void) { // receive a string through the UART serial interface
   ctrl.ign   = 0;
   ctrl.rts   = 1;   // make RTS=1 to activate RemoteUnit
   ctrl.ign2  = 0;
-  ctrl.intTX = 0;
+  ctrl.intTX = 1;
   ctrl.intRX = 1;
   ctrl.speed = 1;   // operate at the second highest data rate
   uart->cs.ctl = ctrl;
-
+  Ud.ntx = 16;
   do {
     state = i = i+1;
-    while(Ud.rx_tl == Ud.rx_hd){ to_stdout('d'); state = 1- state;}
-
-    j = -1;
-    to_stdout('=');
-    do{
-        j = j + 1;
-        //to_stdout(Ud.rx_q[j]);
-        to_stdout(Getc());
-        if(Ud.rx_q[j] == '\n')
-            print(Ud.nrx); //nada ou string completa
-    }while(j<15);
-    to_stdout( '-');
-
+    while(!proberx()) to_stdout('-');//i = 1 - i;
+    to_stdout('\0');    
+    while((c=Getc()) != -1){
+       filona[tlona] = c;
+        tlona++;
+        if(c=='\n')
+            filonx++;
+        /*if(c=='\n'){
+            print(hex2int((filona+hdona)));
+            hdona = tlona;
+        }*/
+    }
+    while(filonx > 0){
+        qt = Strlen(filona+hdona);
+        valfib = hex2int((filona+hdona));
+        print(valfib);
+        valfib = buf[valfib];
+        print(valfib);
+        hdona += qt-1;
+        qt = int2hex(p, valfib);
+        j = -1;
+        do {
+            j++;
+            while(!Putc(p[j]));
+        } while (p[j] != 0);
+        filonx--;
+    }
+    /*for(j=0; j<145; j++) //isso aqui buga porque ele invalida os char quando hex2inteia
+        if(filona[j]==0 || filona[j]==10)
+            to_stdout('_');
+        else
+            to_stdout(filona[j]);
+    to_stdout('\0');
+    hdona = tlona; 
+    print(hex2int((filona+hdona)));*/
+    
   } while (i<5);
 
   return(state+i);