diff --git a/cMIPS/tests/handlerUART.s b/cMIPS/tests/handlerUART.s
index be96b7922d802900cee5e330e1698db2d63daf48..45442b04c9c5ddd461d40897f868b191db0b59d7 100644
--- a/cMIPS/tests/handlerUART.s
+++ b/cMIPS/tests/handlerUART.s
@@ -1,7 +1,9 @@
     #--------------------------------------------------------------------------
     # interrupt handler for UART
-    #.set HW_uart_control,(x_IO_BASE_ADDR +  ? * x_IO_ADDR_RANGE)
-    .comm uart_control 56 #TODO setar endereço no MIPS p/ acessar no C
+    .global uart_control
+    .comm uart_control 56 #TODO setar endereço no MIPS p/ acessar no C (?)
+    # uart_control[0]=rx_queue, [16]=rx_hd, [20]=rx_tl, [24]=nrx,
+    #           [28]=tx_queue, [44]=tx_hd, [48]=tx_tl, [52]=ntx
 
 RX:
     andi  $a0, $k1, UART_rx_irq # Is this reception?
diff --git a/cMIPS/tests/uart.c b/cMIPS/tests/uart.c
index 62d9287937e9b3125ba618b29c9ff2865b68ab4c..e9f94dc37a8cdf71c338cdd8489d9542d4c48f5c 100644
--- a/cMIPS/tests/uart.c
+++ b/cMIPS/tests/uart.c
@@ -1,68 +1,68 @@
 #include "cMIPS.h"
 
-typedef struct control { // control register fields (uses only ls byte)
-  int ign   : 24+3,      // ignore uppermost bits
-    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)
+typedef struct control {   // control register fields (uses only ls byte)
+    int ign   : 24+3,      // ignore uppermost bits
+        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)
-  int s;
-  // 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)
-  //  overrun  : 1;      // overrun error (bit 0)
+typedef struct status {    // status register fields (uses only ls byte)
+    int s;
+    // 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)
+    //  overrun  : 1;      // overrun error (bit 0)
 } Tstatus;
 
 #define RXfull  0x00000020
 #define TXempty 0x00000040
 
 
-typedef union ctlStat {  // control + status on same address
-  Tcontrol  ctl;         // write-only
-  Tstatus   stat;        // read-only
+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
+typedef union data {       // data registers on same address
+    int tx;                // write-only
+    int rx;                // read-only
 } Tdata;
 
 typedef struct serial {
-  TctlStat cs;           // control & status at address UART + 0
-  Tdata    d;            // TX & RX registers at address UART + 4
+    TctlStat cs;           // control & status at address UART + 0
+    Tdata    d;            // TX & RX registers at address UART + 4
 } Tserial;
 
 typedef struct{
-  char rx_queue[16];
-  int rx_hd;
-  int rx_tl;
-  int nrx;               // characters in RX_queue
-  char tx_queue[16];
-  int tx_hd;
-  int tx_tl;
-  int ntx;               // spaces left in TX_queue
+    char rx_queue[16];
+    int rx_hd;
+    int rx_tl;
+    int nrx;               // characters in RX_queue
+    char tx_queue[16];
+    int tx_hd;
+    int tx_tl;
+    int ntx;               // spaces left in TX_queue
 } UartControl;
 
-int proberx(void);       // retorna nrx
-int probetx(void);       // retorna ntx
-int iostat(void);        // retorna inteiro com status no byte menos sign
-void ioctl(int);         // escreve byte menos sign no reg de controle
-char getc(void);         // retorna caractere na fila, decrementa nrx
-//void putc(char);         // insere caractere na fila, decrementa ntx
-int wrtc(char);          // escreve caractere diretamente em txreg
+int proberx(void);         // retorna nrx
+int probetx(void);         // retorna ntx
+int iostat(void);          // retorna inteiro com status no byte menos sign
+void ioctl(int);           // escreve byte menos sign no reg de controle
+char getc(void);           // retorna caractere na fila, decrementa nrx
+int uart_putc(char);            // insere caractere na fila, decrementa ntx
+int wrtc(char);            // escreve caractere diretamente em txreg
 
 extern UartControl uart_control;
 
 int main(void){
     int i;
-    volatile int state;  // tell GCC not to optimize away code
+    volatile int state;    // tell GCC not to optimize away code
     volatile Tserial *uart;
     volatile Tstatus status;
     Tcontrol ctrl;
@@ -72,8 +72,41 @@ int main(void){
     ctrl.ign   = 0;
     ctrl.intTX = 0;
     ctrl.intRX = 1;
-    ctrl.speed = 1;      // 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;
 
+    char c;
+    while((c=getc())!='\0')
+        uart_putc(c);
+
     return 0;
+}
+
+char getc(){
+    char c;
+    if(uart_control.nrx > 0){
+        c = uart_control.rx_queue[uart_control.rx_hd];
+        uart_control.rx_hd = (uart_control.rx_hd+1)%16;
+        disableInterr();
+        uart_control.nrx--;
+        enableInterr();
+    }else{
+        c = -1;
+    }
+    return c;
+}
+
+int uart_putc(char c){
+    int sent;
+    if(uart_control.ntx > 0){
+        uart_control.tx_queue[uart_control.tx_tl] = c;
+        uart_control.tx_tl = (uart_control.tx_tl+1)%16;
+        disableInterr();
+        uart_control.ntx--;
+        enableInterr();
+        sent = 1;
+    }else{
+        sent = 0;
+    }
+    return sent;
 }
\ No newline at end of file