diff --git a/cMIPS/include/cMIPS.h b/cMIPS/include/cMIPS.h
index f69e128ea5d46e8ed1354b68564e3a15695c0b60..ecf0eeee4e878b0ad51fc90ce18538fc62345eb4 100644
--- a/cMIPS/include/cMIPS.h
+++ b/cMIPS/include/cMIPS.h
@@ -57,6 +57,7 @@ extern int stopCount(void);
 extern int readCount(void);
 
 // LCD display (Macnica board)
+#define LCDprint(n) LCDint((n))
 extern void LCDinit(void);
 extern int  LCDprobe(void); 
 extern int  LCDset(int);
@@ -66,7 +67,9 @@ extern void LCDtopLine(void);
 extern void LCDbotLine(void);
 extern void LCDgotoxy(int, int);
 extern void LCDputc(char);
-extern void LCDprint(unsigned int);
+extern void LCDint(unsigned int);
+extern void LCDshort(unsigned short);
+extern void LCDchar(unsigned char);
 
 // 7-segment display and keyboard (Macnica board)
 extern void DSP7SEGput(int, int, int, int, int);
diff --git a/cMIPS/include/cMIPSio.c b/cMIPS/include/cMIPSio.c
index f83265d0d709475369a4d5170da815dc99710cb1..c21a1b07327782a410e4277cc9e7668c99f7b878 100644
--- a/cMIPS/include/cMIPSio.c
+++ b/cMIPS/include/cMIPSio.c
@@ -353,7 +353,7 @@ void LCDputc(char c) {
 #define conv(c) ((c<10)?((c)+0x30):((c)+('a'-10)))
 
 // write an integer to the display
-void LCDprint(unsigned int n) {
+void LCDint(unsigned int n) {
   int k;
 
   k = (n     >>28);
@@ -376,6 +376,32 @@ void LCDprint(unsigned int n) {
   k = (n<<28)>>28;
   LCDput( conv(k) );
 }
+
+// write a short to the display
+void LCDshort(unsigned short n) {
+  int k;
+
+  k = (n     >>12);
+  LCDput( conv(k) );
+  k = (n<< 4)>>12;
+  LCDput( conv(k) );
+
+  k = (n<< 8)>>12;
+  LCDput( conv(k) );
+  k = (n<<12)>>12;
+  LCDput( conv(k) );
+}
+
+// write a char to the display
+void LCDchar(unsigned char n) {
+  int k;
+
+  k = (n     >>4);
+  LCDput( conv(k) );
+  k = (n<< 4)>>4;
+  LCDput( conv(k) );
+}
+
 //-----------------------------------------------------------------------
 
 
diff --git a/cMIPS/tests/mac_uart_lb.c b/cMIPS/tests/mac_uart_lb.c
index fb8fb76835bd02512715e078a0c20cca313284cb..0a6ece38c675ed45ec2893d6f736d7cee8b50109 100644
--- a/cMIPS/tests/mac_uart_lb.c
+++ b/cMIPS/tests/mac_uart_lb.c
@@ -1,53 +1,22 @@
 //-------------------------------------------------------------------
 // loop-back test
 //   UART's input must be connected to UART's output for this to work
+//
+// clear LCD screen, light up BLUE led, wait for 2 seconds, then
+// send a string ('0'..'9') through the UART in loop-back mode
+//   write received characters to the LCD display
+// 7-segment displays the last UART's status (must be 0x40)
+//
+// on 30march2017 tested OK with speeds 2,4,7
+//
 //-------------------------------------------------------------------
 
 #include "cMIPS.h"
 
-typedef struct control { // control register fields (uses only ls byte)
-  int ign   : 24,        // ignore uppermost bits
-    rts     : 1,         // Request to Send
-    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)
-  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)
-  //  overun  : 1;        // overun 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
-} 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;
-
+#include "uart_defs.c"
 
 
+#if 0
 int strcopy(const char *y, char *x) {
   int i=0;
   while ( (*x++ = *y++) != '\0' ) // copy and check end-of-string
@@ -55,22 +24,28 @@ int strcopy(const char *y, char *x) {
   *x = '\0';
   return(i+1);
 }
+#endif
+
 
 // to remove code not needed for debugging at the simulator -> SYNTHESIS=0
 #define SYNTHESIS 1
 
-int main(void) { // receive a string through the UART, in loop back
-                 // and write it to the LCD display
+int main(void) {
+
   volatile Tserial *uart;  // tell GCC not to optimize away code
   volatile Tstatus status;
   Tcontrol ctrl;
-  int i,n;
+  int i,n,r,s;
   int state;
-  char s,r;
+  int *addr;
 
 #if SYNTHESIS
   LCDinit();
 
+  LCDclr();
+  DSP7SEGput( 0, 0, 0, 0, 1); // light up BLUE led
+  delay_ms(2000);             // wait 2 seconds
+
   LCDtopLine();
 
   LCDput(' ');
@@ -85,8 +60,6 @@ int main(void) { // receive a string through the UART, in loop back
   LCDput('r');
   LCDput('l');
   LCDput('d');
-
-  LCDbotLine();
 #else
   to_stdout('\n');
 #endif
@@ -98,42 +71,55 @@ int main(void) { // receive a string through the UART, in loop back
   ctrl.ign2  = 0;
   ctrl.intTX = 0;
   ctrl.intRX = 0;
-  ctrl.speed = 2;
+  ctrl.speed = 7;        // on 30march2017 tested for speed = {2,4,7}
   uart->cs.ctl = ctrl;
 
-  s = '0';
-  do {
-
-    while ( ( (state = uart->cs.stat.s) & TXempty ) == 0 )
-      { };
-    uart->d.tx = (int)s;
-
-    while ( ( (state = uart->cs.stat.s) & RXfull ) == 0 )
-      { };
-    r = (char)uart->d.rx;
+  // let us see the state
+  state = uart->cs.stat.rxFull;
+  LCDgotoxy(14,1);
+  LCDchar((unsigned char)state);
+  DSP7SEGput( state>>4 , 0, state & 0xf, 0, 4);
 
+  s = '0'; // start transmission from '0'
+  do {
+    i = 0;
+    while ( ( state = uart->cs.stat.txEmpty ) == 0 ) {
+      i = i+1;
+      LCDgotoxy(14,1);
+      LCDchar((unsigned char)state);
+      DSP7SEGput( state>>4 , 0, state & 0xf, 0, i & 0x07);
+    };
+    uart->d.tx = (int)s; // send out char
+
+    if (s == '0') 
+      LCDgotoxy(1,2);    // put cursor on second line
+    i = 0;
+    while ( ( state = uart->cs.stat.rxFull ) == 0 ) {
+      i = i+1;
+      DSP7SEGput( state>>4 , 0, state & 0xf, 0, i & 0x07);
+    };
+    r = uart->d.rx;      // get char from UART
+    
 #if SYNTHESIS
-    LCDput( r );
-
-    DSP7SEGput( state>>4 , 0, state & 0xf, 0);
-
-    cmips_delay(25000000);
+    LCDputc((unsigned char)r);  // send it to LCD display
+    DSP7SEGput( state>>4 , 0, state & 0xf, 0, r & 0x07);
 #else
     to_stdout(r);
 #endif
 
-    s = (char)((int)s +1);
+    s = (char)((int)s + 1);     // next ASCII algarism
 
   } while (s != ':');
 
 #if SYNTHESIS
-  LCDput( ' ' );
-  LCDput( 'z' );
+  addr = (int *)IO_UART_ADDR;  // get last state
+  state = *addr;               // must show 0x40 = TXempty, no errors
+  DSP7SEGput( state>>4 , 0, state & 0xf, 0, 0x02); // light up GREEN
 
-  do { } while (1 == 1);
+  do { delay_us(1) ; } while (1 == 1); // and wait forever
 #else
-    to_stdout('\n');
-    to_stdout('\n');
+  to_stdout('\n');
+  to_stdout('\n');
 #endif
 
   return 0;