From 1d4201505e6d88c7828503930dd07dc8d60df97a Mon Sep 17 00:00:00 2001 From: Ben Date: Thu, 25 Apr 2019 16:18:23 +0100 Subject: [PATCH] Terminal --- CMakeLists.txt | 5 +- build/OwOS.bin | Bin 9628 -> 9844 bytes build/OwOS.iso | Bin 16535552 -> 16535552 bytes iso/boot/OwOS.bin | Bin 9628 -> 9844 bytes kernel.cpp | 52 +++++++++++++----- kernel/drivers/VGA/vga.cpp | 9 ---- kernel/drivers/VGA/vga.h | 10 ---- kernel/drivers/terminal/terminal.cpp | 77 ++++++++++++++++++++------- kernel/drivers/terminal/terminal.h | 49 +++++++++++------ lib/std/memory.cpp | 0 lib/std/memory.h | 6 +++ lib/std/string.cpp | 5 +- 12 files changed, 140 insertions(+), 73 deletions(-) delete mode 100644 kernel/drivers/VGA/vga.cpp delete mode 100644 kernel/drivers/VGA/vga.h create mode 100644 lib/std/memory.cpp create mode 100644 lib/std/memory.h 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 8960002dd752dd8bfca4c4c2402bc14f0771b887..dab58351aa909c21d5563537730e65c32ca4a46e 100755 GIT binary patch literal 9844 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 b32o)$l6;DEaHI8Akie_Fw1yp+Hbb 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 diff --git a/iso/boot/OwOS.bin b/iso/boot/OwOS.bin index 8960002dd752dd8bfca4c4c2402bc14f0771b887..dab58351aa909c21d5563537730e65c32ca4a46e 100644 GIT binary patch literal 9844 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 b3 #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; }