kernel print and mem

This commit is contained in:
nub31
2025-08-22 23:39:38 +02:00
parent c3d42e8033
commit 6db69608bb
7 changed files with 173 additions and 8 deletions

View File

@@ -7,12 +7,18 @@ run: build/os.bin
build/os.bin: build/boot.bin build/kernel.bin build/zeroes.bin
cat build/boot.bin build/kernel.bin build/zeroes.bin > build/os.bin
build/kernel.bin: build/kernel.o build/kernel_entry.o
i386-elf-ld -o build/kernel.bin -Ttext 0x1000 build/kernel_entry.o build/kernel.o --oformat binary
build/kernel.bin: build/kernel_entry.o build/kernel.o build/mem.o build/print.o
i386-elf-ld -o build/kernel.bin -Ttext 0x1000 build/kernel_entry.o build/kernel.o build/mem.o build/print.o --oformat binary
build/kernel.o: src/kernel.c
i386-elf-gcc -ffreestanding -m32 -c -o build/kernel.o src/kernel.c
build/mem.o: src/mem.c
i386-elf-gcc -ffreestanding -m32 -c -o build/mem.o src/mem.c
build/print.o: src/print.c
i386-elf-gcc -ffreestanding -m32 -c -o build/print.o src/print.c
build/kernel_entry.o: src/kernel_entry.asm
nasm -f elf -o build/kernel_entry.o src/kernel_entry.asm

View File

@@ -1,5 +1,7 @@
int main(void)
#include "print.h"
void init(void)
{
*(char*)0xb8000 = 'A';
return 0;
}
print_init();
print("Starting nub-os\n", VGA_FG_WHITE, VGA_BG_BLACK);
}

View File

@@ -1,5 +1,5 @@
section .text
[bits 32]
[extern main]
call main
[extern init]
call init
jmp $

26
src/mem.c Normal file
View File

@@ -0,0 +1,26 @@
#include "mem.h"
void* memcpy(void* dest, const void* src, long n)
{
char* d = dest;
const char* s = src;
for (long i = 0; i < n; i++)
d[i] = s[i];
return dest;
}
void* memset(void* dest, int val, long n)
{
char* d = dest;
for (long i = 0; i < n; i++)
d[i] = val;
return dest;
}
long strlen(const char* str)
{
long len = 0;
while (str[len])
len++;
return len;
}

3
src/mem.h Normal file
View File

@@ -0,0 +1,3 @@
void* memcpy(void* dest, const void* src, long n);
void* memset(void* dest, int val, long n);
long strlen(const char* str);

94
src/print.c Normal file
View File

@@ -0,0 +1,94 @@
#include "print.h"
#define VGA_WIDTH 80
#define VGA_HEIGHT 25
char* vga_text_pos;
void print_init(void)
{
vga_text_pos = (char*)0xb8000;
}
void print(char* string, enum VGA_FG_COLOR fg_color, enum VGA_BG_COLOR bg_color)
{
for (int i = 0; string[i]; i++)
{
char c = string[i];
switch (c)
{
case '\n':
{
vga_text_pos += 160 - ((vga_text_pos - (char*)0xb8000) % 160);
break;
}
case '\r':
{
vga_text_pos -= ((vga_text_pos - (char*)0xb8000) % 160);
break;
}
case '\t':
{
int offset = (vga_text_pos - (char*)0xb8000) % 160;
int next_tab = ((offset / 16) + 1) * 16;
vga_text_pos += next_tab - offset;
break;
}
case '\b':
{
if (vga_text_pos > (char*)0xb8000)
{
vga_text_pos -= 2;
*vga_text_pos = ' ';
*(vga_text_pos + 1) = (bg_color << 4) | fg_color;
}
break;
}
case '\f':
{
char* start = (char*)0xb8000;
for (int j = 0; j < 80 * 25 * 2; j += 2)
{
start[j] = ' ';
start[j + 1] = (bg_color << 4) | fg_color;
}
vga_text_pos = (char*)0xb8000;
break;
}
case '\a':
{
break;
}
default:
{
*vga_text_pos++ = c;
*vga_text_pos++ = (bg_color << 4) | fg_color;
break;
}
}
if (vga_text_pos >= (char*)0xb8000 + VGA_WIDTH * VGA_HEIGHT * 2)
{
char* start = (char*)0xb8000;
for (int row = 1; row < VGA_HEIGHT; row++)
{
for (int col = 0; col < VGA_WIDTH * 2; col++)
{
start[(row - 1) * VGA_WIDTH * 2 + col] = start[row * VGA_WIDTH * 2 + col];
}
}
char* last_row = start + (VGA_HEIGHT - 1) * VGA_WIDTH * 2;
for (int col = 0; col < VGA_WIDTH * 2; col += 2)
{
last_row[col] = ' ';
last_row[col + 1] = (VGA_BG_BLACK << 4) | VGA_FG_WHITE;
}
vga_text_pos -= VGA_WIDTH * 2;
}
}
}

34
src/print.h Normal file
View File

@@ -0,0 +1,34 @@
enum VGA_FG_COLOR
{
VGA_FG_BLACK = 0x0,
VGA_FG_BLUE = 0x1,
VGA_FG_GREEN = 0x2,
VGA_FG_CYAN = 0x3,
VGA_FG_RED = 0x4,
VGA_FG_MAGENTA = 0x5,
VGA_FG_BROWN = 0x6,
VGA_FG_LIGHT_GRAY = 0x7,
VGA_FG_DARK_GRAY = 0x8,
VGA_FG_LIGHT_BLUE = 0x9,
VGA_FG_LIGHT_GREEN = 0xA,
VGA_FG_LIGHT_CYAN = 0xB,
VGA_FG_LIGHT_RED = 0xC,
VGA_FG_LIGHT_MAGENTA = 0xD,
VGA_FG_YELLOW = 0xE,
VGA_FG_WHITE = 0xF,
};
enum VGA_BG_COLOR
{
VGA_BG_BLACK = 0x0,
VGA_BG_BLUE = 0x1,
VGA_BG_GREEN = 0x2,
VGA_BG_CYAN = 0x3,
VGA_BG_RED = 0x4,
VGA_BG_MAGENTA = 0x5,
VGA_BG_BROWN = 0x6,
VGA_BG_LIGHT_GRAY = 0x7,
};
void print(char* string, enum VGA_FG_COLOR fg_color, enum VGA_BG_COLOR bg_color);
void print_init(void);