aboutsummaryrefslogtreecommitdiff
path: root/devices/vga.hpp
blob: 5287d736fbe6cf1be3d194ed062a3e2c8a2309a3 (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
39
40
41
42
43
44
45
46
47
48
49
50
51
#pragma once

#include <stdio.h>

/** Hardware text mode color constants. */
enum vga_color {
  VGA_COLOR_BLACK = 0,
  VGA_COLOR_BLUE = 1,
  VGA_COLOR_GREEN = 2,
  VGA_COLOR_CYAN = 3,
  VGA_COLOR_RED = 4,
  VGA_COLOR_MAGENTA = 5,
  VGA_COLOR_BROWN = 6,
  VGA_COLOR_LIGHT_GREY = 7,
  VGA_COLOR_DARK_GREY = 8,
  VGA_COLOR_LIGHT_BLUE = 9,
  VGA_COLOR_LIGHT_GREEN = 10,
  VGA_COLOR_LIGHT_CYAN = 11,
  VGA_COLOR_LIGHT_RED = 12,
  VGA_COLOR_LIGHT_MAGENTA = 13,
  VGA_COLOR_LIGHT_BROWN = 14,
  VGA_COLOR_WHITE = 15,
};

FILE *vga_init(void *buffer);

struct VGA : public kIoDevice {
  VGA(void *addr);

  void putc(char a) override;
  int puts(const char *string, int length) override;
  void
  flush() override
  {
    update_cursor();
  }

  struct __attribute__((packed)) VGAEntry {
    unsigned char text;
    unsigned char foreground : 4;
    unsigned char background : 4;
  };

private:
  void clear(enum vga_color foreground, enum vga_color background);
  void update_cursor();

  struct VGAEntry *buffer;
  int col = 0;
  int row = 0;
};