src/keyboard.c

changeset 84
0d903718da81
parent 83
7d2f720daed8
child 85
9883eb142f70
     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