summaryrefslogtreecommitdiff
path: root/src/kernel/vga.c
blob: 8e438a8e1e45f7e3f006079e4ead3a2395037d76 (plain) (blame)
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <stdint.h>
#include <stdbool.h>

#define VGA_COLUMNS 80
#define VGA_LINES 25
#define VGA_START (uint16_t *)0x000b8000
#define VGA_END (VGA_START + VGA_COLUMNS * VGA_LINES)
uint16_t *cursor = VGA_START;
uint16_t color = 0x1f00;

void vga_scroll() {
  cursor = VGA_START;
}

void vga_blank() {
  uint32_t f = (color << 16) | color | 0x00200020;
  uint32_t *p = (uint32_t *)VGA_START;
  while (p < (uint32_t *)VGA_END)
    *(p++) = f;
  cursor = VGA_START;
}

void vga_printch(uint8_t ch) {
  if (ch == '\n') {
    if ((cursor = cursor - (cursor - VGA_START) % VGA_COLUMNS + VGA_COLUMNS) == VGA_END)
      vga_scroll();
    return;
  }
  *(cursor++) = color | ch;
  if (cursor == VGA_END)
    vga_scroll();
}

void vga_printsz(uint8_t *sz) {
  while (*sz)
    vga_printch(*(sz++));
}

void vga_printsn(uint8_t *sn, uint8_t n) {
  while (n--)
    vga_printch(*(sn++));
}

void vga_printu32(uint32_t n) {
  bool zero = false;
  for (uint32_t m = 1000000000; m; m /= 10) {
    uint8_t d = (n / m) % 10;
    if (zero)
      vga_printch(d + '0');
    else if (d) {
      zero = true;
      vga_printch(d + '0');
    }
  }
}

void vga_printu16(uint16_t n) {
  bool zero = false;
  for (uint16_t m = 10000; m; m /= 10) {
    uint8_t d = (n / m) % 10;
    if (zero)
      vga_printch(d + '0');
    else if (d) {
      zero = true;
      vga_printch(d + '0');
    }
  }
}

void vga_printu8(uint8_t n) {
  bool zero = false;
  for (uint8_t m = 100; m; m /= 10) {
    uint8_t d = (n / m) % 10;
    if (zero)
      vga_printch(d + '0');
    else if (d) {
      zero = true;
      vga_printch(d + '0');
    }
  }
}