summaryrefslogtreecommitdiff
path: root/src/kernel.c
diff options
context:
space:
mode:
authorAleksa Vučković <aleksav013@gmail.com>2021-10-11 11:35:59 +0200
committerAleksa Vučković <aleksav013@gmail.com>2021-10-11 11:35:59 +0200
commit578d467b80015c52d0c96c8443b4c13936f33365 (patch)
tree05525782bc3baf5a01d8b657f01934e1e598a775 /src/kernel.c
parent3a9ccbd8e762477f75d8b164a1d99383a01414ae (diff)
(IDT + keyboard) finally working
Diffstat (limited to 'src/kernel.c')
-rw-r--r--src/kernel.c86
1 files changed, 69 insertions, 17 deletions
diff --git a/src/kernel.c b/src/kernel.c
index c6d1045..0882580 100644
--- a/src/kernel.c
+++ b/src/kernel.c
@@ -6,6 +6,17 @@
static const size_t VGA_WIDTH = 80;
static const size_t VGA_HEIGHT = 25;
+#define PIC1_COMMAND_PORT 0x20
+#define PIC1_DATA_PORT 0x21
+#define PIC2_COMMAND_PORT 0xA0
+#define PIC2_DATA_PORT 0xA1
+// IO Ports for Keyboard
+#define KEYBOARD_DATA_PORT 0x60
+#define KEYBOARD_STATUS_PORT 0x64
+
+extern char ioport_in(uint8_t port);
+extern void ioport_out(uint8_t port, char data);
+
static inline uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg)
{
return fg | bg << 4;
@@ -23,24 +34,24 @@ uint16_t* terminal_buffer;
void terminal_initialize(void)
{
- terminal_row = 0;
- terminal_column = 0;
- terminal_color = vga_entry_color(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK);
- terminal_buffer = (uint16_t*) 0xB8000;
- for (size_t y = 0; y < VGA_HEIGHT; y++)
+ terminal_row=0;
+ terminal_column=0;
+ terminal_color=vga_entry_color(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK);
+ terminal_buffer=(uint16_t*) 0xB8000;
+ for(size_t y=0;y<VGA_HEIGHT;y++)
{
- for (size_t x = 0; x < VGA_WIDTH; x++)
+ for(size_t x=0;x<VGA_WIDTH;x++)
{
- const size_t index = y * VGA_WIDTH + x;
- terminal_buffer[index] = vga_entry(' ', terminal_color);
+ const size_t index=y*VGA_WIDTH+x;
+ terminal_buffer[index]=vga_entry(' ', terminal_color);
}
}
}
void terminal_putentryat(char c, uint8_t color, size_t x, size_t y)
{
- const size_t index = y * VGA_WIDTH + x;
- terminal_buffer[index] = vga_entry(c, color);
+ const size_t index=y*VGA_WIDTH+x;
+ terminal_buffer[index]=vga_entry(c, color);
}
void movescreen()
@@ -55,9 +66,9 @@ void terminal_putchar(char c)
else
{
terminal_putentryat(c, terminal_color, terminal_column, terminal_row);
- if (++terminal_column == VGA_WIDTH) terminal_column = 0,terminal_row++;
+ if (++terminal_column==VGA_WIDTH) terminal_column=0,terminal_row++;
}
- if (terminal_row == VGA_HEIGHT) movescreen();
+ if (terminal_row==VGA_HEIGHT) movescreen();
}
void terminal_writestring(const char* data)
@@ -65,13 +76,54 @@ void terminal_writestring(const char* data)
for(int i=0;data[i]!='\0';i++) terminal_putchar(data[i]);
}
-void kernel_main(void)
+void init_keyboard()
{
- terminal_initialize();
+ // 0xFD = 1111 1101 in binary. enables only IRQ1
+ // Why IRQ1? Remember, IRQ0 exists, it's 0-based
+ ioport_out(PIC1_DATA_PORT, 0xFD);
+}
+
+#include"keyboard.h"
+void handle_keyboard_interrupt()
+{
+ // Write end of interrupt (EOI)
+ ioport_out(PIC1_COMMAND_PORT, 0x20);
+ unsigned char status = ioport_in(KEYBOARD_STATUS_PORT);
+
+ // Lowest bit of status will be set if buffer not empty
+ // (thanks mkeykernel)
+ if (status & 0x1)
+ {
+ char keycode = ioport_in(KEYBOARD_DATA_PORT);
+ if (keycode < 0 || (uint8_t)keycode >= 128) return;
+
+ if(keycode==14)
+ {
+ if(terminal_column) terminal_column--;
+ terminal_putchar(keyboard[keycode]);
+ terminal_column--;
+ return;
+ }
- for(size_t i=0;i<50;i++)
- {
+ terminal_putchar(keyboard[keycode]);
+
+ }
+}
+void print_message()
+{
+ for(size_t i=0;i<50;i++)
+ {
for(size_t j=0;j<i;j++) terminal_writestring("#");
terminal_writestring("Hello, kernel World!\n");
- }
+ }
+}
+
+void kernel_main(void)
+{
+ terminal_initialize();
+ print_message();
+ init_idt_table();
+ init_keyboard();
+ terminal_writestring("First part is working\n");
+ while(1);
}