:: commit b2e66e5a2d6b794da05ac2b3fcdb2d0a4d02cf6f

mintsuki <mintsuki@protonmail.com> — 2021-08-16 22:37

parents: 385af687b3

term: Misc improvements and fixes

diff --git a/stage23/drivers/vga_textmode.h b/stage23/drivers/vga_textmode.h
index e679668f..8800e9df 100644
--- a/stage23/drivers/vga_textmode.h
+++ b/stage23/drivers/vga_textmode.h
@@ -16,6 +16,7 @@ void text_get_cursor_pos(size_t *x, size_t *y);
 void text_set_text_fg(size_t fg);
 void text_set_text_bg(size_t bg);
 void text_set_text_fg_bright(size_t fg);
+void text_set_text_bg_bright(size_t bg);
 void text_set_text_fg_default(void);
 void text_set_text_bg_default(void);
 bool text_scroll_disable(void);
diff --git a/stage23/drivers/vga_textmode.s2.c b/stage23/drivers/vga_textmode.s2.c
index 75fb49ec..075a5dda 100644
--- a/stage23/drivers/vga_textmode.s2.c
+++ b/stage23/drivers/vga_textmode.s2.c
@@ -186,6 +186,10 @@ void init_vga_textmode(size_t *_rows, size_t *_cols, bool managed) {
         outb(0x3d5, 0);
         outb(0x3d4, 0x0e);
         outb(0x3d5, 0);
+
+        struct rm_regs r = {0};
+        r.eax = 0x0200;
+        rm_int(0x10, &r, &r);
     } else {
         outb(0x3d4, 0x0a);
         outb(0x3d5, 0x20);
@@ -261,6 +265,10 @@ void text_set_text_fg_bright(size_t fg) {
     text_palette = (text_palette & 0xf0) | (ansi_colours[fg] | (1 << 3));
 }
 
+void text_set_text_bg_bright(size_t bg) {
+    text_palette = (text_palette & 0x0f) | ((ansi_colours[bg] | (1 << 3)) << 4);
+}
+
 void text_set_text_fg_default(void) {
     text_palette = (text_palette & 0xf0) | 7;
 }
diff --git a/stage23/lib/term.s2.c b/stage23/lib/term.s2.c
index 974ab167..6fce9900 100644
--- a/stage23/lib/term.s2.c
+++ b/stage23/lib/term.s2.c
@@ -112,7 +112,7 @@ void term_textmode(void) {
     set_text_fg    = text_set_text_fg;
     set_text_bg    = text_set_text_bg;
     set_text_fg_bright = text_set_text_fg_bright;
-    set_text_bg_bright = text_set_text_bg;
+    set_text_bg_bright = text_set_text_bg_bright;
     set_text_fg_default = text_set_text_fg_default;
     set_text_bg_default = text_set_text_bg_default;
     scroll_disable = text_scroll_disable;
diff --git a/stage23/protos/stivale2.c b/stage23/protos/stivale2.c
index 497b6c41..9a42014f 100644
--- a/stage23/protos/stivale2.c
+++ b/stage23/protos/stivale2.c
@@ -382,14 +382,17 @@ failed_to_load_header_section:
 
     size_t req_width = 0, req_height = 0, req_bpp = 0;
 
-    if (hdrtag != NULL) {
-        req_width  = hdrtag->framebuffer_width;
-        req_height = hdrtag->framebuffer_height;
-        req_bpp    = hdrtag->framebuffer_bpp;
+    char *resolution = config_get_value(config, 0, "RESOLUTION");
+    if (resolution != NULL)
+        parse_resolution(&req_width, &req_height, &req_bpp, resolution);
 
-        char *resolution = config_get_value(config, 0, "RESOLUTION");
-        if (resolution != NULL)
-            parse_resolution(&req_width, &req_height, &req_bpp, resolution);
+    if (hdrtag != NULL) {
+        if (hdrtag->framebuffer_width)
+            req_width  = hdrtag->framebuffer_width;
+        if (hdrtag->framebuffer_height)
+            req_height = hdrtag->framebuffer_height;
+        if (hdrtag->framebuffer_bpp)
+            req_bpp    = hdrtag->framebuffer_bpp;
     }
 
     struct stivale2_header_tag_any_video *avtag = get_tag(&stivale2_hdr, STIVALE2_HEADER_TAG_ANY_VIDEO_ID);
@@ -411,7 +414,8 @@ failed_to_load_header_section:
     struct stivale2_header_tag_terminal *terminal_hdr_tag = get_tag(&stivale2_hdr, STIVALE2_HEADER_TAG_TERMINAL_ID);
 
     if (bits == 64 && terminal_hdr_tag != NULL) {
-        if (bios && ((hdrtag == NULL) || (avtag != NULL && preference == 1))) {
+        if (bios &&
+          ((avtag == NULL && hdrtag == NULL) || (avtag != NULL && preference == 1))) {
             term_textmode();
             textmode = true;
         } else {
diff --git a/test/e9print.c b/test/e9print.c
index e9a515ef..2895b1bf 100644
--- a/test/e9print.c
+++ b/test/e9print.c
@@ -8,7 +8,7 @@ static const char CONVERSION_TABLE[] = "0123456789abcdef";
 void e9_putc(char c) {
     if (stivale2_print != NULL)
         stivale2_print(&c, 1);
-    //asm volatile ("outb %0, %1" :: "a" (c), "Nd" (0xe9) : "memory");
+    asm volatile ("outb %0, %1" :: "a" (c), "Nd" (0xe9) : "memory");
 }
 
 void e9_print(const char *msg) {
diff --git a/test/limine.cfg b/test/limine.cfg
index b1b09b54..8ae4363b 100644
--- a/test/limine.cfg
+++ b/test/limine.cfg
@@ -1,6 +1,6 @@
 DEFAULT_ENTRY=1
 TIMEOUT=3
-#GRAPHICS=yes
+GRAPHICS=yes
 MENU_FONT=boot:///boot/font.bin
 VERBOSE=yes
 
diff --git a/test/stivale2.c b/test/stivale2.c
index a836ff98..c91927dd 100644
--- a/test/stivale2.c
+++ b/test/stivale2.c
@@ -4,7 +4,7 @@
 #include <stddef.h>
 
 typedef uint8_t stack[4096];
-static stack stacks[10] = {0};
+static stack stacks[64] = {0};
 void stivale2_main(struct stivale2_struct *info);
 
 struct stivale2_header_tag_terminal terminal_request = {
@@ -28,14 +28,12 @@ struct stivale2_tag unmap_null_request = {
     .next       = (uint64_t)&smp_request
 };
 
-struct stivale2_header_tag_framebuffer framebuffer_request = {
+struct stivale2_header_tag_any_video any_video_request = {
     .tag = {
-        .identifier = STIVALE2_HEADER_TAG_FRAMEBUFFER_ID,
+        .identifier = STIVALE2_HEADER_TAG_ANY_VIDEO_ID,
         .next       = (uint64_t)&unmap_null_request
     },
-    .framebuffer_width  = 0,
-    .framebuffer_height = 0,
-    .framebuffer_bpp    = 0,
+    .preference = 0
 };
 
 __attribute__((section(".stivale2hdr"), used))
@@ -43,7 +41,7 @@ struct stivale2_header header2 = {
     .entry_point = (uint64_t)stivale2_main,
     .stack       = (uintptr_t)stacks[0] + sizeof(stack),
     .flags       = (1 << 1) | (1 << 2),
-    .tags        = (uint64_t)&framebuffer_request
+    .tags        = (uint64_t)&any_video_request
 };
 
 static volatile int cpu_up = 0;
tab: 248 wrap: offon