kernel print and mem
This commit is contained in:
10
makefile
10
makefile
@@ -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
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
section .text
|
||||
[bits 32]
|
||||
[extern main]
|
||||
call main
|
||||
[extern init]
|
||||
call init
|
||||
jmp $
|
||||
26
src/mem.c
Normal file
26
src/mem.c
Normal 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
3
src/mem.h
Normal 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
94
src/print.c
Normal 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
34
src/print.h
Normal 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);
|
||||
Reference in New Issue
Block a user