mirror of
https://github.com/wichtounet/thor-os.git
synced 2025-09-19 09:35:15 -04:00
Display an hello world in C++
This commit is contained in:
parent
0621247e54
commit
6e823e6d6a
10
Makefile
10
Makefile
@ -10,14 +10,16 @@ micro_kernel.bin: $(KERNEL_SRC) $(KERNEL_UTILS_SRC)
|
||||
nasm -w+all -f bin -o micro_kernel.bin src/micro_kernel.asm
|
||||
|
||||
kernel.o: src/kernel.cpp
|
||||
g++ -Wall -Wextra -O2 -fno-exceptions -fno-rtti -ffreestanding -c src/kernel.cpp -o kernel.o
|
||||
g++ -O2 -std=c++11 -Wall -Wextra -fno-exceptions -fno-rtti -ffreestanding -c src/kernel.cpp -o kernel.o
|
||||
|
||||
kernel.bin: kernel.o
|
||||
g++ -T linker.ld -o kernel.bin.o -ffreestanding -O2 -nostdlib kernel.o
|
||||
kernel.bin: kernel.o
|
||||
g++ -std=c++11 -T linker.ld -o kernel.bin.o -ffreestanding -O2 -nostdlib kernel.o
|
||||
objcopy -R .note -R .comment -S -O binary kernel.bin.o kernel.bin
|
||||
|
||||
filler.bin: kernel.bin
|
||||
bash fill.bash
|
||||
|
||||
thor.flp: bootloader.bin micro_kernel.bin kernel.bin
|
||||
thor.flp: bootloader.bin micro_kernel.bin kernel.bin filler.bin
|
||||
cat bootloader.bin > thor.bin
|
||||
cat micro_kernel.bin >> thor.bin
|
||||
cat kernel.bin >> thor.bin
|
||||
|
@ -8,7 +8,7 @@ SECTIONS
|
||||
{
|
||||
/* Begin putting sections at 1 MiB, a conventional place for kernels to be
|
||||
loaded at by the bootloader. */
|
||||
. = 0x10000;
|
||||
. = 0x5000;
|
||||
|
||||
/* First put the multiboot header, as it is required to be put very early
|
||||
early in the image or the bootloader won't recognize the file format.
|
||||
|
@ -573,6 +573,8 @@ load_command:
|
||||
|
||||
call 0x5000
|
||||
|
||||
jmp $
|
||||
|
||||
call clear_command
|
||||
|
||||
ret
|
||||
|
@ -1,8 +1,66 @@
|
||||
void k_print_line(const char* string);
|
||||
void k_print(const char* string);
|
||||
|
||||
extern "C"
|
||||
void kernel_main(){
|
||||
unsigned char *vidmem = (unsigned char*) 0x0B8000;
|
||||
k_print_line("hello, world!");
|
||||
|
||||
*vidmem++ = 'a';
|
||||
*vidmem++ = 0;
|
||||
*vidmem++ = 'b';
|
||||
return;
|
||||
}
|
||||
|
||||
typedef unsigned int uint8_t __attribute__((__mode__(__QI__)));
|
||||
typedef unsigned int uint16_t __attribute__ ((__mode__ (__HI__)));
|
||||
|
||||
enum vga_color {
|
||||
BLACK = 0,
|
||||
BLUE = 1,
|
||||
GREEN = 2,
|
||||
CYAN = 3,
|
||||
RED = 4,
|
||||
MAGENTA = 5,
|
||||
BROWN = 6,
|
||||
LIGHT_GREY = 7,
|
||||
DARK_GREY = 8,
|
||||
LIGHT_BLUE = 9,
|
||||
LIGHT_GREEN = 10,
|
||||
LIGHT_CYAN = 11,
|
||||
LIGHT_RED = 12,
|
||||
LIGHT_MAGENTA = 13,
|
||||
LIGHT_BROWN = 14,
|
||||
WHITE = 15,
|
||||
};
|
||||
|
||||
uint8_t make_color(vga_color fg, vga_color bg){
|
||||
return fg | bg << 4;
|
||||
}
|
||||
|
||||
uint16_t make_vga_entry(char c, uint8_t color){
|
||||
uint16_t c16 = c;
|
||||
uint16_t color16 = color;
|
||||
return c16 | color16 << 8;
|
||||
}
|
||||
|
||||
void k_print_line(const char* string){
|
||||
long current_line = 0;
|
||||
long current_column = 0;
|
||||
|
||||
k_print(string);
|
||||
|
||||
current_column = 0;
|
||||
++current_line;
|
||||
}
|
||||
|
||||
void k_print(const char* string){
|
||||
long current_line = 0;
|
||||
long current_column = 0;
|
||||
|
||||
uint16_t* vga_buffer = (uint16_t*) 0x0B8000;
|
||||
|
||||
for(int i = 0; string[i] != 0; ++i){
|
||||
vga_buffer[current_line * 80 + current_column] = make_vga_entry(string[i], make_color(WHITE, BLACK));
|
||||
|
||||
++current_column;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user