From d5cf6a9696f6f86bec5652f94ba7485aae4ca1bc Mon Sep 17 00:00:00 2001 From: James Barnett Date: Tue, 28 Aug 2018 16:21:37 +0100 Subject: Add print_ln function --- .gitignore | 3 ++- build.sh | 15 ++++++++++----- kernel-bootstrap.asm | 22 ---------------------- kernel.c | 40 ---------------------------------------- kernel/io/text_mode_diplay.h | 3 +++ kernel/io/text_mode_display.c | 34 ++++++++++++++++++++++++++++++++++ kernel/kernel-bootstrap.asm | 22 ++++++++++++++++++++++ kernel/kernel.c | 15 +++++++++++++++ 8 files changed, 86 insertions(+), 68 deletions(-) delete mode 100644 kernel-bootstrap.asm delete mode 100644 kernel.c create mode 100644 kernel/io/text_mode_diplay.h create mode 100644 kernel/io/text_mode_display.c create mode 100644 kernel/kernel-bootstrap.asm create mode 100644 kernel/kernel.c diff --git a/.gitignore b/.gitignore index 8bacbce..6c30d7c 100644 --- a/.gitignore +++ b/.gitignore @@ -51,4 +51,5 @@ Module.symvers Mkfile.old dkms.conf -bin/ \ No newline at end of file +bin/ +.vscode/ \ No newline at end of file diff --git a/build.sh b/build.sh index febb1eb..9b67fcb 100755 --- a/build.sh +++ b/build.sh @@ -1,6 +1,11 @@ #!/bin/bash -mkdir -p bin -rm -f bin/* -nasm -f elf32 kernel-bootstrap.asm -o bin/kernel-bootstrap.o -gcc -m32 -std=c99 -c kernel.c -o bin/kernelc.o -ld -m elf_i386 -T link.ld -o bin/kernel bin/kernel-bootstrap.o bin/kernelc.o + +# TODO - proper makefile + +rm -rf bin/kernel/* +mkdir -p bin/kernel/io +nasm -f elf32 kernel/kernel-bootstrap.asm -o bin/kernel-bootstrap.o +gcc -m32 -std=c99 -c kernel/kernel.c -o bin/kernel/kernel.o +gcc -m32 -std=c99 -c kernel/io/text_mode_display.c -o bin/kernel/io/text_mode_display.o +ld -m elf_i386 -T link.ld -o bin/kern bin/kernel-bootstrap.o bin/kernel/kernel.o bin/kernel/io/text_mode_display.o +#ld -m elf_i386 -T link.ld -o bin/kern bin/kernel-bootstrap.o bin/**/*.o \ No newline at end of file diff --git a/kernel-bootstrap.asm b/kernel-bootstrap.asm deleted file mode 100644 index 9e3b10e..0000000 --- a/kernel-bootstrap.asm +++ /dev/null @@ -1,22 +0,0 @@ -bits 32 ; nasm 32-bit mode -section .text - - ; multiboot header -align 4 -dd 0x1BADB002 -dd 0x00 -dd - (0x1BADB002 + 0x00) ; checksum - -global start -extern kernel_entrypoint - - ; call kernel and halt -start: - cli ; disable interrups - mov esp, stack_space - call kernel_entrypoint - hlt - -section .bss -resb 8192 -stack_space: \ No newline at end of file diff --git a/kernel.c b/kernel.c deleted file mode 100644 index 1c3a97c..0000000 --- a/kernel.c +++ /dev/null @@ -1,40 +0,0 @@ - -#define FRAME_SIZE (80 * 25 * 2) // 80 cols, 25 rows, 2 bytes per char - -char *video_ram = (char *) 0xB8000; -int cursor_pos = 0; - -void clear_screen() -{ - for (int i = 0; i < FRAME_SIZE; i = i + 2) - { - video_ram[i] = ' '; - video_ram[i + 1] = 0x07; - }; - cursor_pos = 0; -} - -void print(char *msg) -{ - int j = 0; - while (msg[j] != '\0') - { - video_ram[cursor_pos++] = msg[j]; - video_ram[cursor_pos++] = 0x07; - ++j; - } -} - - -void run_kern() -{ - clear_screen(); - - print("I am a kernel!"); - print(" another message"); -} - -void kernel_entrypoint() -{ - run_kern(); -} diff --git a/kernel/io/text_mode_diplay.h b/kernel/io/text_mode_diplay.h new file mode 100644 index 0000000..d2d1180 --- /dev/null +++ b/kernel/io/text_mode_diplay.h @@ -0,0 +1,3 @@ +void clear_screen(); +void print(char *msg); +void print_ln(char *msg); \ No newline at end of file diff --git a/kernel/io/text_mode_display.c b/kernel/io/text_mode_display.c new file mode 100644 index 0000000..514ba9f --- /dev/null +++ b/kernel/io/text_mode_display.c @@ -0,0 +1,34 @@ +#define COLS 80 +#define ROWS 25 +#define FRAME_SIZE (ROWS * COLS * 2) // 2 bytes per char + +char *video_ram = (char *)0xB8000; +int cursor_pos = 0; + +void clear_screen() +{ + for (int i = 0; i < FRAME_SIZE; i = i + 2) + { + video_ram[i] = ' '; + video_ram[i + 1] = 0x07; + }; + cursor_pos = 0; +} + +void print(char *msg) +{ + int j = 0; + while (msg[j] != '\0') + { + video_ram[cursor_pos++] = msg[j]; + video_ram[cursor_pos++] = 0x07; + ++j; + } +} + +void print_ln(char *msg) +{ + print(msg); + int current_line = cursor_pos / COLS; + cursor_pos = (current_line + 1) * (COLS*2); +} diff --git a/kernel/kernel-bootstrap.asm b/kernel/kernel-bootstrap.asm new file mode 100644 index 0000000..9e3b10e --- /dev/null +++ b/kernel/kernel-bootstrap.asm @@ -0,0 +1,22 @@ +bits 32 ; nasm 32-bit mode +section .text + + ; multiboot header +align 4 +dd 0x1BADB002 +dd 0x00 +dd - (0x1BADB002 + 0x00) ; checksum + +global start +extern kernel_entrypoint + + ; call kernel and halt +start: + cli ; disable interrups + mov esp, stack_space + call kernel_entrypoint + hlt + +section .bss +resb 8192 +stack_space: \ No newline at end of file diff --git a/kernel/kernel.c b/kernel/kernel.c new file mode 100644 index 0000000..e872fa5 --- /dev/null +++ b/kernel/kernel.c @@ -0,0 +1,15 @@ +#include "./io/text_mode_diplay.h" + +void run_kern() +{ + clear_screen(); + + print_ln("I am a kernel!"); + print("I am on a new line"); + print(" - I am not"); +} + +void kernel_entrypoint() +{ + run_kern(); +} -- cgit v1.2.3