diff options
Diffstat (limited to 'src/print.c')
-rw-r--r-- | src/print.c | 74 |
1 files changed, 73 insertions, 1 deletions
diff --git a/src/print.c b/src/print.c index 0a0220c..3c03577 100644 --- a/src/print.c +++ b/src/print.c @@ -1,5 +1,8 @@ #include "print.h" +#define FOREGROUND 0x0 +#define BACKGROUND 0xF + TextOutput createOutput(const int max_row, const int max_column, uint16_t* vid_mem) { // Create a new TextOutput interface TextOutput output; @@ -66,8 +69,77 @@ void putChar(uint8_t character, uint8_t background, uint8_t foreground, void print(char* string, uint8_t background, uint8_t foreground, TextOutput* textOutput) { // Print a string - for (string; *string; string++) { + while (*string) { putChar(*string, background, foreground, textOutput); + string++; } } +void PrintWithScreenFill(char* string, TextOutput* output_stream) { + // Print a string and fill the screen + print(string, BACKGROUND, FOREGROUND, output_stream); + int row = output_stream->terminal_row; + while (output_stream->terminal_row < output_stream->max_row) { + putChar('\n', BACKGROUND, FOREGROUND, output_stream); + } + output_stream->terminal_row = row; +} + + +inline void swap(char *x, char *y) { + char t = *x; *x = *y; *y = t; +} + +int abs(int value) { + return (value < 0 ? -value : value); +} + +// function to reverse buffer[i..j] +char* reverse(char *buffer, int i, int j) +{ + while (i < j) + swap(&buffer[i++], &buffer[j--]); + + return buffer; +} + +// Iterative function to implement itoa() function in C +char* itoa(int value, char* buffer, int base) +{ + if (base < 2 || base > 32) + return buffer; + int n = abs(value); + int i = 0; + while (n) + { + int r = n % base; + if (r >= 10) + buffer[i++] = 65 + (r - 10); + else + buffer[i++] = 48 + r; + n = n / base; + } + if (i == 0) + buffer[i++] = '0'; + if (value < 0 && base == 10) + buffer[i++] = '-'; + buffer[i] = '\0'; + return reverse(buffer, 0, i - 1); +} + +int haveFilledScreen = 0; + +void printToMonitor(char* string) { + if (!haveFilledScreen) { + monitor = createOutput(25, 80, (uint16_t*)(0xB8000)); + PrintWithScreenFill(string, &monitor); + haveFilledScreen = 1; + } + else + print(string, BACKGROUND, FOREGROUND, &monitor); +} + +void printIntToMonitor(int num, int base) { + char* buffer; + printToMonitor(itoa(num, buffer, base)); +} |