diff options
author | blueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-04-20 19:35:25 +0000 |
---|---|---|
committer | blueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-04-20 19:35:25 +0000 |
commit | b9652ca3a5c027f8bc55323e0f6010f641479255 (patch) | |
tree | 695609b7dd060be084b8f839af09c8a11594f272 | |
parent | 19221bdaf816bc15dbc0c1a4b5594bf7a4ea2ce5 (diff) |
Fix keyboard serial and mouse bugs
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2709 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r-- | hw/slavio_serial.c | 44 |
1 files 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) |