#include <stdarg.h> #include <stdint.h> #include <lib/textMode/stdio.h> #include <lib/ports.h> #include <lib/textMode/cursor.h> uint16_t* framebuffer = (uint16_t*) FRAMEBUFFER_LOCATION; char format = 0x0F; void putCharWithFormatAtOffset(uint16_t c, uint16_t position) { *(framebuffer + position) = c; } void putCharWithFormatAtPosition(uint8_t x, uint8_t y, uint32_t c) { putCharWithFormatAtOffset(c, (x + y * VIDEO_WIDTH)); } void putCharAtOffset(char c, uint16_t offset) { putCharWithFormatAtOffset(c | format << 8, offset); } void putCharAt(char c, uint8_t x, uint8_t y) { putCharAtOffset(c, (x + y * VIDEO_WIDTH)); } uint16_t getCharWithFormatAt(uint8_t x, uint8_t y) { return *(framebuffer + x + y * VIDEO_WIDTH); } void putCharsAt(char* string, uint8_t x, uint8_t y) { uint16_t position = 0; char c = *string; while (c != 0x00) { putCharAt(c, x + position, y); position++; c = *(string + position); } } void putChar(char c) { uint16_t offset = getCursorOffset(); putCharAtOffset(c, offset); setCursorOffset(offset + 1); } void puts(char* string) { while (*string != 0x00) { putChar(*string); string++; } } void shiftUp() { for (int y = 1; y < VIDEO_HEIGHT; y++) { for (int x = 0; x < VIDEO_WIDTH; x++) { putCharWithFormatAtPosition(x, y-1, getCharWithFormatAt(x, y)); } } for (int x = 0; x < VIDEO_WIDTH; x++) { putCharWithFormatAtPosition(x, VIDEO_HEIGHT-1, 0x00); } } void newLine() { uint16_t offset = getCursorOffset(); uint8_t x = offset % VIDEO_WIDTH; uint8_t y = offset / VIDEO_WIDTH; x = 0; y++; if (y >= VIDEO_HEIGHT) { shiftUp(); y--; } setCursorPosition(x, y); } char HEX_PREFIX[] = "0x"; char HEX_CHARS[] = "0123456789ABCDEF"; void putHex(uint32_t x) { uint8_t alreadyWriting = 0; puts(HEX_PREFIX); for (int8_t i = 7; i >= 0; i--) { uint8_t nibble = (x >> (i << 2)) & 0x0F; if (! alreadyWriting && nibble != 0x00) { alreadyWriting = 0x01; } if (! alreadyWriting) { continue; } putChar(HEX_CHARS[nibble]); } } void handleInsert(char insertType, uint32_t x) { if (insertType == 's') { puts((char*) x); } if (insertType == 'x') { putHex(x); } } void printf(const char* format, ...) { va_list valist; va_start(valist, format); for (int i = 0; format[i] != 0; i++) { if (format[i] == '\n') { newLine(); continue; } if (format[i] == '%') { handleInsert(format[++i], va_arg(valist, int)); continue; } putChar(format[i]); } va_end(valist); } void clearScreen() { setCursorOffset(0); for (int y = 0; y < VIDEO_HEIGHT; y++) { for (int x = 0; x < VIDEO_WIDTH; x++) { putCharAt(' ', x, y); } } } void setTextStyle(uint8_t style) { format = style; }