summaryrefslogtreecommitdiff
path: root/src/kernel/arch/i386/tty/vga.c
blob: db4b47fd8e94bbf3a26b6770002f57c20b0291ba (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
#include <kernel/arch/i386/tty/vga.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 (size_t 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;
}