1.1 diff -r 674226015c8a -r 9581358e92b0 src/keyboard.c 1.2 --- a/src/keyboard.c Wed Dec 29 09:06:17 2010 +0000 1.3 +++ b/src/keyboard.c Wed Feb 09 15:03:31 2011 +0000 1.4 @@ -1,4 +1,6 @@ 1.5 +#include <stdbool.h> 1.6 #include "SDL.h" 1.7 +#include "keyboard.h" 1.8 1.9 /** 1.10 * Key map -- a mapping from SDLK_xxx constants to scancodes and vice versa. 1.11 @@ -126,19 +128,96 @@ 1.12 // { SDLK_, 1, 0x7f }, // Dlete 1.13 }; 1.14 1.15 -/** 1.16 - * List of key states 1.17 - */ 1.18 -int keystate[0x80]; 1.19 - 1.20 -void keyboard_init(void) 1.21 +void keyboard_init(KEYBOARD_STATE *ks) 1.22 { 1.23 // Set all key states to "not pressed" 1.24 - for (int i=0; i<(sizeof(keystate)/sizeof(keystate[0])); i++) { 1.25 - keystate[i] = 0; 1.26 + for (int i=0; i<(sizeof(ks->keystate)/sizeof(ks->keystate[0])); i++) { 1.27 + ks->keystate[i] = 0; 1.28 + } 1.29 + 1.30 + // Reset the R/W pointers and length 1.31 + ks->readp = ks->writep = ks->buflen = 0; 1.32 +} 1.33 + 1.34 +void keyboard_event(KEYBOARD_STATE *ks, SDL_Event *ev) 1.35 +{ 1.36 + // event handler -- handles SDL events 1.37 +} 1.38 + 1.39 +void keyboard_scan(KEYBOARD_STATE *ks) 1.40 +{ 1.41 + // if buffer empty, do a keyboard scan 1.42 + if (ks->buflen == 0) { 1.43 + for (int i=0; i<(sizeof(ks->keystate)/sizeof(ks->keystate[0])); i++) { 1.44 + if (ks->keystate[i]) { 1.45 + ks->buffer[ks->writep] = i; 1.46 + ks->writep = (ks->writep + 1) % KEYBOARD_BUFFER_SIZE; 1.47 + } 1.48 + } 1.49 } 1.50 } 1.51 1.52 -void keyboard_event(SDL_Event *ev) 1.53 +bool keyboard_get_irq(KEYBOARD_STATE *ks) 1.54 +{ 1.55 + bool irq_status = false; 1.56 + 1.57 + // Conditions which may cause an IRQ :- 1.58 + // Read Data Reg has data and RxIRQ enabled 1.59 + if (ks->rxie) 1.60 + if (ks->buflen > 0) irq_status = true; 1.61 + 1.62 + // Transmit Data Reg empty and TxIRQ enabled 1.63 +// if (ks->txie) 1.64 + 1.65 + // DCD set and RxIRQ enabled 1.66 +// 1.67 + 1.68 + // returns interrupt status -- i.e. is there data in the buffer? 1.69 + return irq_status; 1.70 +} 1.71 + 1.72 +uint8_t keyboard_read(KEYBOARD_STATE *ks, uint8_t addr) 1.73 { 1.74 + if ((addr & 1) == 0) { 1.75 + // Status register -- RS=0, read 1.76 + return 1.77 + (ks->buflen > 0) ? 1 : 0 + // SR0: a new character has been received 1.78 + 0 + // SR1: Transmitter Data Register Empty 1.79 + 0 + // SR2: Data Carrier Detect 1.80 + 0 + // SR3: Clear To Send 1.81 + 0 + // SR4: Framing Error 1.82 + 0 + // SR5: Receiver Overrun 1.83 + 0 + // SR6: Parity Error 1.84 + (keyboard_get_irq(ks)) ? 0x80 : 0; // SR7: IRQ status 1.85 + } else { 1.86 + // return data, pop off the fifo 1.87 + uint8_t x = ks->buffer[ks->readp]; 1.88 + ks->readp = (ks->readp + 1) % KEYBOARD_BUFFER_SIZE; 1.89 + return x; 1.90 + } 1.91 } 1.92 + 1.93 +void keyboard_write(KEYBOARD_STATE *ks, uint8_t addr, uint8_t val) 1.94 +{ 1.95 + if ((addr & 1) == 0) { 1.96 + // write to control register 1.97 + // transmit intr enabled when CR6,5 = 01 1.98 + // receive intr enabled when CR7 = 1 1.99 + 1.100 + // CR0,1 = divider registers. When =11, do a software reset 1.101 + if ((val & 3) == 3) { 1.102 + ks->readp = ks->writep = ks->buflen = 0; 1.103 + } 1.104 + 1.105 + // Ignore CR2,3,4 (word length)... 1.106 + 1.107 + // CR5,6 = Transmit Mode 1.108 + ks->txie = (val & 0x60)==0x20; 1.109 + 1.110 + // CR7 = Receive Interrupt Enable 1.111 + ks->rxie = (val & 0x80)==0x80; 1.112 + } else { 1.113 + // Write command to KBC -- TODO! 1.114 + } 1.115 +} 1.116 +