From b9652ca3a5c027f8bc55323e0f6010f641479255 Mon Sep 17 00:00:00 2001
From: blueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162>
Date: Fri, 20 Apr 2007 19:35:25 +0000
Subject: [PATCH] Fix keyboard serial and mouse bugs

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2709 c046a42c-6fe2-441c-8c8c-71466251a162
---
 hw/slavio_serial.c | 44 +++++++++++++++++++++++++++++---------------
 1 file changed, 29 insertions(+), 15 deletions(-)

diff --git a/hw/slavio_serial.c b/hw/slavio_serial.c
index 54debce4a5..0e3a622dbe 100644
--- a/hw/slavio_serial.c
+++ b/hw/slavio_serial.c
@@ -222,8 +222,6 @@ static inline void clr_rxint(ChannelState *s)
     }
     if (s->txint)
         set_txint(s);
-    else
-        s->rregs[2] = 6;
     slavio_serial_update_irq(s);
 }
 
@@ -237,30 +235,39 @@ static inline void set_rxint(ChannelState *s)
                 s->otherchn->rregs[2] = 0x30;
             else
                 s->otherchn->rregs[2] = 0x0c;
-            s->rregs[3] |= 0x20;
         } else {
             if (s->wregs[9] & 0x10)
                 s->rregs[2] = 0x20;
             else
                 s->rregs[2] = 0x04;
-            s->otherchn->rregs[3] |= 4;
         }
-        slavio_serial_update_irq(s);
     }
+    if (s->chn == chn_a)
+        s->rregs[3] |= 0x20;
+    else
+        s->otherchn->rregs[3] |= 4;
+    slavio_serial_update_irq(s);
 }
 
 static inline void clr_txint(ChannelState *s)
 {
     s->txint = 0;
     s->txint_under_svc = 0;
-    if (s->chn == chn_a)
+    if (s->chn == chn_a) {
+        if (s->wregs[9] & 0x10)
+            s->otherchn->rregs[2] = 0x60;
+        else
+            s->otherchn->rregs[2] = 0x06;
         s->rregs[3] &= ~0x10;
-    else
+    } else {
+        if (s->wregs[9] & 0x10)
+            s->rregs[2] = 0x60;
+        else
+            s->rregs[2] = 0x06;
         s->otherchn->rregs[3] &= ~2;
+    }
     if (s->rxint)
         set_rxint(s);
-    else
-        s->rregs[2] = 6;
     slavio_serial_update_irq(s);
 }
 
@@ -269,13 +276,20 @@ static inline void set_txint(ChannelState *s)
     s->txint = 1;
     if (!s->rxint_under_svc) {
         s->txint_under_svc = 1;
-        if (s->chn == chn_a)
-            s->rregs[3] |= 0x10;
-        else
-            s->otherchn->rregs[3] |= 2;
-        s->rregs[2] = 0;
-        slavio_serial_update_irq(s);
+        if (s->chn == chn_a) {
+            if (s->wregs[9] & 0x10)
+                s->otherchn->rregs[2] = 0x10;
+            else
+                s->otherchn->rregs[2] = 0x08;
+        } else {
+            s->rregs[2] = 0;
+        }
     }
+    if (s->chn == chn_a)
+        s->rregs[3] |= 0x10;
+    else
+        s->otherchn->rregs[3] |= 2;
+    slavio_serial_update_irq(s);
 }
 
 static void slavio_serial_update_parameters(ChannelState *s)
-- 
2.30.2