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
|
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
|
cat build/boot.bin build/kernel.bin build/zeroes.bin > build/os.bin
|
||||||
|
|
||||||
build/kernel.bin: build/kernel.o build/kernel_entry.o
|
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 --oformat binary
|
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
|
build/kernel.o: src/kernel.c
|
||||||
i386-elf-gcc -ffreestanding -m32 -c -o 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
|
build/kernel_entry.o: src/kernel_entry.asm
|
||||||
nasm -f elf -o 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';
|
print_init();
|
||||||
return 0;
|
print("Starting nub-os\n", VGA_FG_WHITE, VGA_BG_BLACK);
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
section .text
|
section .text
|
||||||
[bits 32]
|
[bits 32]
|
||||||
[extern main]
|
[extern init]
|
||||||
call main
|
call init
|
||||||
jmp $
|
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