summaryrefslogtreecommitdiff
path: root/src/drivers/pc80/vga/vga.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/pc80/vga/vga.c')
-rw-r--r--src/drivers/pc80/vga/vga.c46
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