aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authoraqua <aqua@iserlohn-fortress.net>2022-11-01 17:43:33 +0200
committeraqua <aqua@iserlohn-fortress.net>2022-11-01 17:43:33 +0200
commit247fb5a8476aa66fdc6d4f042b0a743fe7c3ab2b (patch)
treec719f192e3352363652a33544f4ab7167509d3c8 /lib
parentmakefile: add Makefile.config (diff)
downloadkernel-247fb5a8476aa66fdc6d4f042b0a743fe7c3ab2b.tar.xz
Add uppercase scancodes
Make text mode screen scroll
Diffstat (limited to 'lib')
-rw-r--r--lib/stdio/printf.c50
1 files changed, 33 insertions, 17 deletions
diff --git a/lib/stdio/printf.c b/lib/stdio/printf.c
index 7adf76e..25cce40 100644
--- a/lib/stdio/printf.c
+++ b/lib/stdio/printf.c
@@ -3,6 +3,7 @@
#include <string.h>
#include <devices/uart_16550.h>
+#include <devices/vga.h>
static char buffer[3 * sizeof(int) + 2];
@@ -18,26 +19,37 @@ printf(const char *restrict format, ...)
for (int i = 0; format[i] != '\0'; ++i) {
if (format[i] == '%') {
written += uart_puts(COM1, &format[s], l);
+ vga_puts(&format[s], l);
s = i + 2;
++i;
switch (format[i]) {
- case 's':
- written += uart_puts(COM1, va_arg(params, const char *), -1);
- break;
- case 'c':
- written++;
- uart_write(COM1, va_arg(params, int));
- break;
- case 'd':
- written += uart_puts(COM1, itoa(buffer, va_arg(params, int), 10), -1);
- break;
- case 'u':
- written += uart_puts(COM1, utoa(buffer, va_arg(params, unsigned int), 10), -1);
- break;
- case 'x':
- written += uart_puts(COM1, utoa(buffer, va_arg(params, unsigned int), 16), -1);
- break;
+ case 's': {
+ const char *arg = va_arg(params, const char *);
+ written += uart_puts(COM1, arg, -1);
+ vga_puts(arg, -1);
+ } break;
+ case 'c': {
+ const int arg = va_arg(params, int);
+ uart_write(COM1, arg);
+ vga_putc(arg);
+ ++written;
+ } break;
+ case 'd': {
+ const char *arg = itoa(buffer, va_arg(params, int), 10);
+ written += uart_puts(COM1, arg, -1);
+ vga_puts(arg, -1);
+ } break;
+ case 'u': {
+ const char *arg = utoa(buffer, va_arg(params, unsigned int), 10);
+ written += uart_puts(COM1, arg, -1);
+ vga_puts(arg, -1);
+ } break;
+ case 'x': {
+ const char *arg = utoa(buffer, va_arg(params, unsigned int), 16);
+ written += uart_puts(COM1, arg, -1);
+ vga_puts(arg, -1);
+ } break;
}
l = 0;
@@ -47,8 +59,12 @@ printf(const char *restrict format, ...)
++l;
}
- if (l > 0) written += uart_puts(COM1, &format[s], l);
+ if (l > 0) {
+ written += uart_puts(COM1, &format[s], l);
+ vga_puts(&format[s], l);
+ }
va_end(params);
+ // vga_update_cursor();
return written;
}