PCem

changeset 68:6425afff950f

Fixed handshaking in XT & Amstrad keyboards - no more stuck keys.
author TomW
date Fri Jan 03 16:16:23 2014 +0000
parents e30f3b3c14c6
children face56551501
files src/keyboard_amstrad.c src/keyboard_xt.c
diffstat 2 files changed, 12 insertions(+), 8 deletions(-) [+]
line diff
     1.1 --- a/src/keyboard_amstrad.c	Fri Jan 03 15:26:54 2014 +0000
     1.2 +++ b/src/keyboard_amstrad.c	Fri Jan 03 16:16:23 2014 +0000
     1.3 @@ -22,6 +22,7 @@
     1.4  {
     1.5          int wantirq;
     1.6          
     1.7 +        uint8_t key_waiting;
     1.8          uint8_t pa;        
     1.9          uint8_t pb;
    1.10  } keyboard_amstrad;
    1.11 @@ -37,13 +38,14 @@
    1.12          if (keyboard_amstrad.wantirq)
    1.13          {
    1.14                  keyboard_amstrad.wantirq = 0;
    1.15 +                keyboard_amstrad.pa = keyboard_amstrad.key_waiting;
    1.16                  picint(2);
    1.17                  pclog("keyboard_amstrad : take IRQ\n");
    1.18          }
    1.19 -        if (key_queue_start != key_queue_end)
    1.20 +        if (key_queue_start != key_queue_end && !keyboard_amstrad.pa)
    1.21          {
    1.22 -                keyboard_amstrad.pa = key_queue[key_queue_start];
    1.23 -                pclog("Reading %02X from the key queue at %i\n", keyboard_amstrad.pa, key_queue_start);
    1.24 +                keyboard_amstrad.key_waiting = key_queue[key_queue_start];
    1.25 +                pclog("Reading %02X from the key queue at %i\n", keyboard_amstrad.key_waiting, key_queue_start);
    1.26                  key_queue_start = (key_queue_start + 1) & 0xf;
    1.27                  keyboard_amstrad.wantirq = 1;        
    1.28          }                
    1.29 @@ -120,7 +122,7 @@
    1.30                          }
    1.31                          else
    1.32                          {
    1.33 -                                keyboard_amstrad.pa = key_queue[key_queue_start];
    1.34 +                                keyboard_amstrad.key_waiting = key_queue[key_queue_start];
    1.35                                  key_queue_start = (key_queue_start + 1) & 0xf;
    1.36                                  keyboard_amstrad.wantirq = 1;        
    1.37                          }
     2.1 --- a/src/keyboard_xt.c	Fri Jan 03 15:26:54 2014 +0000
     2.2 +++ b/src/keyboard_xt.c	Fri Jan 03 16:16:23 2014 +0000
     2.3 @@ -20,6 +20,7 @@
     2.4  struct
     2.5  {
     2.6          int wantirq;
     2.7 +        uint8_t key_waiting;
     2.8          
     2.9          uint8_t pa;        
    2.10          uint8_t pb;
    2.11 @@ -34,13 +35,14 @@
    2.12          if (keyboard_xt.wantirq)
    2.13          {
    2.14                  keyboard_xt.wantirq = 0;
    2.15 +                keyboard_xt.pa = keyboard_xt.key_waiting;
    2.16                  picint(2);
    2.17                  pclog("keyboard_xt : take IRQ\n");
    2.18          }
    2.19 -        if (key_queue_start != key_queue_end)
    2.20 +        if (key_queue_start != key_queue_end && !keyboard_xt.pa)
    2.21          {
    2.22 -                keyboard_xt.pa = key_queue[key_queue_start];
    2.23 -                pclog("Reading %02X from the key queue at %i\n", keyboard_xt.pa, key_queue_start);
    2.24 +                keyboard_xt.key_waiting = key_queue[key_queue_start];
    2.25 +                pclog("Reading %02X from the key queue at %i\n", keyboard_xt.key_waiting, key_queue_start);
    2.26                  key_queue_start = (key_queue_start + 1) & 0xf;
    2.27                  keyboard_xt.wantirq = 1;        
    2.28          }                
    2.29 @@ -112,7 +114,7 @@
    2.30                          }
    2.31                          else
    2.32                          {
    2.33 -                                keyboard_xt.pa = key_queue[key_queue_start];
    2.34 +                                keyboard_xt.key_waiting = key_queue[key_queue_start];
    2.35                                  key_queue_start = (key_queue_start + 1) & 0xf;
    2.36                                  keyboard_xt.wantirq = 1;        
    2.37                          }