Now prints "Hello, World" on boot
This commit is contained in:
@@ -8,5 +8,10 @@
|
|||||||
"directory": "/workspaces/AdvOpSys/build/OSDev_18",
|
"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",
|
"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"
|
"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
|
add_executable(uiaos-kernel
|
||||||
src/multiboot2.asm # TODO: Add multiboot2 support
|
src/multiboot2.asm # TODO: Add multiboot2 support
|
||||||
src/kernel.c
|
src/kernel.c
|
||||||
|
src/terminal.c
|
||||||
)
|
)
|
||||||
|
|
||||||
# Include directories for the kernel target
|
# Include directories for the kernel target
|
||||||
|
|||||||
@@ -1,16 +1,36 @@
|
|||||||
#include <libc/stdio.h>
|
#ifndef KERNEL_TERMINAL_H
|
||||||
#include <libc/stdint.h>
|
#define KERNEL_TERMINAL_H
|
||||||
#include <libc/limits.h>
|
|
||||||
#include <libc/stddef.h>
|
#include <libc/stddef.h>
|
||||||
|
#include <libc/stdint.h>
|
||||||
|
|
||||||
const size_t VGA_HEIGHT = 25;
|
enum vga_colour{
|
||||||
const size_t VGA_WIDTH = 80;
|
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);
|
||||||
|
|
||||||
|
#endif
|
||||||
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);
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,10 @@
|
|||||||
#include <libc/stdint.h>
|
#include <libc/stdint.h>
|
||||||
|
#include <kernel/terminal.h>
|
||||||
|
|
||||||
void main(void) {
|
void main(void) {
|
||||||
|
terminalInitialize();
|
||||||
|
terminalWriteString("Hello, World!\n");
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
__asm__ volatile ("hlt");
|
__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