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