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 }
