added memcpy{,w,d}(), memset{,w,d}(); filled in kputc()

git-svn-id: svn://anubis/hos/trunk@46 5b3e749e-e535-0410-8002-a9bb6afbdfca
This commit is contained in:
josh 2009-07-13 21:42:18 +00:00
parent 6a69fd06ec
commit a4d497544e
7 changed files with 109 additions and 3 deletions

View File

@ -4,8 +4,10 @@
#include "multiboot.h" #include "multiboot.h"
#include "k_early_panic.h" #include "k_early_panic.h"
#include "mm/mm.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) = 0x0700 | (chr)
extern "C" { extern "C" {
@ -44,6 +46,7 @@ u32_t k_bootstrap(mb_info_t * mb_info, u32_t mb_magic)
* before calling them. * before calling them.
*/ */
mm_bootstrap(); mm_bootstrap();
kio_bootstrap();
return 0; return 0;
} }

View File

@ -5,7 +5,7 @@
void k_early_panic(const char * msg) void k_early_panic(const char * msg)
{ {
char * dest = (char *) CONSOLE_MEMORY; char * dest = (char *) (CONSOLE_MEMORY + KERNEL_OFFSET);
while (*msg) while (*msg)
{ {
*dest++ = *msg++; *dest++ = *msg++;

View File

@ -15,7 +15,7 @@ extern "C" {
#define PAGE_HIGH_MASK (0xFFFFFFFFu << PAGE_LOG_SIZE) #define PAGE_HIGH_MASK (0xFFFFFFFFu << PAGE_LOG_SIZE)
#define PAGE_LOW_MASK (0xFFFFFFFFu >> (32 - 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 _code;
extern u8_t _bss; extern u8_t _bss;

View File

@ -1,4 +1,6 @@
#include "hos_types.h"
#include "hos_defines.h"
#include "kio.h" #include "kio.h"
#include "string.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_x2a(char * buf, unsigned int val);
static void fmt_o2a(char * buf, unsigned int val); static void fmt_o2a(char * buf, unsigned int val);
static int cursor_x, cursor_y;
extern "C" { extern "C" {
void kio_bootstrap()
{
cursor_x = 0;
cursor_y = 8;
}
void kprintf(char * fmt, ...) void kprintf(char * fmt, ...)
{ {
va_list args; va_list args;
@ -81,6 +91,39 @@ void kvprintf(char * fmt, va_list args)
void kputc(char c) 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) void kputs(char * s)

View File

@ -8,6 +8,8 @@
extern "C" { extern "C" {
#endif #endif
void kio_bootstrap();
void kprintf(char * fmt, ...); void kprintf(char * fmt, ...);
void kvprintf(char * fmt, va_list args); void kvprintf(char * fmt, va_list args);

View File

@ -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" */ } /* extern "C" */

View File

@ -2,12 +2,22 @@
#ifndef STRING_H #ifndef STRING_H
#define STRING_H #define STRING_H
#include "hos_defines.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
void strcpy(char * dst, const char * src); 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 #ifdef __cplusplus
} }
#endif #endif