From 6db69608bb87ccd648ec056ff64b8b9a23e4a87b Mon Sep 17 00:00:00 2001 From: nub31 Date: Fri, 22 Aug 2025 23:39:38 +0200 Subject: [PATCH] kernel print and mem --- makefile | 10 ++++- src/kernel.c | 10 +++-- src/kernel_entry.asm | 4 +- src/mem.c | 26 ++++++++++++ src/mem.h | 3 ++ src/print.c | 94 ++++++++++++++++++++++++++++++++++++++++++++ src/print.h | 34 ++++++++++++++++ 7 files changed, 173 insertions(+), 8 deletions(-) create mode 100644 src/mem.c create mode 100644 src/mem.h create mode 100644 src/print.c create mode 100644 src/print.h diff --git a/makefile b/makefile index 8c55fd5..46ea858 100644 --- a/makefile +++ b/makefile @@ -7,12 +7,18 @@ run: build/os.bin build/os.bin: build/boot.bin build/kernel.bin build/zeroes.bin cat build/boot.bin build/kernel.bin build/zeroes.bin > build/os.bin -build/kernel.bin: build/kernel.o build/kernel_entry.o - i386-elf-ld -o build/kernel.bin -Ttext 0x1000 build/kernel_entry.o build/kernel.o --oformat binary +build/kernel.bin: build/kernel_entry.o build/kernel.o build/mem.o build/print.o + i386-elf-ld -o build/kernel.bin -Ttext 0x1000 build/kernel_entry.o build/kernel.o build/mem.o build/print.o --oformat binary build/kernel.o: src/kernel.c i386-elf-gcc -ffreestanding -m32 -c -o build/kernel.o src/kernel.c +build/mem.o: src/mem.c + i386-elf-gcc -ffreestanding -m32 -c -o build/mem.o src/mem.c + +build/print.o: src/print.c + i386-elf-gcc -ffreestanding -m32 -c -o build/print.o src/print.c + build/kernel_entry.o: src/kernel_entry.asm nasm -f elf -o build/kernel_entry.o src/kernel_entry.asm diff --git a/src/kernel.c b/src/kernel.c index 9b6317e..1d2767b 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1,5 +1,7 @@ -int main(void) +#include "print.h" + +void init(void) { - *(char*)0xb8000 = 'A'; - return 0; -} \ No newline at end of file + print_init(); + print("Starting nub-os\n", VGA_FG_WHITE, VGA_BG_BLACK); +} diff --git a/src/kernel_entry.asm b/src/kernel_entry.asm index 7992f82..226b798 100644 --- a/src/kernel_entry.asm +++ b/src/kernel_entry.asm @@ -1,5 +1,5 @@ section .text [bits 32] - [extern main] - call main + [extern init] + call init jmp $ \ No newline at end of file diff --git a/src/mem.c b/src/mem.c new file mode 100644 index 0000000..37c55a8 --- /dev/null +++ b/src/mem.c @@ -0,0 +1,26 @@ +#include "mem.h" + +void* memcpy(void* dest, const void* src, long n) +{ + char* d = dest; + const char* s = src; + for (long i = 0; i < n; i++) + d[i] = s[i]; + return dest; +} + +void* memset(void* dest, int val, long n) +{ + char* d = dest; + for (long i = 0; i < n; i++) + d[i] = val; + return dest; +} + +long strlen(const char* str) +{ + long len = 0; + while (str[len]) + len++; + return len; +} \ No newline at end of file diff --git a/src/mem.h b/src/mem.h new file mode 100644 index 0000000..c097f60 --- /dev/null +++ b/src/mem.h @@ -0,0 +1,3 @@ +void* memcpy(void* dest, const void* src, long n); +void* memset(void* dest, int val, long n); +long strlen(const char* str); diff --git a/src/print.c b/src/print.c new file mode 100644 index 0000000..d2d46b3 --- /dev/null +++ b/src/print.c @@ -0,0 +1,94 @@ +#include "print.h" + +#define VGA_WIDTH 80 +#define VGA_HEIGHT 25 + +char* vga_text_pos; + +void print_init(void) +{ + vga_text_pos = (char*)0xb8000; +} + +void print(char* string, enum VGA_FG_COLOR fg_color, enum VGA_BG_COLOR bg_color) +{ + for (int i = 0; string[i]; i++) + { + char c = string[i]; + + switch (c) + { + case '\n': + { + + vga_text_pos += 160 - ((vga_text_pos - (char*)0xb8000) % 160); + break; + } + case '\r': + { + vga_text_pos -= ((vga_text_pos - (char*)0xb8000) % 160); + break; + } + case '\t': + { + int offset = (vga_text_pos - (char*)0xb8000) % 160; + int next_tab = ((offset / 16) + 1) * 16; + vga_text_pos += next_tab - offset; + break; + } + case '\b': + { + if (vga_text_pos > (char*)0xb8000) + { + vga_text_pos -= 2; + *vga_text_pos = ' '; + *(vga_text_pos + 1) = (bg_color << 4) | fg_color; + } + break; + } + case '\f': + { + char* start = (char*)0xb8000; + for (int j = 0; j < 80 * 25 * 2; j += 2) + { + start[j] = ' '; + start[j + 1] = (bg_color << 4) | fg_color; + } + vga_text_pos = (char*)0xb8000; + break; + } + case '\a': + { + break; + } + default: + { + *vga_text_pos++ = c; + *vga_text_pos++ = (bg_color << 4) | fg_color; + break; + } + } + + if (vga_text_pos >= (char*)0xb8000 + VGA_WIDTH * VGA_HEIGHT * 2) + { + char* start = (char*)0xb8000; + + for (int row = 1; row < VGA_HEIGHT; row++) + { + for (int col = 0; col < VGA_WIDTH * 2; col++) + { + start[(row - 1) * VGA_WIDTH * 2 + col] = start[row * VGA_WIDTH * 2 + col]; + } + } + + char* last_row = start + (VGA_HEIGHT - 1) * VGA_WIDTH * 2; + for (int col = 0; col < VGA_WIDTH * 2; col += 2) + { + last_row[col] = ' '; + last_row[col + 1] = (VGA_BG_BLACK << 4) | VGA_FG_WHITE; + } + + vga_text_pos -= VGA_WIDTH * 2; + } + } +} \ No newline at end of file diff --git a/src/print.h b/src/print.h new file mode 100644 index 0000000..4d4396b --- /dev/null +++ b/src/print.h @@ -0,0 +1,34 @@ +enum VGA_FG_COLOR +{ + VGA_FG_BLACK = 0x0, + VGA_FG_BLUE = 0x1, + VGA_FG_GREEN = 0x2, + VGA_FG_CYAN = 0x3, + VGA_FG_RED = 0x4, + VGA_FG_MAGENTA = 0x5, + VGA_FG_BROWN = 0x6, + VGA_FG_LIGHT_GRAY = 0x7, + VGA_FG_DARK_GRAY = 0x8, + VGA_FG_LIGHT_BLUE = 0x9, + VGA_FG_LIGHT_GREEN = 0xA, + VGA_FG_LIGHT_CYAN = 0xB, + VGA_FG_LIGHT_RED = 0xC, + VGA_FG_LIGHT_MAGENTA = 0xD, + VGA_FG_YELLOW = 0xE, + VGA_FG_WHITE = 0xF, +}; + +enum VGA_BG_COLOR +{ + VGA_BG_BLACK = 0x0, + VGA_BG_BLUE = 0x1, + VGA_BG_GREEN = 0x2, + VGA_BG_CYAN = 0x3, + VGA_BG_RED = 0x4, + VGA_BG_MAGENTA = 0x5, + VGA_BG_BROWN = 0x6, + VGA_BG_LIGHT_GRAY = 0x7, +}; + +void print(char* string, enum VGA_FG_COLOR fg_color, enum VGA_BG_COLOR bg_color); +void print_init(void); \ No newline at end of file