diff --git a/sim/erc32/erc32.c b/sim/erc32/erc32.c
index 80601ef..04c40ee 100644
--- a/sim/erc32/erc32.c
+++ b/sim/erc32/erc32.c
@@ -22,6 +22,7 @@
 /* The control space devices */
 
 #include "config.h"
+#include <errno.h>
 #include <sys/types.h>
 #include <stdio.h>
 #include <string.h>
@@ -38,7 +39,7 @@ extern int32    sparclite, sparclite_board;
 extern int      rom8,wrp,uben;
 extern char     uart_dev1[], uart_dev2[];
 
-int dumbio = 0; /* normal, smart, terminal oriented IO by default */
+static int tty_setup = 1; /* default setup if not a tty */
 
 /* MEC registers */
 #define MEC_START 	0x01f80000
@@ -296,12 +297,15 @@ static void	store_bytes (unsigned char *mem, uint32 waddr,
 
 extern int	ext_irl;
 
+static host_callback *callback;
+
 
 /* One-time init */
 
 void
 init_sim()
 {
+    callback = sim_callback;
     port_init();
 }
 
@@ -938,44 +942,49 @@ void
 init_stdio()
 {
     if (dumbio)
-        return; /* do nothing */
-    if (!ifd1)
+	return; /* do nothing */
+    if (ifd1 == 0 && f1open) {
 	tcsetattr(0, TCSANOW, &ioc1);
-    if (!ifd2)
+	tcflush (ifd1, TCIFLUSH);
+    }
+    if (ifd2 == 0 && f1open) {
 	tcsetattr(0, TCSANOW, &ioc2);
+	tcflush (ifd2, TCIFLUSH);
+    }
 }
 
 void
 restore_stdio()
 {
     if (dumbio)
-        return; /* do nothing */
-    if (!ifd1)
+	return; /* do nothing */
+    if (ifd1 == 0 && f1open && tty_setup)
 	tcsetattr(0, TCSANOW, &iocold1);
-    if (!ifd2)
+    if (ifd2 == 0 && f2open && tty_setup)
 	tcsetattr(0, TCSANOW, &iocold2);
 }
 
 #define DO_STDIO_READ( _fd_, _buf_, _len_ )          \
-             ( dumbio                                \
-               ? (0) /* no bytes read, no delay */   \
-               : read( _fd_, _buf_, _len_ ) )
-
+	( dumbio || nouartrx \
+	? (0) /* no bytes read, no delay */   \
+	: (_fd_) == 1 && callback ? \
+	callback->read_stdin (callback, _buf_, _len_) :  \
+	read( _fd_, _buf_, _len_ ) )
 
 static void
 port_init()
 {
 
     if (uben) {
-    f2in = stdin;
-    f1in = NULL;
-    f2out = stdout;
-    f1out = NULL;
+	f2in = stdin;
+	f1in = NULL;
+	f2out = stdout;
+	f1out = NULL;
     } else {
-    f1in = stdin;
-    f2in = NULL;
-    f1out = stdout;
-    f2out = NULL;
+	f1in = stdin;
+	f2in = NULL;
+	f1out = stdout;
+	f2out = NULL;
     }
     if (uart_dev1[0] != 0)
 	if ((fd1 = open(uart_dev1, O_RDWR | O_NONBLOCK)) < 0) {
@@ -987,23 +996,29 @@ port_init()
 	    setbuf(f1out, NULL);
 	    f1open = 1;
 	}
-    if (f1in) ifd1 = fileno(f1in);
+    if (f1in)
+	ifd1 = fileno(f1in);
     if (ifd1 == 0) {
+        if (callback && !callback->isatty (callback, ifd1))
+	    tty_setup = 0;
 	if (sis_verbose)
 	    printf("serial port A on stdin/stdout\n");
         if (!dumbio) {
-            tcgetattr(ifd1, &ioc1);
-            iocold1 = ioc1;
-            ioc1.c_lflag &= ~(ICANON | ECHO);
-            ioc1.c_cc[VMIN] = 0;
-            ioc1.c_cc[VTIME] = 0;
+	    tcgetattr (ifd1, &ioc1);
+	    if (tty_setup) {
+		iocold1 = ioc1;
+		ioc1.c_lflag &= ~(ICANON | ECHO);
+		ioc1.c_cc[VMIN] = 0;
+		ioc1.c_cc[VTIME] = 0;
+	    }
         }
 	f1open = 1;
     }
 
     if (f1out) {
 	ofd1 = fileno(f1out);
-    	if (!dumbio && ofd1 == 1) setbuf(f1out, NULL);
+	if (!dumbio && tty_setup && ofd1 == 1)
+	    setbuf (f1out, NULL);
     }
 
     if (uart_dev2[0] != 0)
@@ -1022,17 +1037,20 @@ port_init()
 	    printf("serial port B on stdin/stdout\n");
         if (!dumbio) {
             tcgetattr(ifd2, &ioc2);
-            iocold2 = ioc2;
-            ioc2.c_lflag &= ~(ICANON | ECHO);
-            ioc2.c_cc[VMIN] = 0;
-            ioc2.c_cc[VTIME] = 0;
+            if (tty_setup) {
+		iocold2 = ioc2;
+		ioc2.c_lflag &= ~(ICANON | ECHO);
+		ioc2.c_cc[VMIN] = 0;
+		ioc2.c_cc[VTIME] = 0;
+	    }
         }
 	f2open = 1;
     }
 
     if (f2out) {
 	ofd2 = fileno(f2out);
-        if (!dumbio && ofd2 == 1) setbuf(f2out, NULL);
+	if (!dumbio && tty_setup && ofd2 == 1)
+	    setbuf (f2out, NULL);
     }
 
     wnuma = wnumb = 0;
@@ -1058,9 +1076,10 @@ read_uart(addr)
 		mec_irq(4);
 	    return (0x700 | (uint32) aq[aind++]);
 	} else {
-	    if (f1open) {
-	        anum = DO_STDIO_READ(ifd1, aq, UARTBUF);
-	    }
+	    if (f1open)
+		anum = DO_STDIO_READ(ifd1, aq, UARTBUF);
+	    else
+		anum = 0;
 	    if (anum > 0) {
 		aind = 0;
 		if ((aind + 1) < anum)
@@ -1090,9 +1109,10 @@ read_uart(addr)
 		mec_irq(5);
 	    return (0x700 | (uint32) bq[bind++]);
 	} else {
-	    if (f2open) {
+	    if (f2open)
 		bnum = DO_STDIO_READ(ifd2, bq, UARTBUF);
-	    }
+	    else
+		bnum = 0;
 	    if (bnum > 0) {
 		bind = 0;
 		if ((bind + 1) < bnum)
@@ -1122,9 +1142,10 @@ read_uart(addr)
 	if (aind < anum) {
 	    Ucontrol |= 0x00000001;
 	} else {
-	    if (f1open) {
-	        anum = DO_STDIO_READ(ifd1, aq, UARTBUF);
-            }
+	    if (f1open)
+		anum = DO_STDIO_READ(ifd1, aq, UARTBUF);
+	    else
+		anum = 0;
 	    if (anum > 0) {
 		Ucontrol |= 0x00000001;
 		aind = 0;
@@ -1134,9 +1155,10 @@ read_uart(addr)
 	if (bind < bnum) {
 	    Ucontrol |= 0x00010000;
 	} else {
-	    if (f2open) {
+	    if (f2open)
 		bnum = DO_STDIO_READ(ifd2, bq, UARTBUF);
-	    }
+	    else
+		bnum = 0;
 	    if (bnum > 0) {
 		Ucontrol |= 0x00010000;
 		bind = 0;
@@ -1177,9 +1199,13 @@ write_uart(addr, data)
 	    if (wnuma < UARTBUF)
 	        wbufa[wnuma++] = c;
 	    else {
-	        while (wnuma)
-		    wnuma -= fwrite(wbufa, 1, wnuma, f1out);
-	        wbufa[wnuma++] = c;
+	        while (wnuma) {
+		    if (ofd1 == 1 && callback)
+			wnuma -= callback->write_stdout (callback, wbufa, wnuma);
+		    else
+			wnuma -= fwrite (wbufa, 1, wnuma, f1out);
+		}
+		wbufa[wnuma++] = c;
 	    }
 	}
 	mec_irq(4);
@@ -1201,8 +1227,12 @@ write_uart(addr, data)
 	    if (wnumb < UARTBUF)
 		wbufb[wnumb++] = c;
 	    else {
-		while (wnumb)
-		    wnumb -= fwrite(wbufb, 1, wnumb, f2out);
+		while (wnumb) {
+		    if (ofd1 == 1 && callback)
+			wnumb -= callback->write_stdout (callback, wbufb, wnumb);
+		    else
+			wnumb -= fwrite (wbufb, 1, wnumb, f2out);
+		}
 		wbufb[wnumb++] = c;
 	    }
 	}
@@ -1240,10 +1270,20 @@ write_uart(addr, data)
 static void
 flush_uart()
 {
-    while (wnuma && f1open)
-	wnuma -= fwrite(wbufa, 1, wnuma, f1out);
-    while (wnumb && f2open)
-	wnumb -= fwrite(wbufb, 1, wnumb, f2out);
+    while (wnuma && f1open) {
+	if (ofd1 == 1 && callback) {
+	    wnuma -= callback->write_stdout (callback, wbufa, wnuma);
+	    callback->flush_stdout (callback);
+	} else
+	    wnuma -= fwrite (wbufa, 1, wnuma, f1out);
+    }
+    while (wnumb && f2open) {
+	if (ofd2 == 1 && callback) {
+	    wnuma -= callback->write_stdout (callback, wbufb, wnuma);
+	    callback->flush_stdout (callback);
+	} else
+	wnumb -= fwrite (wbufb, 1, wnumb, f2out);
+    }
 }
 
 
@@ -1251,8 +1291,14 @@ flush_uart()
 static void
 uarta_tx()
 {
-
-    while (f1open && fwrite(&uarta_sreg, 1, 1, f1out) != 1);
+    while (f1open) {
+	if (ofd1 == 1 && callback)
+	    while (callback->write_stdout (callback, &uarta_sreg, 1) != 1)
+		continue;
+	else
+	    while (fwrite (&uarta_sreg, 1, 1, f1out) != 1)
+		continue;
+    }
     if (uart_stat_reg & UARTA_HRE) {
 	uart_stat_reg |= UARTA_SRE;
     } else {
@@ -1266,7 +1312,14 @@ uarta_tx()
 static void
 uartb_tx()
 {
-    while (f2open && fwrite(&uartb_sreg, 1, 1, f2out) != 1);
+    while (f2open) {
+	if (ofd2 == 1 && callback)
+	    while (callback->write_stdout (callback, &uarta_sreg, 1) != 1)
+		continue;
+	else
+	    while (fwrite(&uartb_sreg, 1, 1, f2out) != 1)
+		continue;
+    }
     if (uart_stat_reg & UARTB_HRE) {
 	uart_stat_reg |= UARTB_SRE;
     } else {
@@ -1288,6 +1341,8 @@ uart_rx(arg)
     rsize = 0;
     if (f1open)
         rsize = DO_STDIO_READ(ifd1, &rxd, 1);
+    else
+        rsize = 0;
     if (rsize > 0) {
 	uarta_data = UART_DR | rxd;
 	if (uart_stat_reg & UARTA_HRE)
@@ -1304,6 +1359,8 @@ uart_rx(arg)
     rsize = 0;
     if (f2open)
         rsize = DO_STDIO_READ(ifd2, &rxd, 1);
+    else
+        rsize = 0;
     if (rsize) {
 	uartb_data = UART_DR | rxd;
 	if (uart_stat_reg & UARTB_HRE)
diff --git a/sim/erc32/func.c b/sim/erc32/func.c
index 7bea3aa..fae4228 100644
--- a/sim/erc32/func.c
+++ b/sim/erc32/func.c
@@ -32,6 +32,7 @@
 
 #define	VAL(x)	strtoul(x,(char **)NULL,0)
 
+int dumbio = 0; /* normal, smart, terminal oriented IO by default */
 struct disassemble_info dinfo;
 struct pstate   sregs;
 extern struct estate ebase;
@@ -50,6 +51,8 @@ char            uart_dev1[128] = "";
 char            uart_dev2[128] = "";
 extern	int	ext_irl;
 uint32		last_load_addr = 0;
+int		nouartrx = 0;
+host_callback 	*sim_callback;
 
 #ifdef ERRINJ
 uint32		errcnt = 0;
diff --git a/sim/erc32/interf.c b/sim/erc32/interf.c
index 3e58e4c..3abfe3e 100644
--- a/sim/erc32/interf.c
+++ b/sim/erc32/interf.c
@@ -60,8 +60,6 @@ extern char     uart_dev1[], uart_dev2[];
 
 int             sis_gdb_break = 1;
 
-host_callback *sim_callback;
-
 int
 run_sim(sregs, icount, dis)
     struct pstate  *sregs;
@@ -196,6 +194,9 @@ sim_open (kind, callback, abfd, argv)
             if (strcmp(argv[stat], "-dumbio") == 0) {
 		dumbio = 1;
 	    } else
+            if (strcmp(argv[stat], "-nouartrx") == 0) {
+		nouartrx = 1;
+	    } else
             if (strcmp(argv[stat], "-wrp") == 0) {
                 wrp = 1;
 	    } else
diff --git a/sim/erc32/sis.c b/sim/erc32/sis.c
index 92880e1..51ba901 100644
--- a/sim/erc32/sis.c
+++ b/sim/erc32/sis.c
@@ -202,6 +202,8 @@ main(argc, argv)
 #endif
             } else if (strcmp(argv[stat], "-dumbio") == 0) {
 		dumbio = 1;
+            } else if (strcmp(argv[stat], "-nouartrx") == 0) {
+		nouartrx = 1;
             } else if (strcmp(argv[stat], "-v") == 0) {
 		sis_verbose += 1;
 	    } else {
diff --git a/sim/erc32/sis.h b/sim/erc32/sis.h
index 99ae347..11a17f1 100644
--- a/sim/erc32/sis.h
+++ b/sim/erc32/sis.h
@@ -206,6 +206,10 @@ extern void	sys_reset (void);
 extern void	sys_halt (void);
 extern int	bfd_load (const char *fname);
 extern double	get_time (void);
+extern int	nouartrx;
+extern		host_callback *sim_callback;
+extern int	dumbio;
+
 
 /* exec.c */
 extern int	dispatch_instruction (struct pstate *sregs);
