PCem
changeset 144:26a55112027e
Tweaked AT keyboard handler, fixes stuck/missing keys in Doom.
| author | TomW |
|---|---|
| date | Sat Aug 16 21:19:02 2014 +0100 |
| parents | 8523e78e0e48 |
| children | 34376c2f2d17 |
| files | src/keyboard_at.c |
| diffstat | 1 files changed, 11 insertions(+), 9 deletions(-) [+] |
line diff
1.1 --- a/src/keyboard_at.c Sat Aug 16 17:36:50 2014 +0100 1.2 +++ b/src/keyboard_at.c Sat Aug 16 21:19:02 2014 +0100 1.3 @@ -29,6 +29,7 @@ 1.4 uint8_t status; 1.5 uint8_t mem[0x20]; 1.6 uint8_t out; 1.7 + int out_new; 1.8 1.9 uint8_t input_port; 1.10 uint8_t output_port; 1.11 @@ -53,6 +54,11 @@ 1.12 { 1.13 keyboard_at.wantirq = 0; 1.14 picint(2); 1.15 + if (keyboard_at.out_new != -1) 1.16 + keyboard_at.out = keyboard_at.out_new; 1.17 + keyboard_at.out_new = -1; 1.18 + keyboard_at.status |= STAT_OFULL; 1.19 + keyboard_at.status &= ~STAT_IFULL; 1.20 // pclog("keyboard_at : take IRQ\n"); 1.21 } 1.22 else if (keyboard_at.wantirq12) 1.23 @@ -72,25 +78,21 @@ 1.24 if (keyboard_at.mem[0] & 0x02) 1.25 keyboard_at.wantirq12 = 1; 1.26 } 1.27 - else if (!(keyboard_at.status & STAT_OFULL) && !(keyboard_at.mem[0] & 0x10) && 1.28 + else if (keyboard_at.out_new == -1 && !(keyboard_at.mem[0] & 0x10) && 1.29 key_queue_start != key_queue_end) 1.30 { 1.31 + keyboard_at.out_new = key_queue[key_queue_start]; 1.32 // pclog("Reading %02X from the key queue at %i\n", keyboard_at.out, key_queue_start); 1.33 - keyboard_at.out = key_queue[key_queue_start]; 1.34 key_queue_start = (key_queue_start + 1) & 0xf; 1.35 - keyboard_at.status |= STAT_OFULL; 1.36 - keyboard_at.status &= ~STAT_IFULL; 1.37 if (keyboard_at.mem[0] & 0x01) 1.38 keyboard_at.wantirq = 1; 1.39 } 1.40 - else if (!(keyboard_at.status & STAT_OFULL) && 1.41 + else if (keyboard_at.out_new == -1 && !(keyboard_at.status & STAT_OFULL) && 1.42 key_ctrl_queue_start != key_ctrl_queue_end) 1.43 { 1.44 + keyboard_at.out_new = key_ctrl_queue[key_ctrl_queue_start]; 1.45 // pclog("Reading %02X from the key ctrl_queue at %i\n", keyboard_at.out, key_ctrl_queue_start); 1.46 - keyboard_at.out = key_ctrl_queue[key_ctrl_queue_start]; 1.47 key_ctrl_queue_start = (key_ctrl_queue_start + 1) & 0xf; 1.48 - keyboard_at.status |= STAT_OFULL; 1.49 - keyboard_at.status &= ~STAT_IFULL; 1.50 if (keyboard_at.mem[0] & 0x01) 1.51 keyboard_at.wantirq = 1; 1.52 } 1.53 @@ -409,7 +411,6 @@ 1.54 case 0x60: 1.55 temp = keyboard_at.out; 1.56 keyboard_at.status &= ~(STAT_OFULL | STAT_MFULL); 1.57 - keyboard_at.wantirq = keyboard_at.wantirq12 = 0; 1.58 break; 1.59 1.60 case 0x61: 1.61 @@ -434,6 +435,7 @@ 1.62 keyboard_at.wantirq = 0; 1.63 keyboard_at.output_port = 0; 1.64 keyboard_at.input_port = 0xb0; 1.65 + keyboard_at.out_new = -1; 1.66 1.67 keyboard_at.key_wantdata = 0; 1.68
