summaryrefslogtreecommitdiff
path: root/kernel/tty.c
blob: 5c4c47d01e2f901acba42dc337ed3109d973ce23 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/* will be moved to userspace later on */

#include <kernel/tty.h>

struct vga_cell {
	unsigned char c;
	unsigned char style;
} __attribute__((__packed__));

static const size_t     vga_len = 80 * 25;
static struct vga_cell *vga     = (void*) 0xB8000;
static size_t           vga_pos = 0;

static void tty_scroll() {
	for (int i = 0; i < vga_len - 80; i++) {
		vga[i] = vga[i + 80];
	}
	vga_pos -= 80;
}

void tty_putchar(char c)
{
	if (vga_pos >= vga_len - 80) tty_scroll();
	vga[vga_pos++].c = c;
}

void tty_write(const char *buf, size_t len)
{
	for (size_t i = 0; i < len; i++) {
		tty_putchar(buf[i]);
	}
}

void tty_clear() {
	for (size_t i = 0; i < vga_len; i++)
		vga[i].c = ' ';
	vga_pos = 0;
}