diff --git a/.gitignore b/.gitignore index c80dc43..6ffb6c2 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,4 @@ CMakeCache.txt Makefile cmake_install.cmake .vscode/ -./OwOS.bin +.vs/ diff --git a/build/OwOS.bin b/build/OwOS.bin index 58298a4..5046529 100755 Binary files a/build/OwOS.bin and b/build/OwOS.bin differ diff --git a/build/OwOS.iso b/build/OwOS.iso index a9e4e2c..3a30cea 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 58298a4..5046529 100644 Binary files a/iso/boot/OwOS.bin and b/iso/boot/OwOS.bin differ diff --git a/kernel.cpp b/kernel.cpp index 3a66cee..0464331 100644 --- a/kernel.cpp +++ b/kernel.cpp @@ -1,12 +1,37 @@ +#include +#include #include extern "C" -int kernel_main() { +int kernel_main(uint32_t magic, multibootInfo_t* multiboot) { cls(); showCursor(); + write("OwOS "); + setFGColour(VGA_GREEN); + write("Starting Up..."); + setFGColour(VGA_WHITE); + + nline(); + + write("OwO, What's This? "); + write("*notices "); + + char* ram = ""; + itoa((int)multiboot->mem_upper, ram); + + write(ram); + write("mb of ram*"); + setFGColour(VGA_BRIGHT_MAGENTA); + write(" OwO That's a lot of memory"); + setFGColour(VGA_WHITE); + nline(); + nline(); + nline(); + + writeln("Okay, this is pretty epic"); for (;;) diff --git a/kernel/drivers/terminal/terminal.cpp b/kernel/drivers/terminal/terminal.cpp index b2f2981..8891923 100644 --- a/kernel/drivers/terminal/terminal.cpp +++ b/kernel/drivers/terminal/terminal.cpp @@ -1,6 +1,7 @@ #include "terminal.h" #include +#include static const int TERMINAL_WIDTH = 80; static const int TERMINAL_HEIGHT = 24; @@ -41,32 +42,33 @@ void puts(int x, int y, char c, char foreground, char background) { 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 { - puts(cursor.x, cursor.y, input[i], fgColour, bgColour); - cursor.x++; - } - } - updateCursor(cursor); -} - -void writeln(char* input) { - write(input); - nline(); -} - void nline() { cursor.y++; cursor.x = 0; updateCursor(cursor); } +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 { + puts(cursor.x, cursor.y, input[i], fgColour, bgColour); + cursor.x++; + } + } + updateCursor(cursor); +} + +void writeln(char* input) { + write(input); + nline(); +} + void setClearColour(char col) { clearColour = col; } diff --git a/kernel/drivers/terminal/terminal.h b/kernel/drivers/terminal/terminal.h index 165e8d6..53680d2 100644 --- a/kernel/drivers/terminal/terminal.h +++ b/kernel/drivers/terminal/terminal.h @@ -1,4 +1,5 @@ -#include +#pragma once + #include enum { @@ -36,11 +37,11 @@ void cls(); void puts(char input); void puts(int x, int y, char c, char foreground, char background); +void nline(); + void write(char* input); void writeln(char* input); -void nline(); - void setClearColour(char col); void setFGColour(char col); void setBGColour(char col); diff --git a/kernel/kernio.h b/kernel/kernio.h index 317287c..aa4d0c4 100644 --- a/kernel/kernio.h +++ b/kernel/kernio.h @@ -1,3 +1,5 @@ +#pragma once + #include inline void outb(uint16_t port, uint8_t b) { diff --git a/kernel/multiboot.h b/kernel/multiboot.h new file mode 100644 index 0000000..ba4ff57 --- /dev/null +++ b/kernel/multiboot.h @@ -0,0 +1,35 @@ +#pragma once + +#include + +// Totally stolen from here https://forum.osdev.org/viewtopic.php?f=1&t=8881 +struct multibootInfo_t { + uint32_t flags; + uint32_t mem_lower; + uint32_t mem_upper; + uint32_t boot_devices; + uint32_t cmdline; + uint32_t mods_count; + uint32_t mods_addr; + uint32_t syms_num; + uint32_t syms_size; + uint32_t syms_addr; + uint32_t syms_shndx; + uint32_t mmap_length; + uint32_t mmap_addr; + uint32_t drives_length; + uint32_t drives_addr; + uint32_t config_table; + char boot_loader_name[4]; + uint32_t apm_table; + uint32_t vbe_control_info; + uint32_t vbe_mode_info; + uint16_t vbe_mode; + uint16_t vbe_interface_seg; + uint16_t vbe_interface_off; + uint16_t vbe_interface_len; + uint64_t framebuffer_addr; + uint32_t framebuffer_pitch; + uint32_t framebuffer_width; + uint32_t framebuffer_height; +}; diff --git a/lib/std/memory.cpp b/lib/std/memory.cpp index 2765995..4780667 100644 --- a/lib/std/memory.cpp +++ b/lib/std/memory.cpp @@ -27,7 +27,7 @@ void* memmove(void* dst, const void* src, uint32_t size) { for (uint32_t i = 0; i < size; i++) d[i] = s[i]; else - for (uint32_t i = size; i--; ) + for (uint32_t i = size; --i; ) d[i-1] = s[i-1]; return dst; } diff --git a/lib/std/memory.h b/lib/std/memory.h index ca0e1e8..f9b382d 100644 --- a/lib/std/memory.h +++ b/lib/std/memory.h @@ -1,3 +1,5 @@ +#pragma once + #include bool memcmp(const void* a, const void* b, uint32_t size); diff --git a/lib/std/stdlib.cpp b/lib/std/stdlib.cpp new file mode 100644 index 0000000..d26ed6e --- /dev/null +++ b/lib/std/stdlib.cpp @@ -0,0 +1,37 @@ +#include "stdlib.h" + +#include "string.h" + +void swap(int* x, int* y) { + int* t = x; + x = y; + y = t; +} + +void reverse(char s[]) { + int i; + int j = strlen(s) - 1; + char c; + + for (i = 0; i < j; i++) { + j--; + c = s[i]; + s[i] = s[j]; + s[j] = c; + } +} + +void itoa(int i, char[] s) { + int i, sign; + + if ((sign = n) < 0) /* record sign */ + n = -n; /* make n positive */ + i = 0; + do { /* generate digits in reverse order */ + s[i++] = n % 10 + '0'; /* get next digit */ + } while ((n /= 10) > 0); /* delete it */ + if (sign < 0) + s[i++] = '-'; + s[i] = '\0'; + reverse(s); +} diff --git a/lib/std/stdlib.h b/lib/std/stdlib.h new file mode 100644 index 0000000..7354121 --- /dev/null +++ b/lib/std/stdlib.h @@ -0,0 +1,5 @@ +#pragma once + +void swap(int* a, int* b); +void reverse(char s[]) +void itoa(int i, char[] s); diff --git a/lib/std/string.h b/lib/std/string.h index 6a885f6..e0ae18e 100644 --- a/lib/std/string.h +++ b/lib/std/string.h @@ -1,3 +1,5 @@ +#pragma once + #include uint32_t strlen(char* str);