Index: emu/ser.c
===================================================================
--- emu/ser.c	(revision 3c30832518143c8c449bb24c646119cd91cc8d89)
+++ emu/ser.c	(revision 375f7fb2b4c509558f2223f867053e394f849fa1)
@@ -37,5 +37,7 @@
 
 typedef struct {
-	bool irq;
+	bool irq_r;
+	bool irq_t;
+	bool rdr_ok;
 	uint8_t rdr;
 } state_t;
@@ -44,6 +46,6 @@
 
 static state_t state[] = {
-	{ .irq = false, .rdr = 0x00 },
-	{ .irq = false, .rdr = 0x00 }
+	{ .irq_r = false, .irq_t = false, .rdr_ok = false, .rdr = 0x00 },
+	{ .irq_r = false, .irq_t = false, .rdr_ok = false, .rdr = 0x00 }
 };
 
@@ -60,6 +62,7 @@
 static void out(int32_t un, uint8_t c)
 {
-	state[un].irq = true;
 	state[un].rdr = c;
+	state[un].rdr_ok = true;
+	state[un].irq_r = true;
 }
 
@@ -271,5 +274,5 @@
 {
 	ver3("ser exec");
-	return state[0].irq || state[1].irq;
+	return state[0].irq_r || state[0].irq_t || state[1].irq_r || state[1].irq_t;
 }
 
@@ -289,5 +292,7 @@
 	switch (rg) {
 	case REG_IER_ISR:
-		rv = (uint32_t)(0xc0 | (state[un].irq ? 0x01 : 0x00));
+		rv = (uint32_t)(0xc0 | (state[un].rdr_ok ? 0x01 : 0x00));
+		state[un].irq_r = false;
+		state[un].irq_t = false;
 		ver2("ISR[%d] 0x%02x", un, rv);
 		break;
@@ -295,5 +300,5 @@
 	case REG_TDR_RDR:
 		rv = state[un].rdr;
-		state[un].irq = false;
+		state[un].rdr_ok = false;
 		ver2("RDR[%d] 0x%02x", un, rv);
 		break;
@@ -322,4 +327,5 @@
 		ver2("TDR[%d] 0x%02x", un, val);
 		echo((uint8_t)val);
+		state[un].irq_t = true;
 		break;
 
