diff options
author | Olivier Gayot <duskcoder@gmail.com> | 2015-10-11 13:22:20 +0200 |
---|---|---|
committer | Olivier Gayot <duskcoder@gmail.com> | 2015-10-11 23:48:19 +0200 |
commit | 9b5760aa26108d5dd8ef6a4defadeeba0efc9630 (patch) | |
tree | 13a219eaf7b92c582fbd3746329d91a0d0bddcaf | |
parent | e885241b95d3784b5206fa6fbad7aa6861e8bd48 (diff) |
kfs: fixed the printing on the frame buffer
when clearing a line, we used to set the second byte to 0, which means
black foreground on black background. Thus, it looked like nothing was
written anymore afterwards.
Fixed by setting the foreground to white.
Signed-off-by: Olivier Gayot <duskcoder@gmail.com>
-rw-r--r-- | src/main.c | 45 |
1 files changed, 39 insertions, 6 deletions
@@ -1,6 +1,7 @@ #define NB_COLS 80 #define NB_ROWS 25 #define BPC 2 +#define BPR (BPC * NB_COLS) #define VIDEO_BUFFER 0xB8000 @@ -24,6 +25,19 @@ static void my_memset(void *_dest, int c, int n) } } +static void clear_line(void *_addr) +{ + char *addr = _addr; + + for (int i = 0; i < NB_COLS; ++i) { + if (i % BPC == 0) { + *addr++ = ' '; + } else { + *addr++ = 0x7; + } + } +} + int printk(const char *str) { static const long int offset = VIDEO_BUFFER; @@ -33,15 +47,34 @@ int printk(const char *str) for (int i = 0; str[i]; ++i) { /* TODO add the serial port handling */ - if ((long)addr >= offset + NB_COLS * NB_ROWS * BPC) { + char chr; + char *new_addr = addr; + char *addr_line = (char *)(((long)(addr - offset) / BPR) * BPR) + offset; + + if ((long)addr >= offset + NB_ROWS * BPR) { /* shift up */ - addr -= NB_COLS * BPC; - my_memmove((void *)offset, (void *)offset + NB_COLS * BPC, NB_COLS * (NB_ROWS - 1) * BPC); - my_memset((void *)offset + NB_COLS * (NB_ROWS - 1) * BPC, ' ', NB_COLS * BPC); + addr -= BPR; + addr_line -= BPR; + my_memmove((void *)offset, (void *)offset + BPR, BPR * (NB_ROWS - 1)); + clear_line(addr_line); } - *addr = str[i]; - addr += BPC; + + switch (str[i]) { + case '\n': + new_addr = addr_line + BPR; + chr = '\0'; + break; + default: + new_addr = addr + BPC; + chr = str[i]; + break; + } + + if (chr) + *addr = chr; + + addr = new_addr; ++count; } |