From 247fb5a8476aa66fdc6d4f042b0a743fe7c3ab2b Mon Sep 17 00:00:00 2001 From: aqua Date: Tue, 1 Nov 2022 17:43:33 +0200 Subject: Add uppercase scancodes Make text mode screen scroll --- lib/stdio/printf.c | 50 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 17 deletions(-) (limited to 'lib') 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 #include +#include 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; } -- cgit v1.2.1