Skip to content

Commit

Permalink
Added keyboard support
Browse files Browse the repository at this point in the history
  • Loading branch information
vinsdragonis committed Feb 20, 2022
1 parent d58886a commit 10bc7e5
Show file tree
Hide file tree
Showing 8 changed files with 380 additions and 7 deletions.
Binary file modified boot/bin/boot.bin
Binary file not shown.
Binary file modified boot/bin/kernel.bin
Binary file not shown.
Binary file modified boot/bin/kernel.img
Binary file not shown.
Binary file modified boot/bin/kernel.o
Binary file not shown.
2 changes: 1 addition & 1 deletion boot/boot.asm
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ section code

mov bx, 0x1000 ; location of the code being loaded from the hard disk
mov ah, 0x02
mov al, 25 ; number of sectors to read from the hard disk
mov al, 31 ; number of sectors to read from the hard disk
mov ch, 0x00
mov dh, 0x00
mov cl, 0x02
Expand Down
357 changes: 354 additions & 3 deletions boot/input.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ int left_clicked, right_clicked, middle_clicked;
int current_byte = 0;
uint8_t bytes[4] = {0};

int Scancode = -1;

#define TRUE 1
#define FALSE 0

#define pic1_command 0x20
#define pic1_data 0x21
#define pic2_command 0xa0
Expand Down Expand Up @@ -98,11 +103,11 @@ void RemapPIC() {
}

void HandleISR1() {
inportb(0x60);
Scancode = inportb(0x60);
outportb(0xa0, 0x20);
outportb(0x20, 0x20);

clearScreen(0, 0, 255);
// clearScreen(0, 0, 0);
}

void HandleMouseInterrupt();
Expand Down Expand Up @@ -202,7 +207,7 @@ void HandleMousePacket() {
uint8_t status = bytes[0];
int32_t change_x = (int32_t) bytes[1];
int32_t change_y = (int32_t)bytes[2];
int mouse_speed = 3;
int mouse_speed = 2;

if (status & x_overflow || status & y_overflow)
return;
Expand Down Expand Up @@ -237,3 +242,349 @@ void HandleMousePacket() {
else if (y > VBE->y_resolution)
y = VBE->y_resolution;
}

int shift_pressed = FALSE;
int caps_pressed = FALSE;
int escape_pressed = FALSE;
int backspace_pressed = FALSE;
int alt_pressed = FALSE;
int ctrl_pressed = FALSE;
int enter_pressed = FALSE;

unsigned char ProcessScancode(int scancode)
{
if (scancode == 0x01)
escape_pressed = TRUE;

else if (scancode == 0x02)
if (shift_pressed == TRUE)
return '!';
else
return '1';

else if (scancode == 0x03)
if (shift_pressed == TRUE)
return '"';
else
return '2';

else if (scancode == 0x04)
if (shift_pressed == TRUE)
return '#';
else
return '3';

else if (scancode == 0x05)
if (shift_pressed == TRUE)
return '$';
else
return '4';

else if (scancode == 0x06)
if (shift_pressed == TRUE)
return '%';
else
return '5';

else if (scancode == 0x07)
if (shift_pressed == TRUE)
return '^';
else
return '6';

else if (scancode == 0x08)
if (shift_pressed == TRUE)
return '&';
else
return '7';

else if (scancode == 0x09)
if (shift_pressed == TRUE)
return '*';
else
return '8';

else if (scancode == 0x0A)
if (shift_pressed == TRUE)
return '(';
else
return '9';

else if (scancode == 0x0B)
if (shift_pressed == TRUE)
return ')';
else
return '0';

else if (scancode == 0x0C)
if (shift_pressed == TRUE)
return '_';
else
return '-';

else if (scancode == 0x0D)
if (shift_pressed == TRUE)
return '+';
else
return '=';

// Backspace
else if (scancode == 0x0E)
backspace_pressed = TRUE;

else if (scancode == 0x0F)
return '\t';

else if (scancode == 0x10)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'Q';
else
return 'q';

else if (scancode == 0x11)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'W';
else
return 'w';

else if (scancode == 0x12)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'E';
else
return 'e';

else if (scancode == 0x13)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'R';
else
return 'r';

else if (scancode == 0x14)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'T';
else
return 't';

else if (scancode == 0x15)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'Y';
else
return 'y';

else if (scancode == 0x16)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'U';
else
return 'u';

else if (scancode == 0x17)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'I';
else
return 'i';

else if (scancode == 0x18)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'O';
else
return 'o';

else if (scancode == 0x19)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'P';
else
return 'p';

else if (scancode == 0x1A)
if (shift_pressed == TRUE)
return '{';
else
return '[';

else if (scancode == 0x1B)
if (shift_pressed == TRUE)
return '}';
else
return ']';

// enter pressed
else if (scancode == 0x1C)
{
enter_pressed = TRUE;
return '\n';
}

// ctrl pressed
else if (scancode == 0x1D)
ctrl_pressed = TRUE;

else if (scancode == 0x1E)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'A';
else
return 'a';

else if (scancode == 0x1F)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'S';
else
return 's';

else if (scancode == 0x20)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'D';
else
return 'd';

else if (scancode == 0x21)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'F';
else
return 'f';

else if (scancode == 0x22)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'G';
else
return 'g';

else if (scancode == 0x23)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'H';
else
return 'h';

else if (scancode == 0x24)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'J';
else
return 'j';

else if (scancode == 0x25)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'K';
else
return 'k';

else if (scancode == 0x26)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'L';
else
return 'l';

else if (scancode == 0x27)
if (shift_pressed == TRUE)
return ':';
else
return ';';

else if (scancode == 0x28)
if (shift_pressed == TRUE)
return '@';
else
return '\'';

else if (scancode == 0x29)
if (shift_pressed == TRUE)
return '~';
else
return '`';

// shift pressed
else if (scancode == 0x2A)
shift_pressed = TRUE;

else if (scancode == 0x2B)
if (shift_pressed == TRUE)
return '|';
else
return '\\';

else if (scancode == 0x2C)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'Z';
else
return 'z';

else if (scancode == 0x2D)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'X';
else
return 'x';

else if (scancode == 0x2E)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'C';
else
return 'c';

else if (scancode == 0x2F)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'V';
else
return 'v';

else if (scancode == 0x30)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'B';
else
return 'b';

else if (scancode == 0x31)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'N';
else
return 'n';

else if (scancode == 0x32)
if (shift_pressed == TRUE || caps_pressed == TRUE)
return 'M';
else
return 'm';

else if (scancode == 0x33)
if (shift_pressed == TRUE)
return '<';
else
return ',';

else if (scancode == 0x34)
if (shift_pressed == TRUE)
return '>';
else
return '.';

else if (scancode == 0x35)
if (shift_pressed == TRUE)
return '?';
else
return '/';

// shift pressed
else if (scancode == 0x36)
shift_pressed = TRUE;

// alt pressed
else if (scancode == 0x38)
alt_pressed = TRUE;

else if (scancode == 0x39)
return ' ';

// Caps pressed
else if (scancode == 0x3A)
if (caps_pressed == TRUE)
caps_pressed = FALSE;
else if (caps_pressed == FALSE)
caps_pressed = TRUE;

// shift released
if (scancode == 0xAA)
shift_pressed = FALSE;

// shift released
if (scancode == 0xB6)
shift_pressed = FALSE;

return '\0';
}
Loading

0 comments on commit 10bc7e5

Please sign in to comment.