diff --git a/CMakeLists.txt b/CMakeLists.txt index eb72fbe..53966cc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,8 +18,7 @@ file(GLOB KERN_SRC "*.asm" "*.cpp") file(GLOB KERN_LIB_SRC "kernel/*.cpp" "kernel/*.asm") # Driver source -file(GLOB DRIV_DISP_VGA "kernel/drivers/VGA/*.cpp" "kernel/drivers/VGA/*.asm") -file(GLOB DRIV_DISP_TERM "kernel/drivers/terminal/*.cpp" "kernel/drivers/terminal/*.asm") +file(GLOB DRIV_DISP_VGA "kernel/drivers/terminal/*.cpp" "kernel/drivers/terminal/*.asm") # Lib source file(GLOB LIB_STD "lib/std/*.cpp" "lib/std/*.asm") @@ -27,7 +26,7 @@ file(GLOB LIB_STD "lib/std/*.cpp" "lib/std/*.asm") add_executable(OwOS ${KERN_SRC} ${KERN_LIB_SRC} - ${DRIV_DISP_VGA} ${DRIV_DISP_TERM} + ${DRIV_DISP_VGA} ${LIB_STD}) set_target_properties(OwOS PROPERTIES OUTPUT_NAME "OwOS.bin") diff --git a/build/OwOS.bin b/build/OwOS.bin index 8960002..dab5835 100755 Binary files a/build/OwOS.bin and b/build/OwOS.bin differ diff --git a/build/OwOS.iso b/build/OwOS.iso index 6991253..73405fd 100644 Binary files a/build/OwOS.iso and b/build/OwOS.iso differ diff --git a/iso/boot/OwOS.bin b/iso/boot/OwOS.bin index 8960002..dab5835 100644 Binary files a/iso/boot/OwOS.bin and b/iso/boot/OwOS.bin differ diff --git a/kernel.cpp b/kernel.cpp index 98fa373..4eb5ab8 100644 --- a/kernel.cpp +++ b/kernel.cpp @@ -1,4 +1,3 @@ -#include #include extern "C" @@ -7,20 +6,45 @@ int kernel_main() { cls(); showCursor(); - - putcar(0, 0, 'H', 0x01, 0x07); - putcar(1, 0, 'A', 0x01, 0x07); - putcar(2, 0, 'H', 0x01, 0x07); - putcar(3, 0, 'A', 0x01, 0x07); - putcar(4, 0, '!', 0x01, 0x07); - putcar(5, 0, ' ', 0x01, 0x07); - putcar(6, 0, 'P', 0x01, 0x07); - putcar(7, 0, 'E', 0x01, 0x07); - putcar(8, 0, 'N', 0x01, 0x07); - putcar(9, 0, 'I', 0x01, 0x07); - putcar(10, 0, 'S', 0x01, 0x07); - putcar(11, 0, '!', 0x01, 0x07); + // putchar('P'); + // putchar('E'); + // putchar('N'); + // setFGColour(VGA_BLACK); + // setBGColour(VGA_BRIGHT_MAGENTA); + // putchar('I'); + // putchar('S'); + // putchar('\n'); + // putchar('L'); + // putchar('m'); + // putchar('a'); + // putchar('o'); + + // write("HAHHAHAHAHAHAHAHHAHAHAHAHHAHAHAHAHAHAHHAHAHAHHAHAHAHHAAHAHAHHAHAHAHAHAHAHAHAHAHHAAHHAHA Penis!"); + + // writeln("LMAO I WANT TO DIE"); + // writeln("LMAO I WANT TO DIE"); + // writeln("LMAO I WANT TO DIE"); + // writeln("LMAO I WANT TO DIE"); + // writeln("LMAO I WANT TO DIE"); + // writeln("LMAO I WANT TO DIE"); + // writeln("LMAO I WANT TO DIE"); + // writeln("LMAO I WANT TO DIE"); + // writeln("LMAO I WANT TO DIE"); + // writeln("LMAO I WANT TO DIE"); + // writeln("LMAO I WANT TO DIE"); + // writeln("LMAO I WANT TO DIE"); + // writeln("LMAO I WANT TO DIE"); + // writeln("LMAO I WANT TO DIE"); + // writeln("LMAO I WANT TO DIE"); + // writeln("LMAO I WANT TO DIE"); + // writeln("LMAO I WANT TO DIE"); + // writeln("LMAO I WANT TO DIE"); + // writeln("LMAO I WANT TO DIE"); + // writeln("LMAO I WANT TO DIE"); + // writeln("LMAO I WANT TO DIE"); + // writeln("LMAO I WANT TO DIE"); + for (;;) asm("hlt"); diff --git a/kernel/drivers/VGA/vga.cpp b/kernel/drivers/VGA/vga.cpp deleted file mode 100644 index 6d38c27..0000000 --- a/kernel/drivers/VGA/vga.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "vga.h" - -VGAChar_t* framebuffer = (VGAChar_t*)0xB8000; - -void putcar(int x, int y, char c, char foreground, char background) { - framebuffer[(y * TERM_WIDTH) + x].c = c; - framebuffer[(y * TERM_WIDTH) + x].foreground = foreground; - framebuffer[(y * TERM_WIDTH) + x].background = background; -} diff --git a/kernel/drivers/VGA/vga.h b/kernel/drivers/VGA/vga.h deleted file mode 100644 index fad8674..0000000 --- a/kernel/drivers/VGA/vga.h +++ /dev/null @@ -1,10 +0,0 @@ -#define TERM_WIDTH 80 -#define TERM_HEIGHT 25 - -struct VGAChar_t { - char c; - char foreground:4; - char background:4; -}__attribute__((packed)); - -void putcar(int x, int y, char c, char foreground, char background); diff --git a/kernel/drivers/terminal/terminal.cpp b/kernel/drivers/terminal/terminal.cpp index dad4f0f..0642b36 100644 --- a/kernel/drivers/terminal/terminal.cpp +++ b/kernel/drivers/terminal/terminal.cpp @@ -5,35 +5,55 @@ static const int TERMINAL_WIDTH = 80; static const int TERMINAL_HEIGHT = 24; -static char* frameBuffer = (char*)0xB8000; +static VGAChar_t* frameBuffer = (VGAChar_t*)0xB8000; static char clearColour = 0x0; -static char bgColour = 0x0; +static char bgColour = 0x0; static char fgColour = 0xF; -struct Cursor { - uint8_t x; - uint8_t y; -} __attribute__((packed)); - Cursor cursor; void cls() { - for (uint8_t x = 0; x < TERMINAL_WIDTH; x++) { - for (uint8_t y = 0; y < TERMINAL_HEIGHT; y++) { - frameBuffer[x + TERMINAL_WIDTH * y] = 0; - } - } + for (uint8_t x = 0; x < TERMINAL_WIDTH; x++) + for (uint8_t y = 0; y < TERMINAL_HEIGHT; y++) + putchar(x, y, ' ', fgColour, clearColour); - moveCursor(0,0); + cursor.x = 0; cursor.y = 0; + updateCursor(cursor); } void putchar(char input) { + if (cursor.x + 1 > TERMINAL_WIDTH) { + nline(); + } + if (input == '\n') { + nline(); + } else { + putchar(cursor.x, cursor.y, input, fgColour, bgColour); + cursor.x++; + } + updateCursor(cursor); +} +void putchar(int x, int y, char c, char foreground, char background) { + frameBuffer[(y * TERMINAL_WIDTH) + x].c = c; + frameBuffer[(y * TERMINAL_WIDTH) + x].foreground = foreground; + frameBuffer[(y * TERMINAL_WIDTH) + x].background = background; } void write(char* input) { - + for (uint32_t i = 0; i < strlen(input); i++) { + if (cursor.x + 1 > TERMINAL_WIDTH) { + nline(); + } + if (input[i] == '\n') { + nline(); + } else { + putchar(cursor.x, cursor.y, input[i], fgColour, bgColour); + cursor.x++; + } + } + updateCursor(cursor); } void writeln(char* input) { @@ -42,19 +62,29 @@ void writeln(char* input) { } void nline() { - + cursor.y++; + cursor.x = 0; + updateCursor(cursor); } void setClearColour(char col) { clearColour = col; } +void setFGColour(char col) { + fgColour = col; +} + +void setBGColour(char col) { + bgColour = col; +} + void showCursor() { outb(0x3D4, 0x0A); - outb(0x3D5, (inb(0x3D5) & 0xC0) | 1); + outb(0x3D5, (inb(0x3D5) & 0xC0) | 0x0); // Cursor start top outb(0x3D4, 0x0B); - outb(0x3D5, (inb(0x3D5) & 0xE0) | 1); + outb(0x3D5, (inb(0x3D5) & 0xE0) | 0xF); // Cursor start bottom } void hideCursor() { @@ -62,11 +92,20 @@ void hideCursor() { outb(0x3D5, 0x20); } -void moveCursor(int x, int y) { - uint16_t pos = y * TERMINAL_WIDTH + x; +void updateCursor(Cursor c) { + uint16_t pos = c.y * TERMINAL_WIDTH + c.x; outb(0x3D4, 0x0F); outb(0x3D5, (uint8_t) (pos & 0xFF)); outb(0x3D4, 0x0E); outb(0x3D5, (uint8_t) ((pos >> 8) & 0xFF)); } + +void setCursorPosition(int x, int y) { + cursor.x = x; cursor.y = y; + updateCursor(cursor); +} + +uint8_t getVGACol(char f, char b) { + return f | b << 4; +} diff --git a/kernel/drivers/terminal/terminal.h b/kernel/drivers/terminal/terminal.h index 6466f0f..1f15a8a 100644 --- a/kernel/drivers/terminal/terminal.h +++ b/kernel/drivers/terminal/terminal.h @@ -2,27 +2,39 @@ #include enum { - BLACK = 0x0, - BLUE = 0x1, - GREEN = 0x2, - CYAN = 0x3, - RED = 0x4, - MAGENTA = 0x5, - BROWN = 0x6, - GREY = 0x7, - DARK_GREY = 0x8, - BRIGHT_BLUE = 0x9, - BRIGHT_GREEN = 0xA, - BRIGHT_CYAN = 0xB, - BRIGHT_RED = 0xC, - BRIGHT_MAGENTA = 0xD, - YELLOW = 0xE, - WHITE = 0xF, + VGA_BLACK = 0x0, + VGA_BLUE = 0x1, + VGA_GREEN = 0x2, + VGA_CYAN = 0x3, + VGA_RED = 0x4, + VGA_MAGENTA = 0x5, + VGA_BROWN = 0x6, + VGA_GREY = 0x7, + VGA_DARK_GREY = 0x8, + VGA_BRIGHT_BLUE = 0x9, + VGA_BRIGHT_GREEN = 0xA, + VGA_BRIGHT_CYAN = 0xB, + VGA_BRIGHT_RED = 0xC, + VGA_BRIGHT_MAGENTA = 0xD, + VGA_YELLOW = 0xE, + VGA_WHITE = 0xF, }; +struct VGAChar_t { + char c; + char foreground:4; + char background:4; +}__attribute__((packed)); + +struct Cursor { + uint8_t x; + uint8_t y; +} __attribute__((packed)); + void cls(); void putchar(char input); +void putchar(int x, int y, char c, char foreground, char background); void write(char* input); void writeln(char* input); @@ -30,8 +42,11 @@ void writeln(char* input); void nline(); void setClearColour(char col); +void setFGColour(char col); +void setBGColour(char col); void showCursor(); void hideCursor(); -void moveCursor(int x, int y); +void updateCursor(Cursor c); +void setCursorPosition(int x, int y); diff --git a/lib/std/memory.cpp b/lib/std/memory.cpp new file mode 100644 index 0000000..e69de29 diff --git a/lib/std/memory.h b/lib/std/memory.h new file mode 100644 index 0000000..bb86781 --- /dev/null +++ b/lib/std/memory.h @@ -0,0 +1,6 @@ +#include + +int memcmp(const void* a, const void* b, uint32_t sze); +void* memcpy(const void* dst, const void* src, uint32_t sze); +void* memmove(void* dst, const void* src, uint32_t sze); +void* memset(void* ptr, int val, uint32_t sze); diff --git a/lib/std/string.cpp b/lib/std/string.cpp index 285d0dc..f1a8a8f 100644 --- a/lib/std/string.cpp +++ b/lib/std/string.cpp @@ -1,5 +1,8 @@ #include "string.h" uint32_t strlen(char* str) { - + uint32_t len = 0; + while (str[len]) + len++; + return len; }