summaryrefslogtreecommitdiff
path: root/src/print.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/print.c')
-rw-r--r--src/print.c74
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));
+}