From d65d1a6e7497fcd60986ad4a55a90a4c7470e560 Mon Sep 17 00:00:00 2001 From: Ben Date: Thu, 25 Apr 2019 14:43:38 +0100 Subject: [PATCH] Colours --- CMakeLists.txt | 14 +++--- build/OwOS.bin | Bin 9320 -> 9628 bytes build/OwOS.iso | Bin 16535552 -> 16535552 bytes iso/boot/OwOS.bin | Bin 9264 -> 9628 bytes kernel.cpp | 28 ++++++----- kernel/drivers/VGA/vga.cpp | 2 +- kernel/drivers/VGA/vga.h | 2 +- kernel/drivers/terminal/terminal.cpp | 72 +++++++++++++++++++++++++++ kernel/drivers/terminal/terminal.h | 40 +++++++++++++-- kernel/kernio.cpp | 12 ----- kernel/kernio.h | 14 +++++- 11 files changed, 146 insertions(+), 38 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 569b2ac..eb72fbe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,19 +14,21 @@ include_directories(OwOS "./") # Kernel source -file(GLOB KERN_SRC "*.asm" "*.cpp" "kernel/*.asm" "kernel/*.cpp") +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/*.asm" "kernel/drivers/VGA/*.cpp") -file(GLOB DRIV_DISP_TERM "kernel/drivers/terminal/*.asm" "kernel/drivers/terminal/*.cpp") +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") # Lib source -file(GLOB LIB_STD "lib/std/*.asm" "lib/std/*.cpp") +file(GLOB LIB_STD "lib/std/*.cpp" "lib/std/*.asm") -set(SRCS ${KERN_SRC}) -add_executable(OwOS ${SRCS} ${DRIV_DISP_VGA} ${LIB_STD}) +add_executable(OwOS ${KERN_SRC} ${KERN_LIB_SRC} + ${DRIV_DISP_VGA} ${DRIV_DISP_TERM} + ${LIB_STD}) set_target_properties(OwOS PROPERTIES OUTPUT_NAME "OwOS.bin") diff --git a/build/OwOS.bin b/build/OwOS.bin index b99ede53468af727b121364ab4af9bdbe1b9acea..8960002dd752dd8bfca4c4c2402bc14f0771b887 100755 GIT binary patch delta 1369 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 delta 55672 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 diff --git a/iso/boot/OwOS.bin b/iso/boot/OwOS.bin index 334be574e51d377f525e023a712e668694b8adf0..8960002dd752dd8bfca4c4c2402bc14f0771b887 100644 GIT binary patch literal 9628 zcmeHNU1%It6h5=NX*X@yY}!aGtuU>NjX&LP`YWZ-Zq_6X&7V!HP=)PeGn-7hKVf!~ z)S^~c#Do}FN?$}Dgg&a!haws(B&=kP1iz{!ImZmp|Cz zM~C0)4mv90YT|26b9v!7ovTq>2_-V6X;$Rf}a}UEgKKm07!#RHY zJrA=DOu&B2!>C~D>^D42KbST4xQA&6v(`>|m|ieJ`&kdu1*YCU>|qALth0A|818+& zy+tr;Y4*xv@aRvIPnSvqGbbVqGmr4L$4qx*^UO1m=Go>83*QC&CnCY(a^vh)&InI! zoW2IKerYP9yij(2p0t1i8#)*^^%#pUMg4>0g}wG2x)dnQeF-5mFY!WEO4& z(*Ev9pgO7PMemHJ7e!0y1v_}Ve5Xv*%oSnEx#Og~98|V61Oij|I^6=d6~{XdDwR8& zkO+l)LR;HHYFjAM7HVk=J=GS99sQp$VcLu-HelZGW4`-%zVT47=qr>%*ihqbv=+pc z5PO1SFy;=iPT+iksdD|`>>6$e+|3&9EV$(w?oDvtfQxzBdl%fV;5K=B_3y!T+THvj& z8&<^n!)XUCIOEgR@i2Z7koPpIrjQPYcQ;&| zgTwnAE}n#w@ZeXR2p2s5sTy3W!Ee{#OEvg%4W6sPp8+o^VWG(eD76H9xSwfuGhK%o`j3LfzHpX=jyC3u6bu{B9#>nS&CSw(t-vK%3;2nH%PFMSH!i=Mw zkM@o@@x#C+V7_Kt{}|^x?|wAl8}mHyyl1>A;GaC05sui-)JjJ`aI(w<7y{D_UqmMeeP&JlZ&~@Q z1FZZQJs0mz#`YZOaGiG7iBob!%MFv$Pikz8hKH;umrNOX;Z6)|qO^1~YviOex_X9K=c(?bj*EvJPFLScna&OF?xRG!Rp=V$uyN^~-e#3( b3=@Y{Jdu?K9hfxQAi>Y*$vJt%}d3BqS2b|VO%@vu`tYEWdhFNlVc!!`vOL&;^% zk4$AB>qE+8)56dQio!+&8AQov9fC}t6tJKm{P{xW&x*FY~dwQ(Tp z3aKoTwXKm~rA4+xxLF2cU;x4*&+stPhDFL>Y%b2m|;nI`pv?$tS?$&5xJ z=FVCx*=ix|EQc3EONO-!p_pqpE<_w-DLfO8M8Xb)CR?L%*PJ&T%Q8)qe%7ux#PQ4j zL;b00FmcAe4+(rO;RVp>VcjSJ`d&9IZR@lp5X?Wu83jkmsTHX7U*oA~?EZpZz~dXm Crj7Oh diff --git a/kernel.cpp b/kernel.cpp index 0016ee8..98fa373 100644 --- a/kernel.cpp +++ b/kernel.cpp @@ -1,21 +1,25 @@ #include +#include extern "C" int kernel_main() { - putchar(0, 0, 'H', 0x01, 0x07); - putchar(1, 0, 'A', 0x01, 0x07); - putchar(2, 0, 'H', 0x01, 0x07); - putchar(3, 0, 'A', 0x01, 0x07); - putchar(4, 0, '!', 0x01, 0x07); - putchar(5, 0, ' ', 0x01, 0x07); - putchar(6, 0, 'P', 0x01, 0x07); - putchar(7, 0, 'E', 0x01, 0x07); - putchar(8, 0, 'N', 0x01, 0x07); - putchar(9, 0, 'I', 0x01, 0x07); - putchar(10, 0, 'S', 0x01, 0x07); - putchar(11, 0, '!', 0x01, 0x07); + 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); for (;;) asm("hlt"); diff --git a/kernel/drivers/VGA/vga.cpp b/kernel/drivers/VGA/vga.cpp index 18d1001..6d38c27 100644 --- a/kernel/drivers/VGA/vga.cpp +++ b/kernel/drivers/VGA/vga.cpp @@ -2,7 +2,7 @@ VGAChar_t* framebuffer = (VGAChar_t*)0xB8000; -void putchar(int x, int y, char c, char foreground, char background) { +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 index 34076c2..fad8674 100644 --- a/kernel/drivers/VGA/vga.h +++ b/kernel/drivers/VGA/vga.h @@ -7,4 +7,4 @@ struct VGAChar_t { char background:4; }__attribute__((packed)); -void putchar(int x, int y, char c, char foreground, char background); +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 e69de29..dad4f0f 100644 --- a/kernel/drivers/terminal/terminal.cpp +++ b/kernel/drivers/terminal/terminal.cpp @@ -0,0 +1,72 @@ +#include "terminal.h" + +#include + +static const int TERMINAL_WIDTH = 80; +static const int TERMINAL_HEIGHT = 24; + +static char* frameBuffer = (char*)0xB8000; + +static char clearColour = 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; + } + } + + moveCursor(0,0); +} + +void putchar(char input) { + +} + +void write(char* input) { + +} + +void writeln(char* input) { + write(input); + nline(); +} + +void nline() { + +} + +void setClearColour(char col) { + clearColour = col; +} + +void showCursor() { + outb(0x3D4, 0x0A); + outb(0x3D5, (inb(0x3D5) & 0xC0) | 1); + + outb(0x3D4, 0x0B); + outb(0x3D5, (inb(0x3D5) & 0xE0) | 1); +} + +void hideCursor() { + outb(0x3D4, 0x0A); + outb(0x3D5, 0x20); +} + +void moveCursor(int x, int y) { + uint16_t pos = y * TERMINAL_WIDTH + x; + + outb(0x3D4, 0x0F); + outb(0x3D5, (uint8_t) (pos & 0xFF)); + outb(0x3D4, 0x0E); + outb(0x3D5, (uint8_t) ((pos >> 8) & 0xFF)); +} diff --git a/kernel/drivers/terminal/terminal.h b/kernel/drivers/terminal/terminal.h index 7c64c9d..6466f0f 100644 --- a/kernel/drivers/terminal/terminal.h +++ b/kernel/drivers/terminal/terminal.h @@ -1,5 +1,37 @@ -#include +#include +#include -void clear(); -template -void print(T input); +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, +}; + +void cls(); + +void putchar(char input); + +void write(char* input); +void writeln(char* input); + +void nline(); + +void setClearColour(char col); + +void showCursor(); +void hideCursor(); + +void moveCursor(int x, int y); diff --git a/kernel/kernio.cpp b/kernel/kernio.cpp index a968f1e..17c0573 100644 --- a/kernel/kernio.cpp +++ b/kernel/kernio.cpp @@ -1,13 +1 @@ #include "kernio.h" - -inline void outb(uint16_t port, uint8_t b) { - asm("outb %0, %1" : : "a"(b), "Nd"(port)); -} - -inline uint8_t inb(uint16_t port) { - uint8_t ret; - asm volatile ( "inb %1, %0" - : "=a"(ret) // Output - : "Nd"(port)); // Input - return ret; -} diff --git a/kernel/kernio.h b/kernel/kernio.h index 0d37f00..317287c 100644 --- a/kernel/kernio.h +++ b/kernel/kernio.h @@ -1,4 +1,14 @@ #include -inline void outb(uint16_t port, uint8_t b); -inline uint8_t inb(uint16_t port); +inline void outb(uint16_t port, uint8_t b) { + asm("outb %0, %1" : : "a"(b), "Nd"(port)); +} + +inline uint8_t inb(uint16_t port) { + uint8_t ret; + asm ( "inb %1, %0" + : "=a"(ret) // Output + : "Nd"(port)); // Input + return ret; +} +