From 983174a081c9c099aa8a745887070be0bbab8374 Mon Sep 17 00:00:00 2001 From: Tomas Date: Sun, 16 Feb 2025 20:32:19 +0100 Subject: [PATCH] Began work on tty driver --- kernel/include/kernel.h | 17 +++++++++++++++-- kernel/include/tty.h | 5 +++++ kernel/src/kernel.c | 5 +++-- kernel/src/tty.c | 31 +++++++++++++++++++++++++++++++ makefile | 2 +- 5 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 kernel/src/tty.c diff --git a/kernel/include/kernel.h b/kernel/include/kernel.h index 5963b15..babe17c 100644 --- a/kernel/include/kernel.h +++ b/kernel/include/kernel.h @@ -18,7 +18,20 @@ #define __naked __attribute__((naked)) /* - * Utility macros + * Standard int types */ -#define sizeof_array(_a) () +// Unsigned +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long uint64_t; +// Signed +typedef signed char int8_t; +typedef signed short int16_t; +typedef signed int int32_t; +typedef signed long int64_t; +// Size +typedef uint32_t size_t; +typedef int32_t ssize_t; + #endif diff --git a/kernel/include/tty.h b/kernel/include/tty.h index f5daf3e..1500210 100644 --- a/kernel/include/tty.h +++ b/kernel/include/tty.h @@ -1,6 +1,11 @@ #ifndef _TTY_H #define _TTY_H +/* VGA Text mode */ +#define VGA_WIDTH 80 +#define VGA_HEIGHT 25 +#define VGA_MEMORY 0xb8000 + int tty_init(void); int tty_write(char* buf, size_t len); int tty_putc(char c); diff --git a/kernel/src/kernel.c b/kernel/src/kernel.c index e4471fc..fed6b12 100644 --- a/kernel/src/kernel.c +++ b/kernel/src/kernel.c @@ -1,8 +1,9 @@ #include +#include __noreturn void kmain(void) { - *(char*)0xb8000 = 'a'; - while (1) __asm__ volatile ("movl $69, %eax"); + tty_init(); + printk("Hello, World!\n"); } diff --git a/kernel/src/tty.c b/kernel/src/tty.c new file mode 100644 index 0000000..2504a9f --- /dev/null +++ b/kernel/src/tty.c @@ -0,0 +1,31 @@ +#include +#include + +struct { + size_t row; + size_t col; + uint8_t attr; + uint8_t* buf; +} ctx; + +void tty_init(void) { + ctx.row = 0; + ctx.col = 0; + ctx.attr = 0x07; + ctx.buf = (u8*)VGA_MEMORY; + + for (size_t y = 0; y < VGA_HEIGHT; y++) { + for (size_t x = 0; x < VGA_WIDTH; x++) { + size_t i = (y * VGA_WIDTH + x) * 2; + ctx.buf[i] = ' '; + ctx.buf[i + 1] = ctx.attr; + } + } +} + +int tty_write(char* buf, size_t len) {} + +int tty_putc(char c) {} + +int tty_puts(char* s) {} + diff --git a/makefile b/makefile index 83707c2..f585576 100644 --- a/makefile +++ b/makefile @@ -14,7 +14,7 @@ clean: qemu: qemu-system-x86_64\ - -drive format=raw,file=$(IMG),index=0,media=disk\ + -kernel ./kernel/kernel.elf -m 256M -accel tcg -monitor stdio -net none\ -rtc base=localtime,clock=host,driftfix=slew\ -audiodev pipewire,id=audio0 -machine pcspk-audiodev=audio0