diff --git a/build/OSDev_18/compile_commands.json b/build/OSDev_18/compile_commands.json index fe72fc9..e3b71ee 100644 --- a/build/OSDev_18/compile_commands.json +++ b/build/OSDev_18/compile_commands.json @@ -8,5 +8,10 @@ "directory": "/workspaces/AdvOpSys/build/OSDev_18", "command": "/usr/local/bin/i686-elf-gcc -I/workspaces/AdvOpSys/src/OSDev_18/include -g -Wall -Wextra -nostdinc -nostdlib -fno-builtin -fno-stack-protector -fno-stack-check -fno-lto -fPIE -m32 -march=i386 -mno-mmx -mno-sse -mno-sse2 -mno-red-zone -Wno-main -g -Wno-unused-variable -Wno-unused-parameter -std=gnu99 -o CMakeFiles/uiaos-kernel.dir/src/kernel.c.o -c /workspaces/AdvOpSys/src/OSDev_18/src/kernel.c", "file": "/workspaces/AdvOpSys/src/OSDev_18/src/kernel.c" +}, +{ + "directory": "/workspaces/AdvOpSys/build/OSDev_18", + "command": "/usr/local/bin/i686-elf-gcc -I/workspaces/AdvOpSys/src/OSDev_18/include -g -Wall -Wextra -nostdinc -nostdlib -fno-builtin -fno-stack-protector -fno-stack-check -fno-lto -fPIE -m32 -march=i386 -mno-mmx -mno-sse -mno-sse2 -mno-red-zone -Wno-main -g -Wno-unused-variable -Wno-unused-parameter -std=gnu99 -o CMakeFiles/uiaos-kernel.dir/src/terminal.c.o -c /workspaces/AdvOpSys/src/OSDev_18/src/terminal.c", + "file": "/workspaces/AdvOpSys/src/OSDev_18/src/terminal.c" } ] \ No newline at end of file diff --git a/build/OSDev_18/disk.iso b/build/OSDev_18/disk.iso index ca7780d..d891768 100644 Binary files a/build/OSDev_18/disk.iso and b/build/OSDev_18/disk.iso differ diff --git a/build/OSDev_18/kernel.bin b/build/OSDev_18/kernel.bin old mode 100644 new mode 100755 index 000ec00..f7eadce Binary files a/build/OSDev_18/kernel.bin and b/build/OSDev_18/kernel.bin differ diff --git a/build/OSDev_18/kernel.iso b/build/OSDev_18/kernel.iso index fac34b2..61a090b 100644 Binary files a/build/OSDev_18/kernel.iso and b/build/OSDev_18/kernel.iso differ diff --git a/src/OSDev_18/CMakeLists.txt b/src/OSDev_18/CMakeLists.txt index e653a82..aea8109 100644 --- a/src/OSDev_18/CMakeLists.txt +++ b/src/OSDev_18/CMakeLists.txt @@ -60,6 +60,7 @@ set(OS_KERNEL_LINKER "${CMAKE_CURRENT_SOURCE_DIR}/src/arch/${OS_ARCH_TARGET}/lin add_executable(uiaos-kernel src/multiboot2.asm # TODO: Add multiboot2 support src/kernel.c + src/terminal.c ) # Include directories for the kernel target diff --git a/src/OSDev_18/include/kernel/terminal.h b/src/OSDev_18/include/kernel/terminal.h index ef76ca4..7bd7a57 100644 --- a/src/OSDev_18/include/kernel/terminal.h +++ b/src/OSDev_18/include/kernel/terminal.h @@ -1,16 +1,36 @@ -#include -#include -#include +#ifndef KERNEL_TERMINAL_H +#define KERNEL_TERMINAL_H + #include +#include -const size_t VGA_HEIGHT = 25; -const size_t VGA_WIDTH = 80; +enum vga_colour{ + VGA_COLOR_BLACK = 0, + VGA_COLOR_BLUE = 1, + VGA_COLOR_GREEN = 2, + VGA_COLOR_CYAN = 3, + VGA_COLOR_RED = 4, + VGA_COLOR_MAGENTA = 5, + VGA_COLOR_BROWN = 6, + VGA_COLOR_LIGHT_GREY = 7, + VGA_COLOR_DARK_GREY = 8, + VGA_COLOR_LIGHT_BLUE = 9, + VGA_COLOR_LIGHT_GREEN = 10, + VGA_COLOR_LIGHT_CYAN = 11, + VGA_COLOR_LIGHT_RED = 12, + VGA_COLOR_LIGHT_MAGENTA = 13, + VGA_COLOR_LIGHT_BROWN = 14, + VGA_COLOR_WHITE = 15, +}; -static uint16_t* terminalBuffer = (uint16_t*) 0xB8000; +uint8_t vgaEntryColour(enum vga_colour fg, enum vga_colour bg); +uint16_t vgaEntry(unsigned char uc, uint8_t color); +void terminalEntryAt(char c, uint8_t colour, size_t x, size_t y); +void terminalInitialize(void); +void terminalSetColour(uint8_t colour); +void terminalPutChar(char c); +void terminalWrite(const char* data, size_t size); +void terminalWriteString(const char* data); - -void terminalEntryAt(char c, uint8_t colour, size_t x, size_t y){ - size_t index = y * VGA_WIDTH + x; - terminalBuffer[index] = vgaEntry(c, colour); -} \ No newline at end of file +#endif \ No newline at end of file diff --git a/src/OSDev_18/src/kernel.c b/src/OSDev_18/src/kernel.c index ab9c143..14afe40 100644 --- a/src/OSDev_18/src/kernel.c +++ b/src/OSDev_18/src/kernel.c @@ -1,6 +1,10 @@ #include +#include void main(void) { + terminalInitialize(); + terminalWriteString("Hello, World!\n"); + for (;;) { __asm__ volatile ("hlt"); } diff --git a/src/OSDev_18/src/terminal.c b/src/OSDev_18/src/terminal.c new file mode 100644 index 0000000..1dc1bb7 --- /dev/null +++ b/src/OSDev_18/src/terminal.c @@ -0,0 +1,78 @@ +#include + +const size_t VGA_HEIGHT = 25; +const size_t VGA_WIDTH = 80; + +static size_t terminal_row; +static size_t terminal_column; + +static uint8_t terminal_colour; +static uint16_t* terminal_buffer = (uint16_t*) 0xB8000; + +// Builds the colour byte +uint8_t vgaEntryColour(enum vga_colour fg, enum vga_colour bg) { + return fg | bg << 4; +} + +// Builds the full cell +uint16_t vgaEntry(unsigned char uc, uint8_t color) { + return (uint16_t) uc | (uint16_t) color << 8; +} + +void terminalEntryAt(char c, uint8_t colour, size_t x, size_t y){ + size_t index = y * VGA_WIDTH + x; + terminal_buffer[index] = vgaEntry(c, colour); +} + +void terminalInitialize(void) { + terminal_row = 0; + terminal_column = 0; + terminal_colour = vgaEntryColour(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK); + terminal_buffer = (uint16_t*) 0xB8000; + + for (size_t y = 0; y < VGA_HEIGHT; y++) { + for (size_t x = 0; x < VGA_WIDTH; x++) { + terminalEntryAt(' ', terminal_colour, x, y); + } + } +} + +void terminalSetColour(uint8_t colour) { + terminal_colour = colour; +} + +void terminalPutChar(char c) { + if (c == '\n') { + terminal_column = 0; + terminal_row++; + return; + } + terminalEntryAt(c, terminal_colour,terminal_column, terminal_row); + terminal_column++; + + if (terminal_column == VGA_WIDTH) { + terminal_column = 0; + terminal_row++; + } + + if (terminal_row == VGA_HEIGHT) { + terminal_row = 0; + } +} + +void terminalWrite(const char* data, size_t size) { + for (size_t i = 0; i < size; i++) { + terminalPutChar(data[i]); + } +} + +void terminalWriteString(const char* data) { + size_t len = 0; + + while (data[len] != '\0') { + len++; + } + + terminalWrite(data, len); +} +