diff options
Diffstat (limited to 'src/drivers/pc80/vga/vga.c')
-rw-r--r-- | src/drivers/pc80/vga/vga.c | 46 |
1 files changed, 39 insertions, 7 deletions
diff --git a/src/drivers/pc80/vga/vga.c b/src/drivers/pc80/vga/vga.c index 3471c944a1..a52ba6dc1f 100644 --- a/src/drivers/pc80/vga/vga.c +++ b/src/drivers/pc80/vga/vga.c @@ -256,19 +256,16 @@ vga_frame_set(unsigned int line, unsigned int character) vga_cr_write(0x0D, offset & 0xFF); } -/* - * simply fills a line with the given string. - */ -void -vga_line_write(unsigned int line, const char *string) +static void +vga_write_at_offset(unsigned int line, unsigned int offset, const char *string) { if (!string) return; - unsigned short *p = (unsigned short *)VGA_FB + (VGA_COLUMNS * line); + unsigned short *p = (unsigned short *)VGA_FB + (VGA_COLUMNS * line) + offset; size_t i, len = strlen(string); - for (i = 0; i < VGA_COLUMNS; i++) { + for (i = 0; i < (VGA_COLUMNS - offset); i++) { if (i < len) p[i] = 0x0F00 | string[i]; else @@ -277,6 +274,41 @@ vga_line_write(unsigned int line, const char *string) } /* + * simply fills a line with the given string. + */ +void +vga_line_write(unsigned int line, const char *string) +{ + vga_write_at_offset(line, 0, string); +} + +void +vga_write_text(enum VGA_TEXT_ALIGNMENT alignment, unsigned int line, const char *string) +{ + char str[VGA_COLUMNS * VGA_LINES] = {0}; + memcpy(str, string, strnlen(string, sizeof(str) - 1)); + + char *token = strtok(str, "\n"); + + while (token != NULL) { + size_t offset = VGA_COLUMNS - strnlen(token, VGA_COLUMNS); + switch (alignment) { + case VGA_TEXT_CENTER: + vga_write_at_offset(line++, offset/2, token); + break; + case VGA_TEXT_RIGHT: + vga_write_at_offset(line++, offset, token); + break; + case VGA_TEXT_LEFT: + default: + vga_write_at_offset(line++, 0, token); + break; + } + token = strtok(NULL, "\n"); + } +} + +/* * set up everything to get a basic 80x25 textmode. */ void |