Fixed handshaking in XT & Amstrad keyboards - no more stuck keys.

This commit is contained in:
TomW 2014-01-03 16:16:23 +00:00
commit 61d987e4f2
2 changed files with 12 additions and 8 deletions

View file

@ -22,6 +22,7 @@ struct
{ {
int wantirq; int wantirq;
uint8_t key_waiting;
uint8_t pa; uint8_t pa;
uint8_t pb; uint8_t pb;
} keyboard_amstrad; } keyboard_amstrad;
@ -37,13 +38,14 @@ void keyboard_amstrad_poll()
if (keyboard_amstrad.wantirq) if (keyboard_amstrad.wantirq)
{ {
keyboard_amstrad.wantirq = 0; keyboard_amstrad.wantirq = 0;
keyboard_amstrad.pa = keyboard_amstrad.key_waiting;
picint(2); picint(2);
pclog("keyboard_amstrad : take IRQ\n"); pclog("keyboard_amstrad : take IRQ\n");
} }
if (key_queue_start != key_queue_end) if (key_queue_start != key_queue_end && !keyboard_amstrad.pa)
{ {
keyboard_amstrad.pa = key_queue[key_queue_start]; keyboard_amstrad.key_waiting = key_queue[key_queue_start];
pclog("Reading %02X from the key queue at %i\n", keyboard_amstrad.pa, key_queue_start); pclog("Reading %02X from the key queue at %i\n", keyboard_amstrad.key_waiting, key_queue_start);
key_queue_start = (key_queue_start + 1) & 0xf; key_queue_start = (key_queue_start + 1) & 0xf;
keyboard_amstrad.wantirq = 1; keyboard_amstrad.wantirq = 1;
} }
@ -120,7 +122,7 @@ uint8_t keyboard_amstrad_read(uint16_t port, void *priv)
} }
else else
{ {
keyboard_amstrad.pa = key_queue[key_queue_start]; keyboard_amstrad.key_waiting = key_queue[key_queue_start];
key_queue_start = (key_queue_start + 1) & 0xf; key_queue_start = (key_queue_start + 1) & 0xf;
keyboard_amstrad.wantirq = 1; keyboard_amstrad.wantirq = 1;
} }

View file

@ -20,6 +20,7 @@
struct struct
{ {
int wantirq; int wantirq;
uint8_t key_waiting;
uint8_t pa; uint8_t pa;
uint8_t pb; uint8_t pb;
@ -34,13 +35,14 @@ void keyboard_xt_poll()
if (keyboard_xt.wantirq) if (keyboard_xt.wantirq)
{ {
keyboard_xt.wantirq = 0; keyboard_xt.wantirq = 0;
keyboard_xt.pa = keyboard_xt.key_waiting;
picint(2); picint(2);
pclog("keyboard_xt : take IRQ\n"); pclog("keyboard_xt : take IRQ\n");
} }
if (key_queue_start != key_queue_end) if (key_queue_start != key_queue_end && !keyboard_xt.pa)
{ {
keyboard_xt.pa = key_queue[key_queue_start]; keyboard_xt.key_waiting = key_queue[key_queue_start];
pclog("Reading %02X from the key queue at %i\n", keyboard_xt.pa, key_queue_start); pclog("Reading %02X from the key queue at %i\n", keyboard_xt.key_waiting, key_queue_start);
key_queue_start = (key_queue_start + 1) & 0xf; key_queue_start = (key_queue_start + 1) & 0xf;
keyboard_xt.wantirq = 1; keyboard_xt.wantirq = 1;
} }
@ -112,7 +114,7 @@ uint8_t keyboard_xt_read(uint16_t port, void *priv)
} }
else else
{ {
keyboard_xt.pa = key_queue[key_queue_start]; keyboard_xt.key_waiting = key_queue[key_queue_start];
key_queue_start = (key_queue_start + 1) & 0xf; key_queue_start = (key_queue_start + 1) & 0xf;
keyboard_xt.wantirq = 1; keyboard_xt.wantirq = 1;
} }