Commit f69a86955e028f963ae31257bd6cb25be705a6cd
1 parent
7b936c0c
slavio_serial fixes (Blue Swirl)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1575 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
4 additions
and
4 deletions
hw/slavio_serial.c
@@ -195,7 +195,7 @@ static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint | @@ -195,7 +195,7 @@ static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint | ||
195 | val &= 0x38; | 195 | val &= 0x38; |
196 | switch (val) { | 196 | switch (val) { |
197 | case 8: | 197 | case 8: |
198 | - s->reg |= 0x8; | 198 | + newreg |= 0x8; |
199 | break; | 199 | break; |
200 | case 0x20: | 200 | case 0x20: |
201 | s->rxint = 0; | 201 | s->rxint = 0; |
@@ -245,7 +245,8 @@ static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint | @@ -245,7 +245,8 @@ static void slavio_serial_mem_writeb(void *opaque, target_phys_addr_t addr, uint | ||
245 | handle_kbd_command(s, val); | 245 | handle_kbd_command(s, val); |
246 | } | 246 | } |
247 | s->txint = 1; | 247 | s->txint = 1; |
248 | - s->rregs[0] |= 4; | 248 | + s->rregs[0] |= 4; // Tx buffer empty |
249 | + s->rregs[1] |= 1; // All sent | ||
249 | // Interrupts reported only on channel A | 250 | // Interrupts reported only on channel A |
250 | if (s->chn == 0) | 251 | if (s->chn == 0) |
251 | s->rregs[3] |= 0x10; | 252 | s->rregs[3] |= 0x10; |
@@ -278,12 +279,12 @@ static uint32_t slavio_serial_mem_readb(void *opaque, target_phys_addr_t addr) | @@ -278,12 +279,12 @@ static uint32_t slavio_serial_mem_readb(void *opaque, target_phys_addr_t addr) | ||
278 | s->reg = 0; | 279 | s->reg = 0; |
279 | return ret; | 280 | return ret; |
280 | case 1: | 281 | case 1: |
281 | - SER_DPRINTF("Read channel %c, ch %d\n", channel? 'b' : 'a', s->rx); | ||
282 | s->rregs[0] &= ~1; | 282 | s->rregs[0] &= ~1; |
283 | if (s->type == kbd) | 283 | if (s->type == kbd) |
284 | ret = get_queue(s); | 284 | ret = get_queue(s); |
285 | else | 285 | else |
286 | ret = s->rx; | 286 | ret = s->rx; |
287 | + SER_DPRINTF("Read channel %c, ch %d\n", channel? 'b' : 'a', ret); | ||
287 | return ret; | 288 | return ret; |
288 | default: | 289 | default: |
289 | break; | 290 | break; |
@@ -454,7 +455,6 @@ static void handle_kbd_command(ChannelState *s, int val) | @@ -454,7 +455,6 @@ static void handle_kbd_command(ChannelState *s, int val) | ||
454 | switch (val) { | 455 | switch (val) { |
455 | case 1: // Reset, return type code | 456 | case 1: // Reset, return type code |
456 | put_queue(s, 0xff); | 457 | put_queue(s, 0xff); |
457 | - put_queue(s, 0xff); | ||
458 | put_queue(s, 5); // Type 5 | 458 | put_queue(s, 5); // Type 5 |
459 | break; | 459 | break; |
460 | case 7: // Query layout | 460 | case 7: // Query layout |