PCem
changeset 146:21f926f1fabf
Fixed keyboard in Windows NT.
| author | TomW |
|---|---|
| date | Mon Aug 18 20:28:31 2014 +0100 |
| parents | 34376c2f2d17 |
| children | a221bebd5ff3 |
| files | src/keyboard_at.c src/pic.c |
| diffstat | 2 files changed, 13 insertions(+), 8 deletions(-) [+] |
line diff
1.1 --- a/src/keyboard_at.c Sun Aug 17 15:23:26 2014 +0100 1.2 +++ b/src/keyboard_at.c Mon Aug 18 20:28:31 2014 +0100 1.3 @@ -36,6 +36,8 @@ 1.4 1.5 uint8_t key_command; 1.6 int key_wantdata; 1.7 + 1.8 + int last_irq; 1.9 } keyboard_at; 1.10 1.11 static uint8_t key_ctrl_queue[16]; 1.12 @@ -50,22 +52,24 @@ 1.13 void keyboard_at_poll() 1.14 { 1.15 keybsenddelay += (1000 * TIMER_USEC); 1.16 - if (keyboard_at.wantirq) 1.17 + if (keyboard_at.out_new != -1) 1.18 { 1.19 keyboard_at.wantirq = 0; 1.20 - picint(2); 1.21 - if (keyboard_at.out_new != -1) 1.22 - keyboard_at.out = keyboard_at.out_new; 1.23 + if (keyboard_at.mem[0] & 0x01) 1.24 + picint(2); 1.25 + keyboard_at.out = keyboard_at.out_new; 1.26 keyboard_at.out_new = -1; 1.27 keyboard_at.status |= STAT_OFULL; 1.28 keyboard_at.status &= ~STAT_IFULL; 1.29 // pclog("keyboard_at : take IRQ\n"); 1.30 + keyboard_at.last_irq = 2; 1.31 } 1.32 else if (keyboard_at.wantirq12) 1.33 { 1.34 keyboard_at.wantirq12 = 0; 1.35 picint(0x1000); 1.36 // pclog("keyboard_at : take IRQ 12\n"); 1.37 + keyboard_at.last_irq = 0x1000; 1.38 } 1.39 if (!(keyboard_at.status & STAT_OFULL) && !(keyboard_at.mem[0] & 0x10) && 1.40 mouse_queue_start != mouse_queue_end) 1.41 @@ -84,8 +88,6 @@ 1.42 keyboard_at.out_new = key_queue[key_queue_start]; 1.43 // pclog("Reading %02X from the key queue at %i\n", keyboard_at.out, key_queue_start); 1.44 key_queue_start = (key_queue_start + 1) & 0xf; 1.45 - if (keyboard_at.mem[0] & 0x01) 1.46 - keyboard_at.wantirq = 1; 1.47 } 1.48 else if (keyboard_at.out_new == -1 && !(keyboard_at.status & STAT_OFULL) && 1.49 key_ctrl_queue_start != key_ctrl_queue_end) 1.50 @@ -93,8 +95,6 @@ 1.51 keyboard_at.out_new = key_ctrl_queue[key_ctrl_queue_start]; 1.52 // pclog("Reading %02X from the key ctrl_queue at %i\n", keyboard_at.out, key_ctrl_queue_start); 1.53 key_ctrl_queue_start = (key_ctrl_queue_start + 1) & 0xf; 1.54 - if (keyboard_at.mem[0] & 0x01) 1.55 - keyboard_at.wantirq = 1; 1.56 } 1.57 } 1.58 1.59 @@ -411,6 +411,8 @@ 1.60 case 0x60: 1.61 temp = keyboard_at.out; 1.62 keyboard_at.status &= ~(STAT_OFULL | STAT_MFULL); 1.63 + picintc(keyboard_at.last_irq); 1.64 + keyboard_at.last_irq = 0; 1.65 break; 1.66 1.67 case 0x61: 1.68 @@ -436,6 +438,7 @@ 1.69 keyboard_at.output_port = 0; 1.70 keyboard_at.input_port = 0xb0; 1.71 keyboard_at.out_new = -1; 1.72 + keyboard_at.last_irq = 0; 1.73 1.74 keyboard_at.key_wantdata = 0; 1.75
