Now prints "Hello, World" on boot
This commit is contained in:
@@ -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"
|
||||
}
|
||||
]
|
||||
Binary file not shown.
BIN
build/OSDev_18/kernel.bin
Normal file → Executable file
BIN
build/OSDev_18/kernel.bin
Normal file → Executable file
Binary file not shown.
Binary file not shown.
@@ -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
|
||||
|
||||
@@ -1,16 +1,36 @@
|
||||
#include <libc/stdio.h>
|
||||
#include <libc/stdint.h>
|
||||
#include <libc/limits.h>
|
||||
#ifndef KERNEL_TERMINAL_H
|
||||
#define KERNEL_TERMINAL_H
|
||||
|
||||
#include <libc/stddef.h>
|
||||
#include <libc/stdint.h>
|
||||
|
||||
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);
|
||||
}
|
||||
#endif
|
||||
@@ -1,6 +1,10 @@
|
||||
#include <libc/stdint.h>
|
||||
#include <kernel/terminal.h>
|
||||
|
||||
void main(void) {
|
||||
terminalInitialize();
|
||||
terminalWriteString("Hello, World!\n");
|
||||
|
||||
for (;;) {
|
||||
__asm__ volatile ("hlt");
|
||||
}
|
||||
|
||||
78
src/OSDev_18/src/terminal.c
Normal file
78
src/OSDev_18/src/terminal.c
Normal file
@@ -0,0 +1,78 @@
|
||||
#include <kernel/terminal.h>
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user