From b9652ca3a5c027f8bc55323e0f6010f641479255 Mon Sep 17 00:00:00 2001 From: blueswir1 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)