implement platform-agnostic printf

This commit is contained in:
Quinten Kock 2020-12-04 03:07:27 +01:00
parent 5a9175f722
commit 00ad163cc3
5 changed files with 90 additions and 17 deletions

View File

@ -11,6 +11,10 @@ static volatile size_t terminal_column;
static volatile uint8_t current_color = VGA_WHITE;
static uint16_t *terminal_buffer = (uint16_t*)0xb8000;
void putchar(char c) {
vga_putc(c);
}
void vga_putc(char c) {
size_t index = terminal_row*VGA_WIDTH + terminal_column;
if(c == '\t') {
@ -30,14 +34,6 @@ void vga_putc(char c) {
}
}
void vga_puts(const char *c) {
char cur = *(c++);
while(cur != '\0') {
vga_putc(cur);
cur = *(c++);
}
}
void vga_setcolor(uint8_t new_color) {
current_color = new_color;
}
@ -47,7 +43,7 @@ void vga_write_elsewhere(const char *c, size_t y, size_t x) {
size_t old_column = terminal_column;
terminal_row = y;
terminal_column = x;
vga_puts(c);
puts(c);
terminal_row=old_row;
terminal_column=old_column;
}

1
kernel/src/hal/print.h Normal file
View File

@ -0,0 +1 @@
void putchar(char);

View File

@ -2,14 +2,8 @@
#include "hal/ops.h"
void kmain(int argc, char **argv) {
vga_puts("Kernel initialized! Platform: ");
vga_puts(arch);
vga_putc('\n');
vga_puts("Bootloader information:\t");
for(int i = 0; i < argc; i++) {
vga_puts(argv[i]);
vga_putc('\t');
}
printf("Kernel initialized! Platform: %s\n", arch);
printf("Bootloader type: %s (%s %s)\n", argv[0], argv[1], argv[2]);
vga_setcolor(VGA_DARK_GRAY);
vga_write_elsewhere("(c) Quinten Kock 2020 (MIT License)", 24, 0);

77
kernel/src/print/print.c Normal file
View File

@ -0,0 +1,77 @@
#include <stddef.h>
#include <stdarg.h>
#include "print.h"
void puts(const char* c) {
for(size_t i = 0; c[i]; i++)
putchar(c[i]);
}
void print(const char* c) {
puts(c);
putchar('\n');;
}
static const char CONVERSION_TABLE[] = "0123456789abcdef";
static void printhex(size_t num) {
int i;
char buf[17];
if (!num) {
puts("0x0");
return;
}
buf[16] = 0;
for (i = 15; num; i--) {
buf[i] = CONVERSION_TABLE[num % 16];
num /= 16;
}
i++;
puts("0x");
puts(&buf[i]);
}
static void printdec(size_t num) {
int i;
char buf[21] = {0};
if (!num) {
putchar('0');
return;
}
for (i = 19; num; i--) {
buf[i] = (num % 10) + 0x30;
num = num / 10;
}
i++;
puts(buf + i);
}
void printf(const char *format, ...) {
va_list argp;
va_start(argp, format);
while (*format != '\0') {
if (*format == '%') {
format++;
if (*format == 'x') {
printhex(va_arg(argp, size_t));
} else if (*format == 'd') {
printdec(va_arg(argp, size_t));
} else if (*format == 's') {
puts(va_arg(argp, char*));
}
} else {
putchar(*format);
}
format++;
}
va_end(argp);
}

5
kernel/src/print/print.h Normal file
View File

@ -0,0 +1,5 @@
#include "../hal/print.h"
void puts(const char*);
void print(const char*);
void printf(const char *format, ...);