1.1 diff -r 7d2f720daed8 -r 0d903718da81 src/keyboard.c 1.2 --- a/src/keyboard.c Wed Feb 09 15:43:48 2011 +0000 1.3 +++ b/src/keyboard.c Wed Feb 09 16:35:49 2011 +0000 1.4 @@ -146,8 +146,12 @@ 1.5 1.6 // scan the keymap 1.7 int keyidx = 0; 1.8 + bool found = false; 1.9 for (keyidx=0; keyidx < sizeof(keymap)/sizeof(keymap[0]); keyidx++) { 1.10 - if (keymap[keyidx].key == ev->key.keysym.sym) break; 1.11 + if (keymap[keyidx].key == ev->key.keysym.sym) { 1.12 + found = true; 1.13 + break; 1.14 + } 1.15 } 1.16 1.17 switch (ev->type) { 1.18 @@ -157,23 +161,45 @@ 1.19 break; 1.20 // key released 1.21 case SDL_KEYUP: 1.22 - ks->keystate[keymap[keyidx].scancode] = 1; 1.23 + ks->keystate[keymap[keyidx].scancode] = 0; 1.24 break; 1.25 } 1.26 } 1.27 1.28 void keyboard_scan(KEYBOARD_STATE *ks) 1.29 { 1.30 + int nkeys = 0; 1.31 + 1.32 // if buffer empty, do a keyboard scan 1.33 if (ks->buflen == 0) { 1.34 - // TODO: inject "keyboard data follows" chunk header 1.35 + // Keyboard Data Begins Here (BEGKBD) 1.36 + ks->buffer[ks->writep] = 0xDF; 1.37 + ks->writep = (ks->writep + 1) % KEYBOARD_BUFFER_SIZE; 1.38 + if (ks->buflen < KEYBOARD_BUFFER_SIZE) ks->buflen++; 1.39 + 1.40 for (int i=0; i<(sizeof(ks->keystate)/sizeof(ks->keystate[0])); i++) { 1.41 if (ks->keystate[i]) { 1.42 + printf("\tKBC KEY DOWN: %d\n", i); 1.43 ks->buffer[ks->writep] = i; 1.44 ks->writep = (ks->writep + 1) % KEYBOARD_BUFFER_SIZE; 1.45 + if (ks->buflen < KEYBOARD_BUFFER_SIZE) ks->buflen++; 1.46 + nkeys++; 1.47 } 1.48 } 1.49 + 1.50 + // If no keys down, then send All Keys Up byte 1.51 + if (nkeys == 0) { 1.52 + ks->buffer[ks->writep] = 0x40; 1.53 + ks->writep = (ks->writep + 1) % KEYBOARD_BUFFER_SIZE; 1.54 + if (ks->buflen < KEYBOARD_BUFFER_SIZE) ks->buflen++; 1.55 + } 1.56 + 1.57 // TODO: inject "mouse data follows" chunk header and mouse movement info 1.58 + 1.59 + // Last Entry In List 1.60 + ks->buffer[ks->writep] = 0x80; 1.61 + ks->writep = (ks->writep + 1) % KEYBOARD_BUFFER_SIZE; 1.62 + if (ks->buflen < KEYBOARD_BUFFER_SIZE) ks->buflen++; 1.63 } 1.64 } 1.65 1.66 @@ -200,19 +226,22 @@ 1.67 { 1.68 if ((addr & 1) == 0) { 1.69 // Status register -- RS=0, read 1.70 - return 1.71 - (ks->buflen > 0) ? 1 : 0 + // SR0: a new character has been received 1.72 - 0 + // SR1: Transmitter Data Register Empty 1.73 - 0 + // SR2: Data Carrier Detect 1.74 - 0 + // SR3: Clear To Send 1.75 - 0 + // SR4: Framing Error 1.76 - 0 + // SR5: Receiver Overrun 1.77 - 0 + // SR6: Parity Error 1.78 - (keyboard_get_irq(ks)) ? 0x80 : 0; // SR7: IRQ status 1.79 + uint8_t sr = 0; 1.80 + if (ks->buflen > 0) sr |= 1; // SR0: a new character has been received 1.81 + sr |= 2; // SR1: Transmitter Data Register Empty 1.82 +// 0 + // SR2: Data Carrier Detect 1.83 +// 0 + // SR3: Clear To Send 1.84 +// 0 + // SR4: Framing Error 1.85 +// 0 + // SR5: Receiver Overrun 1.86 +// 0 + // SR6: Parity Error 1.87 + if (keyboard_get_irq(ks)) sr |= 0x80; // SR7: IRQ status 1.88 + printf("\tKBD DBG: sr=%02X\n", sr); 1.89 + return sr; 1.90 } else { 1.91 // return data, pop off the fifo 1.92 uint8_t x = ks->buffer[ks->readp]; 1.93 ks->readp = (ks->readp + 1) % KEYBOARD_BUFFER_SIZE; 1.94 + if (ks->buflen > 0) ks->buflen--; 1.95 return x; 1.96 } 1.97 } 1.98 @@ -238,6 +267,7 @@ 1.99 ks->rxie = (val & 0x80)==0x80; 1.100 } else { 1.101 // Write command to KBC -- TODO! 1.102 + printf("KBC TODO: write keyboard data 0x%02X\n", val); 1.103 } 1.104 } 1.105