1.1 diff -r 934ae2efdd01 -r 781c15e60012 src/keyboard.c 1.2 --- a/src/keyboard.c Wed Feb 09 22:05:42 2011 +0000 1.3 +++ b/src/keyboard.c Wed Feb 09 23:45:55 2011 +0000 1.4 @@ -160,6 +160,9 @@ 1.5 1.6 // Reset the R/W pointers and length 1.7 ks->readp = ks->writep = ks->buflen = 0; 1.8 + 1.9 + // Clear the update flag 1.10 + ks->update_flag = false; 1.11 } 1.12 1.13 void keyboard_event(KEYBOARD_STATE *ks, SDL_Event *ev) 1.14 @@ -179,6 +182,9 @@ 1.15 return; 1.16 } 1.17 1.18 + // If we got here, then the keystate must have changed...! 1.19 + ks->update_flag = true; 1.20 + 1.21 // scan the keymap 1.22 for (int i=0; i < sizeof(keymap)/sizeof(keymap[0]); i++) { 1.23 if (keymap[i].key == ev->key.keysym.sym) { 1.24 @@ -204,10 +210,13 @@ 1.25 { 1.26 int nkeys = 0; 1.27 1.28 + // Skip doing the scan if the keyboard hasn't changed state 1.29 + if (!ks->update_flag) return; 1.30 + 1.31 // if buffer empty, do a keyboard scan 1.32 if (ks->buflen == 0) { 1.33 // Keyboard Data Begins Here (BEGKBD) 1.34 - ks->buffer[ks->writep] = 0xDF; 1.35 + ks->buffer[ks->writep] = KEY_BEGIN_KEYBOARD; 1.36 ks->writep = (ks->writep + 1) % KEYBOARD_BUFFER_SIZE; 1.37 if (ks->buflen < KEYBOARD_BUFFER_SIZE) ks->buflen++; 1.38 1.39 @@ -223,7 +232,7 @@ 1.40 1.41 // If no keys down, then send All Keys Up byte 1.42 if (nkeys == 0) { 1.43 - ks->buffer[ks->writep] = 0x40; 1.44 + ks->buffer[ks->writep] = KEY_ALL_UP; 1.45 ks->writep = (ks->writep + 1) % KEYBOARD_BUFFER_SIZE; 1.46 if (ks->buflen < KEYBOARD_BUFFER_SIZE) ks->buflen++; 1.47 } 1.48 @@ -231,10 +240,13 @@ 1.49 // TODO: inject "mouse data follows" chunk header and mouse movement info 1.50 1.51 // Last Entry In List 1.52 - ks->buffer[ks->writep] = 0x80; 1.53 - ks->writep = (ks->writep + 1) % KEYBOARD_BUFFER_SIZE; 1.54 - if (ks->buflen < KEYBOARD_BUFFER_SIZE) ks->buflen++; 1.55 +// ks->buffer[ks->writep] = 0x80; 1.56 +// ks->writep = (ks->writep + 1) % KEYBOARD_BUFFER_SIZE; 1.57 +// if (ks->buflen < KEYBOARD_BUFFER_SIZE) ks->buflen++; 1.58 } 1.59 + 1.60 + // Clear the update flag 1.61 + ks->update_flag = false; 1.62 } 1.63 1.64 bool keyboard_get_irq(KEYBOARD_STATE *ks) 1.65 @@ -302,6 +314,10 @@ 1.66 } else { 1.67 // Write command to KBC -- TODO! 1.68 printf("KBC TODO: write keyboard data 0x%02X\n", val); 1.69 + if (val == KEY_CMD_RESET) { 1.70 + printf("\tKBC: KEYBOARD RESET!\n"); 1.71 + ks->readp = ks->writep = ks->buflen = 0; 1.72 + } 1.73 } 1.74 } 1.75