summaryrefslogtreecommitdiff
path: root/src/kernel/arch/i386/tty/vga.c
blob: 9efd326ce5220d1de85f28e7fa19c13ec91957b1 (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/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 vga_scroll(void) {
	for (size_t i = 0; i < vga_len - 80; i++)
		vga[i] = vga[i + 80];
	vga_pos -= 80;
}

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

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

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