diff options
| author | Olivier Gayot <duskcoder@gmail.com> | 2015-10-09 16:01:32 +0200 | 
|---|---|---|
| committer | Olivier Gayot <duskcoder@gmail.com> | 2015-10-10 10:28:17 +0200 | 
| commit | ae5f4001c351b24a7f4e1bee6d995e4cb3cced2f (patch) | |
| tree | b50a074cf352a5f106edd50a354d0ce1b2fbace6 | |
kfs: implemented the onscreen printing system
the function is prototyped this way:
int printk(const char *string);
the code has not been tested yet
Signed-off-by: Olivier Gayot <duskcoder@gmail.com>
| -rw-r--r-- | kernel.c | 43 | 
1 files changed, 43 insertions, 0 deletions
| diff --git a/kernel.c b/kernel.c new file mode 100644 index 0000000..8e59664 --- /dev/null +++ b/kernel.c @@ -0,0 +1,43 @@ +#define NB_COLS 80 +#define NB_ROWS 25 + +/* XXX doest not always handle memory overlaps */ +static void my_memmove(void *dest, const void *src, size_t n) +{ +    for (size_t i = 0; i < n; ++i) { +        dest[i] = src[i]; +    } +} + +static void my_memset(void *dest, int c, size_t n) +{ +    for (size_t i = 0; i < n; ++i) { +        dest[i] = c; +    } +} + +int printk(const char *str) +{ +    static char *offset = (char *) 0xb8000; +    static char *addr = offset; +    int count = 0; + +    for (int i = 0; str[i]; ++i) { +        if ((long)addr >= 0xb8000 + NB_COLS * NB_ROWS) { +            /* shift up */ +            addr -= NB_COLS; +            my_memmove(offset, offset + NB_COLS, NB_COLS * (NB_ROWS - 1)); +            my_memset(offset + NB_COLS * (NB_ROWS - 1), ' ', NB_ROWS); +        } + +        *addr++ = str[i] +        ++count; + +    } + +    return count; +} + +int main(void) +{ +} | 
