]> git.dujemihanovic.xyz Git - nameless-os.git/blob - kernel/kernel/kprint.c
kernel: Huge refactoring of tty driver
[nameless-os.git] / kernel / kernel / kprint.c
1 #include <stdint.h>
2 #include <kprint.h>
3
4 void tty_initialize()
5 {
6 vga_initialize();
7 }
8
9 void kprint(const char *string, const enum vga_color fg, const enum vga_color bg)
10 {
11 char character = *string;
12 for (int i=1; character; i++) {
13 vga_print_char(character, fg, bg);
14 character = string[i];
15 }
16 }
17
18 void kprintc(const char character, const enum vga_color fg, const enum vga_color bg)
19 {
20 vga_print_char(character, fg, bg);
21 }
22
23 void kprintnibble(uint8_t nibble)
24 {
25 nibble &= 0xf;
26 if (nibble < 0xa)
27 kprintc('0' + nibble, VGA_LIGHT_GRAY, VGA_BLACK);
28 else kprintc('a' - 0xa + nibble, VGA_LIGHT_GRAY, VGA_BLACK);
29 }
30
31 void kprintb(const uint8_t byte, const int print_delm)
32 {
33 if (print_delm)
34 kprint("0x", VGA_LIGHT_GRAY, VGA_BLACK);
35
36 kprintnibble(byte >> 4);
37 kprintnibble(byte);
38 }
39
40 void kprintw(const uint16_t word, const int print_delm)
41 {
42 if (print_delm)
43 kprint("0x", VGA_LIGHT_GRAY, VGA_BLACK);
44
45 kprintb(word >> 8, 0);
46 kprintb(word, 0);
47 }
48
49 void kprintd(const uint32_t dword, const int print_delm)
50 {
51 if (print_delm)
52 kprint("0x", VGA_LIGHT_GRAY, VGA_BLACK);
53
54 kprintw(dword >> 16, 0);
55 kprintw(dword, 0);
56 }
57
58 void kprintq(const uint64_t qword, const int print_delm)
59 {
60 if (print_delm)
61 kprint("0x", VGA_LIGHT_GRAY, VGA_BLACK);
62
63 kprintd(qword >> 32, 0);
64 kprintd(qword, 0);
65 }
66
67 int kprintdec(uint32_t num, const enum vga_color fg, const enum vga_color bg)
68 {
69 char buffer[11];
70 int digits = 10;
71 /* TODO: make an actual memset function to use instead of this */
72 for (int i=0; i<11; i++) {
73 buffer[i] = 0;
74 }
75
76 /* put the numbers in the buffer */
77 for (int i=9; i>0 && num>0; i--) {
78 const uint8_t currdigit = num%10;
79 buffer[i] = currdigit+'0';
80 num /= 10;
81 }
82
83 /* shift the array as much as needed */
84 while (*buffer == '\0') {
85 digits--;
86 for (int i=0; i<9; i++) {
87 buffer[i] = buffer[i+1];
88 }
89 }
90
91 /* zero out any leftovers */
92 if (digits < 10) {
93 for (int i=digits; i<10; i++) {
94 buffer[i] = '\0';
95 }
96 }
97
98 kprint(buffer, fg, bg);
99 return digits;
100 }