src/keyboard.c

changeset 91
781c15e60012
parent 90
934ae2efdd01
child 92
3d5680edc1f0
     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