diff options
| author | Aleksa Vučković <aleksav013@gmail.com> | 2021-11-12 16:26:43 +0100 |
|---|---|---|
| committer | Aleksa Vučković <aleksav013@gmail.com> | 2021-11-12 16:26:43 +0100 |
| commit | dbbb74c22f42df9175eaea72c1eb12d6deab332c (patch) | |
| tree | 93d3542954d9534c62d4e27a7d09fa29ab36aa49 | |
| parent | 7952ca48be2f8ec4f1277ccd72b5cc87e0138561 (diff) | |
Keyboard functionality
| -rw-r--r-- | src/c/keyboard.c | 85 | ||||
| -rw-r--r-- | src/c/keymap.c | 177 | ||||
| -rw-r--r-- | src/grub.cfg | 2 |
3 files changed, 246 insertions, 18 deletions
diff --git a/src/c/keyboard.c b/src/c/keyboard.c index 5da3239..d082ec5 100644 --- a/src/c/keyboard.c +++ b/src/c/keyboard.c @@ -3,7 +3,11 @@ #include<stdio.h> #define BUFFER_SIZE 200 -char buffer[BUFFER_SIZE]; +#define BUFFER_LOG 200 +char buffer[BUFFER_LOG][BUFFER_SIZE]; +size_t buffer_size[BUFFER_LOG]; +size_t buffer_current=0; +size_t buffer_all=0; size_t buffer_index=0; #define PIC1_COMMAND_PORT 0x20 @@ -15,28 +19,35 @@ size_t buffer_index=0; #define KEYBOARD_STATUS_PORT 0x64 void previous_field(void); -void terminal_putchar(char c); void tty(char *buffer); void prompt(void); void clear(); void us_en(char keymap[]); +void us_en_shift(char keymap[]); char charcode[256]; +char shift_charcode[256]; bool ispressed[128]; void init_keyboard() { us_en(charcode); + us_en_shift(shift_charcode); } -void backspace() +void deletelast() { - if(buffer_index<=0) return; - previous_field(); printf(" "); previous_field(); - buffer[--buffer_index]='\0'; +} + +void backspace() +{ + if(buffer_index<=0) return; + + deletelast(); + buffer[buffer_current][--buffer_index]='\0'; return; } @@ -45,8 +56,14 @@ void enter() printf("\n"); if(buffer_index>0) { - tty(buffer); - for(int i=0;i<BUFFER_SIZE;i++) buffer[i]='\0'; + tty(buffer[buffer_current]); + buffer_size[buffer_current]=buffer_index; + if(buffer_current==buffer_all) buffer_current=(++buffer_all); + else + { + for(size_t i=0;i<BUFFER_SIZE;i++) buffer[buffer_all][i]='\0'; + buffer_current=buffer_all; + } buffer_index=0; } prompt(); @@ -55,10 +72,43 @@ void enter() void space() { - buffer[buffer_index++]=' '; + buffer[buffer_current][buffer_index++]=' '; printf(" "); } + +void keyup() +{ + if(buffer_current>0) + { + buffer_size[buffer_current]=buffer_index; + for(size_t i=0;i<buffer_index;i++) deletelast(); + buffer_current--; + buffer_index=buffer_size[buffer_current]; + printf("%s",buffer[buffer_current]); + } +} +void keydown() +{ + if(buffer_current<buffer_all) + { + buffer_size[buffer_current]=buffer_index; + for(size_t i=0;i<buffer_index;i++) deletelast(); + buffer_current++; + buffer_index=buffer_size[buffer_current]; + printf("%s",buffer[buffer_current]); + } +} +void keyleft() +{ + +} +void keyright() +{ + +} + #define lshift ispressed[0x2A] +#define rshift ispressed[0x36] #define lctrl ispressed[0x1D] void keyboard_handler() @@ -69,32 +119,37 @@ void keyboard_handler() if (status & 0x1) { uint8_t keycode = ioport_in(KEYBOARD_DATA_PORT); +// printf("%d\n",keycode); if(keycode<0x80) { ispressed[keycode]=1; if(keycode==0x0E) backspace(); else if(keycode==0x1C) enter(); else if(keycode==0x39) space(); + else if(keycode==72) keyup(); + else if(keycode==80) keydown(); + else if(keycode==75) keyleft(); + else if(keycode==77) keyright(); else { char c=charcode[keycode]; if(c!=' ') { - if(lshift) - { - if(c>='a'&&c<='z') c-=32; - } if(lctrl) { if(c=='l') { clear(); prompt(); - printf("%s",buffer); + printf("%s",buffer[buffer_current]); return; } } - buffer[buffer_index++]=c; + if(lshift||rshift) + { + c=shift_charcode[keycode]; + } + buffer[buffer_current][buffer_index++]=c; printf("%c",c); } } diff --git a/src/c/keymap.c b/src/c/keymap.c index d3d13aa..5401be0 100644 --- a/src/c/keymap.c +++ b/src/c/keymap.c @@ -54,7 +54,7 @@ void us_en(char keymap[]) keymap[0x34]='.'; //. pressed keymap[0x35]='/'; /// pressed keymap[0x36]=' '; //right shift pressed - keymap[0x37]=' '; //(keypad) * pressed + keymap[0x37]='*'; //(keypad) * pressed keymap[0x38]=' '; //left alt pressed keymap[0x39]=' '; //space pressed keymap[0x3A]=' '; //CapsLock pressed @@ -139,7 +139,180 @@ void us_en(char keymap[]) keymap[0xB4]=' '; //. released keymap[0xB5]=' '; /// released keymap[0xB6]=' '; //right shift released - keymap[0xB7]=' '; //(keypad) * released + keymap[0xB7]='*'; //(keypad) * released + keymap[0xB8]=' '; //left alt released + keymap[0xB9]=' '; //space released + keymap[0xBA]=' '; //CapsLock released + keymap[0xBB]=' '; //F1 released + keymap[0xBC]=' '; //F2 released + keymap[0xBD]=' '; //F3 released + keymap[0xBE]=' '; //F4 released + keymap[0xBF]=' '; //F5 released + keymap[0xC0]=' '; //F6 released + keymap[0xC1]=' '; //F7 released + keymap[0xC2]=' '; //F8 released + keymap[0xC3]=' '; //F9 released + keymap[0xC4]=' '; //F10 released + keymap[0xC5]=' '; //NumberLock released + keymap[0xC6]=' '; //ScrollLock released + keymap[0xC7]=' '; //(keypad) 7 released + keymap[0xC8]=' '; //(keypad) 8 released + keymap[0xC9]=' '; //(keypad) 9 released + keymap[0xCA]=' '; //(keypad) - released + keymap[0xCB]=' '; //(keypad) 4 released + keymap[0xCC]=' '; //(keypad) 5 released + keymap[0xCD]=' '; //(keypad) 6 released + keymap[0xCE]=' '; //(keypad) + released + keymap[0xCF]=' '; //(keypad) 1 released + keymap[0xD0]=' '; //(keypad) 2 released + keymap[0xD1]=' '; //(keypad) 3 released + keymap[0xD2]=' '; //(keypad) 0 released + keymap[0xD3]=' '; //(keypad) . released + keymap[0xD7]=' '; //F11 released + keymap[0xD8]=' '; //F12 released +} +void us_en_shift(char keymap[]) +{ + keymap[0x01]=' '; //escape pressed + keymap[0x02]='!'; //1 pressed + keymap[0x03]='@'; //2 pressed + keymap[0x04]='#'; //3 pressed + keymap[0x05]='$'; //4 pressed + keymap[0x06]='%'; //5 pressed + keymap[0x07]='^'; //6 pressed + keymap[0x08]='&'; //7 pressed + keymap[0x09]='*'; //8 pressed + keymap[0x0A]='('; //9 pressed + keymap[0x0B]=')'; //0 (zero) pressed + keymap[0x0C]='_'; //- pressed + keymap[0x0D]='+'; //= pressed + keymap[0x0E]=' '; //backspace pressed + keymap[0x0F]=' '; //tab pressed + keymap[0x10]='Q'; //Q pressed + keymap[0x11]='W'; //W pressed + keymap[0x12]='E'; //E pressed + keymap[0x13]='R'; //R pressed + keymap[0x14]='T'; //T pressed + keymap[0x15]='Y'; //Y pressed + keymap[0x16]='U'; //U pressed + keymap[0x17]='I'; //I pressed + keymap[0x18]='O'; //O pressed + keymap[0x19]='P'; //P pressed + keymap[0x1A]='{'; //[ pressed + keymap[0x1B]='}'; //] pressed + keymap[0x1C]='\n'; //enter pressed + keymap[0x1D]=' '; //left control pressed + keymap[0x1E]='A'; //A pressed + keymap[0x1F]='S'; //S pressed + keymap[0x20]='D'; //D pressed + keymap[0x21]='F'; //F pressed + keymap[0x22]='G'; //G pressed + keymap[0x23]='H'; //H pressed + keymap[0x24]='J'; //J pressed + keymap[0x25]='K'; //K pressed + keymap[0x26]='L'; //L pressed + keymap[0x27]=':'; //; pressed + keymap[0x28]='\"'; //' (single quote) pressed + keymap[0x29]='~'; //` (back tick) pressed + keymap[0x2A]=' '; //left shift pressed + keymap[0x2B]='|'; //\ pressed + keymap[0x2C]='Z'; //Z pressed + keymap[0x2D]='X'; //X pressed + keymap[0x2E]='C'; //C pressed + keymap[0x2F]='V'; //V pressed + keymap[0x30]='B'; //B pressed + keymap[0x31]='N'; //N pressed + keymap[0x32]='M'; //M pressed + keymap[0x33]='<'; //, pressed + keymap[0x34]='>'; //. pressed + keymap[0x35]='?'; /// pressed + keymap[0x36]=' '; //right shift pressed + keymap[0x37]='*'; //(keypad) * pressed + keymap[0x38]=' '; //left alt pressed + keymap[0x39]=' '; //space pressed + keymap[0x3A]=' '; //CapsLock pressed + keymap[0x3B]=' '; //F1 pressed + keymap[0x3C]=' '; //F2 pressed + keymap[0x3D]=' '; //F3 pressed + keymap[0x3E]=' '; //F4 pressed + keymap[0x3F]=' '; //F5 pressed + keymap[0x40]=' '; //F6 pressed + keymap[0x41]=' '; //F7 pressed + keymap[0x42]=' '; //F8 pressed + keymap[0x43]=' '; //F9 pressed + keymap[0x44]=' '; //F10 pressed + keymap[0x45]=' '; //NumberLock pressed + keymap[0x46]=' '; //ScrollLock pressed + keymap[0x47]='7'; //(keypad) 7 pressed + keymap[0x48]='8'; //(keypad) 8 pressed + keymap[0x49]='9'; //(keypad) 9 pressed + keymap[0x4A]='-'; //(keypad) - pressed + keymap[0x4B]='4'; //(keypad) 4 pressed + keymap[0x4C]='5'; //(keypad) 5 pressed + keymap[0x4D]='6'; //(keypad) 6 pressed + keymap[0x4E]='+'; //(keypad) + pressed + keymap[0x4F]='1'; //(keypad) 1 pressed + keymap[0x50]='2'; //(keypad) 2 pressed + keymap[0x51]='3'; //(keypad) 3 pressed + keymap[0x52]='0'; //(keypad) 0 pressed + keymap[0x53]='.'; //(keypad) . pressed + keymap[0x57]=' '; //F11 pressed + keymap[0x58]=' '; //F12 pressed + keymap[0x81]=' '; //escape released + keymap[0x82]=' '; //1 released + keymap[0x83]=' '; //2 released + keymap[0x84]=' '; //3 released + keymap[0x85]=' '; //4 released + keymap[0x86]=' '; //5 released + keymap[0x87]=' '; //6 released + keymap[0x88]=' '; //7 released + keymap[0x89]=' '; //8 released + keymap[0x8A]=' '; //9 released + keymap[0x8B]=' '; //0 (zero) released + keymap[0x8C]=' '; //- released + keymap[0x8D]=' '; //= released + keymap[0x8E]=' '; //backspace released + keymap[0x8F]=' '; //tab released + keymap[0x90]=' '; //Q released + keymap[0x91]=' '; //W released + keymap[0x92]=' '; //E released + keymap[0x93]=' '; //R released + keymap[0x94]=' '; //T released + keymap[0x95]=' '; //Y released + keymap[0x96]=' '; //U released + keymap[0x97]=' '; //I released + keymap[0x98]=' '; //O released + keymap[0x99]=' '; //P released + keymap[0x9A]=' '; //[ released + keymap[0x9B]=' '; //] released + keymap[0x9C]=' '; //enter released + keymap[0x9D]=' '; //left control released + keymap[0x9E]=' '; //A released + keymap[0x9F]=' '; //S released + keymap[0xA0]=' '; //D released + keymap[0xA1]=' '; //F released + keymap[0xA2]=' '; //G released + keymap[0xA3]=' '; //H released + keymap[0xA4]=' '; //J released + keymap[0xA5]=' '; //K released + keymap[0xA6]=' '; //L released + keymap[0xA7]=' '; //; released + keymap[0xA8]=' '; //' (single quote) released + keymap[0xA9]=' '; //` (back tick) released + keymap[0xAA]=' '; //left shift released + keymap[0xAB]=' '; //\ released + keymap[0xAC]=' '; //Z released + keymap[0xAD]=' '; //X released + keymap[0xAE]=' '; //C released + keymap[0xAF]=' '; //V released + keymap[0xB0]=' '; //B released + keymap[0xB1]=' '; //N released + keymap[0xB2]=' '; //M released + keymap[0xB3]=' '; //, released + keymap[0xB4]=' '; //. released + keymap[0xB5]=' '; /// released + keymap[0xB6]=' '; //right shift released + keymap[0xB7]='*'; //(keypad) * released keymap[0xB8]=' '; //left alt released keymap[0xB9]=' '; //space released keymap[0xBA]=' '; //CapsLock released diff --git a/src/grub.cfg b/src/grub.cfg index fea5f54..ba19176 100644 --- a/src/grub.cfg +++ b/src/grub.cfg @@ -1,4 +1,4 @@ -set timeout=0 +set timeout=5 set default=0 menuentry "myos" { |
