From 695bd777515288ab6bf498e60605660b899163e7 Mon Sep 17 00:00:00 2001 From: Garritt McCune Date: Sat, 9 May 2020 21:55:51 -0500 Subject: [PATCH] Fixed a bug that caused the kernel image to lose it multiboot signature. Added code to test printing a string to the screen. --- build_numbers.c | 2 +- includes/kernel.h | 8 ++++++++ includes/screen.h | 5 +++++ kernel/kmain.c | 38 ++++++++++++++++++++++++++++++++------ kernel/loader.s | 8 +++----- support_files/boch.txt | 2 +- 6 files changed, 50 insertions(+), 13 deletions(-) create mode 100644 includes/kernel.h create mode 100644 includes/screen.h diff --git a/build_numbers.c b/build_numbers.c index 21a2a3b..1749ab0 100644 --- a/build_numbers.c +++ b/build_numbers.c @@ -1,3 +1,3 @@ #ifndef KERNEL_VERSION_NUMBER -#define KERNEL_VERSION_NUMBER "1.4.10-8" +#define KERNEL_VERSION_NUMBER "0.0.1-47" #endif diff --git a/includes/kernel.h b/includes/kernel.h new file mode 100644 index 0000000..9690b40 --- /dev/null +++ b/includes/kernel.h @@ -0,0 +1,8 @@ +#ifndef KERNEL_H +#define KERNEL_H + +void write_screen(unsigned int, char, unsigned char, unsigned char); +void move(unsigned short); +void draw_s(char*, unsigned char, unsigned char); +int strlen(char*); +#endif diff --git a/includes/screen.h b/includes/screen.h new file mode 100644 index 0000000..85d5009 --- /dev/null +++ b/includes/screen.h @@ -0,0 +1,5 @@ +#ifndef SCREEN_H +#define SCREEN_H +void draw_string(char*, unsigned char, unsigned char); +int strlen(char*); +#endif diff --git a/kernel/kmain.c b/kernel/kmain.c index 9161adb..addd9db 100644 --- a/kernel/kmain.c +++ b/kernel/kmain.c @@ -1,13 +1,20 @@ #include "../includes/io.h" +#include "../includes/kernel.h" -void write_screen(unsigned int, char, unsigned char, unsigned char); -void move(unsigned short); +//char* msg = "Hello, World!"; -extern void kmain() +void kmain() { - write_screen(0, 'A', 2, 8); - move(80); - //asm("hlt"); + draw_s("Hello, World!", 2, 9);/* + write_screen(0, "k", 2, 9); + write_screen(2, 'e', 2, 9); + write_screen(4, 'r', 2, 9); + write_screen(6, 'n', 2, 9); + write_screen(8, 'e', 2, 9); + write_screen(10, 'l', 2, 9); + write_screen(12, ' ', 2, 9); + write_screen(14, '3', 2, 9); + //asm("hlt");*/ } void write_screen(unsigned int i, char c, unsigned char fg, unsigned char bg) @@ -24,3 +31,22 @@ void move(unsigned short pos) outb(0x3D4, 15); outb(0x3D5, pos & 0x00FF); } + +void draw_s(char* string, unsigned char fg, unsigned char bg) +{ + char *video_buffer = 0x000B8000; + for(int i = 0; i < strlen(string); i++) + { + video_buffer[i] = string[i]; + video_buffer[i+1] = ((fg & 0x0f) << 4) | (bg & 0x0F); + } +} + +int strlen(char* string) +{ + int len = 0; + + for(int i = 0; string[i] != '\0'; i++) len++; + + return len; +} diff --git a/kernel/loader.s b/kernel/loader.s index aa9869a..b2c0a76 100644 --- a/kernel/loader.s +++ b/kernel/loader.s @@ -1,25 +1,23 @@ global loader +align 4 MAGIC_NUMBER equ 0x1BADB002 FLAGS equ 0x0 CHECKSUM equ -MAGIC_NUMBER -KERNEL_STACK_SIZE equ 4096 ; size of stack in bytes +KERNEL_STACK_SIZE equ 4096 ; size of stack in bytes -section .text: - align 4 dd MAGIC_NUMBER dd FLAGS dd CHECKSUM loader: + mov esp, kernel_stack; + KERNEL_STACK_SIZE ; ont ESP to the start of the stack (end of memory area) extern kmain call kmain ;mov eax, 0xCAFEBABE - ;mov esp, kernel_stack + KERNEL_STACK_SIZE ; piont ESP to the start of the stack (end of memory area) .loop: jmp .loop section .bss - alignb 4 resb KERNEL_STACK_SIZE ; reserve stack for kernel kernel_stack: diff --git a/support_files/boch.txt b/support_files/boch.txt index 25888cf..e36be6f 100644 --- a/support_files/boch.txt +++ b/support_files/boch.txt @@ -1,5 +1,5 @@ megs: 32 -display_library: x +display_library: x, options = "gui_debug" romimage: file=/usr/share/bochs/BIOS-bochs-latest vgaromimage: file=/usr/share/bochs/VGABIOS-lgpl-latest ata0-master: type=cdrom, path=kernel.iso, status=inserted