diff --git a/kernel/boot/k_bootstrap.cc b/kernel/boot/k_bootstrap.cc index 2820ecc..a33344a 100644 --- a/kernel/boot/k_bootstrap.cc +++ b/kernel/boot/k_bootstrap.cc @@ -4,8 +4,10 @@ #include "multiboot.h" #include "k_early_panic.h" #include "mm/mm.h" +#include "lang/kio.h" -#define DEBUG_LETTER(col,chr) *(u16_t *)(CONSOLE_MEMORY + 160 * 8 + (col) * 2) \ +#define DEBUG_LETTER(col,chr) *(u16_t *)(KERNEL_OFFSET + CONSOLE_MEMORY \ + + 160 * 8 + (col) * 2) \ = 0x0700 | (chr) extern "C" { @@ -44,6 +46,7 @@ u32_t k_bootstrap(mb_info_t * mb_info, u32_t mb_magic) * before calling them. */ mm_bootstrap(); + kio_bootstrap(); return 0; } diff --git a/kernel/boot/k_early_panic.c b/kernel/boot/k_early_panic.c index 273f8c1..ada7f05 100644 --- a/kernel/boot/k_early_panic.c +++ b/kernel/boot/k_early_panic.c @@ -5,7 +5,7 @@ void k_early_panic(const char * msg) { - char * dest = (char *) CONSOLE_MEMORY; + char * dest = (char *) (CONSOLE_MEMORY + KERNEL_OFFSET); while (*msg) { *dest++ = *msg++; diff --git a/kernel/include/hos_defines.h b/kernel/include/hos_defines.h index e4a4a87..c12f14a 100644 --- a/kernel/include/hos_defines.h +++ b/kernel/include/hos_defines.h @@ -15,7 +15,7 @@ extern "C" { #define PAGE_HIGH_MASK (0xFFFFFFFFu << PAGE_LOG_SIZE) #define PAGE_LOW_MASK (0xFFFFFFFFu >> (32 - PAGE_LOG_SIZE)) -#define CONSOLE_MEMORY (KERNEL_OFFSET + 0xB8000) +#define CONSOLE_MEMORY 0xB8000 extern u8_t _code; extern u8_t _bss; diff --git a/kernel/lang/kio.cc b/kernel/lang/kio.cc index d30a9e6..d1d0292 100644 --- a/kernel/lang/kio.cc +++ b/kernel/lang/kio.cc @@ -1,4 +1,6 @@ +#include "hos_types.h" +#include "hos_defines.h" #include "kio.h" #include "string.h" @@ -12,8 +14,16 @@ static void fmt_ull2a(char * buf, unsigned long long val); static void fmt_x2a(char * buf, unsigned int val); static void fmt_o2a(char * buf, unsigned int val); +static int cursor_x, cursor_y; + extern "C" { +void kio_bootstrap() +{ + cursor_x = 0; + cursor_y = 8; +} + void kprintf(char * fmt, ...) { va_list args; @@ -81,6 +91,39 @@ void kvprintf(char * fmt, va_list args) void kputc(char c) { + u16_t * console_memory = (u16_t *) CONSOLE_MEMORY; + console_memory += 80 * cursor_y + cursor_x; + switch (c) + { + case '\t': + { + int to_advance = 8 - (cursor_x & 0x3); + while (to_advance--) + { + *console_memory++ = 0x0720; + } + } + break; + case '\n': + cursor_x = 0; + cursor_y++; + break; + default: + *console_memory = 0x0700 | (c & 0xFF); + break; + } + if (cursor_x >= 80) + { + cursor_x = 0; + cursor_y++; + } + if (cursor_y >= 25) + { + memcpy((u8_t *) CONSOLE_MEMORY, + (u8_t *) (CONSOLE_MEMORY + 80 * 2), + 2 * 80 * 24); + memsetw((u16_t *) (CONSOLE_MEMORY + 2 * 80 * 24), 0x0720, 80); + } } void kputs(char * s) diff --git a/kernel/lang/kio.h b/kernel/lang/kio.h index 7916f0b..58b4e15 100644 --- a/kernel/lang/kio.h +++ b/kernel/lang/kio.h @@ -8,6 +8,8 @@ extern "C" { #endif +void kio_bootstrap(); + void kprintf(char * fmt, ...); void kvprintf(char * fmt, va_list args); diff --git a/kernel/lang/string.cc b/kernel/lang/string.cc index 8614fd9..f8e8e5d 100644 --- a/kernel/lang/string.cc +++ b/kernel/lang/string.cc @@ -11,4 +11,52 @@ void strcpy(char * dst, const char * src) } } +void memcpy(u8_t * dst, u8_t * src, u32_t size) +{ + for (u32_t n = 0; n < size; n++) + { + *dst++ = *src++; + } +} + +void memcpyw(u16_t * dst, u16_t * src, u32_t size) +{ + for (u32_t n = 0; n < size; n++) + { + *dst++ = *src++; + } +} + +void memcpyd(u32_t * dst, u32_t * src, u32_t size) +{ + for (u32_t n = 0; n < size; n++) + { + *dst++ = *src++; + } +} + +void memset(u8_t * dst, u8_t val, u32_t size) +{ + for (u32_t n = 0; n < size; n++) + { + *dst++ = val; + } +} + +void memsetw(u16_t * dst, u16_t val, u32_t size) +{ + for (u32_t n = 0; n < size; n++) + { + *dst++ = val; + } +} + +void memsetd(u32_t * dst, u32_t val, u32_t size) +{ + for (u32_t n = 0; n < size; n++) + { + *dst++ = val; + } +} + } /* extern "C" */ diff --git a/kernel/lang/string.h b/kernel/lang/string.h index 7505167..758484d 100644 --- a/kernel/lang/string.h +++ b/kernel/lang/string.h @@ -2,12 +2,22 @@ #ifndef STRING_H #define STRING_H +#include "hos_defines.h" + #ifdef __cplusplus extern "C" { #endif void strcpy(char * dst, const char * src); +void memcpy(u8_t * dst, u8_t * src, u32_t size); +void memcpyw(u16_t * dst, u16_t * src, u32_t size); +void memcpyd(u32_t * dst, u32_t * src, u32_t size); + +void memset(u8_t * dst, u8_t val, u32_t size); +void memsetw(u16_t * dst, u16_t val, u32_t size); +void memsetd(u32_t * dst, u32_t val, u32_t size); + #ifdef __cplusplus } #endif