From da858dfe7689feffe72d4ea2a3e6ed87b40c4af1 Mon Sep 17 00:00:00 2001 From: Benjamin Kyd Date: Thu, 25 Apr 2019 21:39:31 +0100 Subject: [PATCH] itos --- .gitignore | 2 +- build/OwOS.bin | Bin 10064 -> 10172 bytes build/OwOS.iso | Bin 5027840 -> 5027840 bytes iso/boot/OwOS.bin | Bin 10064 -> 10172 bytes kernel.cpp | 27 ++++++++++++++++- kernel/drivers/terminal/terminal.cpp | 42 ++++++++++++++------------- kernel/drivers/terminal/terminal.h | 7 +++-- kernel/kernio.h | 2 ++ kernel/multiboot.h | 35 ++++++++++++++++++++++ lib/std/memory.cpp | 2 +- lib/std/memory.h | 2 ++ lib/std/stdlib.cpp | 37 +++++++++++++++++++++++ lib/std/stdlib.h | 5 ++++ lib/std/string.h | 2 ++ 14 files changed, 137 insertions(+), 26 deletions(-) create mode 100644 kernel/multiboot.h create mode 100644 lib/std/stdlib.cpp create mode 100644 lib/std/stdlib.h 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 58298a47824c4b22eadf0617fd74b8dfec20704c..5046529549b7d31d8b221fc41c809babe3327052 100755 GIT binary patch delta 1555 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 Am;e9( diff --git a/iso/boot/OwOS.bin b/iso/boot/OwOS.bin index 58298a47824c4b22eadf0617fd74b8dfec20704c..5046529549b7d31d8b221fc41c809babe3327052 100644 GIT binary patch delta 1555 zcmZ8hZ%kWN6hE)DtaM#@bU@2QxWJ>;Q3;#q{v^h2FsCTAOJ|&n2pxacCS!eTJJCc1 zEh5X-r20(slkUUfXRrkQK;pC$F=~P)CYvT^i6+)%S;Xwa;^v;e^IlmRZgcNBzu)=2 zd+s~;ysq{w1+&5u@V(pITrM^fiOusp4ta8ghzeV6MClvO==>&`3gu-)-&hq32Y#^{ z{%6eJ1OvX3`LDniGA6Oi!5>ZkD*Io%rTb?T3~i#F5K4o zJPo!eQ`%|Iu7elhRsXB&ov^guWlviYc^7U#0A9k}jaV-%J?*m3Se|k@(`B#cUH1LU z5b=h8V2)_tdb(@@iRipm<@HZ;!U3SAJG$bcAoPh2_aC6`uh0kZ2 zu{_IpN7wW6UQ5t?4~>U47y@$@+?6}J_N(_n+b#H3?LTkhBVII6$6a0LuH(T^2fziu zp+}7&uBS76y9M(?P)y0GBsmY7j`-r6wYlCmrEN0Y zbezzQ)d5E>lW7c=aSiM>t4ssMcr(XsGI4P^z7sfGF4JR0d;nNTGQCyAJ-~C&bD>$^ zFVQ3ol_cauQ^5QtEQkZE*pTbZ_zm6w8~R}xzXLmj4Y@NI^KEzFd9EhoPk=+XC2nWN zp8{XA$iyAW_zQl2Cj@(o#4-dlBpWrVA{+exoW+Js#rRd=RUGJW5npGF19TO!g|7l} zZU#=U6?k9C0sX)N73I%><2!0Vgh~VlSWvF*ZMoGrax!+jeOOf~nM&Z3H{8Mg&g4Wy z4Go6}wa1mP+eESOAR!V<#UruYjPkN%nct+{Yi+3DOP@!zlUl2^KAfmRn9txBdDGvAbRm3NJ~hg9!%}_KXwD_z}z{%|2Z?~%*%G4#j>f6v(+vSzW zoDVf9GJo)G(6L~{&^nPHO3|l6Ha)zdgm?6zuV3E&lP?1~0XdyhBvYNPAZ76uFlD%f zlo6ZaQInFU6rx;cJiI%)Ud#zWhiG)SnXa<>SoCf37UTDvtSr3#yt1F>Bl|61xnipyaw2F)l8Fjlo$2;Mk!CcfrlzMk8*)WzHOmXM@Kqa=7@rt-q(YtE{81Pe#1w z<3GFuifP*_ule%r{1V&QL~a@N71-5eK`Jh6M!xhtwg=2aHtd}zulPNdI-I*qj{A$9 O{Ut +#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);