]> granicus.if.org Git - nethack/commitdiff
More bits for linear frame buffer
authorRay Chason <ray.chason@protonmail.com>
Sat, 25 Jan 2020 19:23:04 +0000 (14:23 -0500)
committerPasi Kallinen <paxed@alt.org>
Mon, 27 Jan 2020 07:54:58 +0000 (09:54 +0200)
sys/msdos/vidvesa.c

index 9061d7ee7ae914f4a5ce2b7b062cc38b4e10c0ce..0b9c61845e44b451c51dd972082468fe5470ec98 100644 (file)
@@ -925,18 +925,21 @@ unsigned mode;
 
     if (mode == MODETEXT) {
         iflags.grmode = 0;
+        memset(&regs, 0, sizeof(regs));
         regs.x.ax = mode;
         (void) __dpmi_int(VIDEO_BIOS, &regs);
     } else if (mode >= 0x100) {
         iflags.grmode = 1;
+        memset(&regs, 0, sizeof(regs));
         regs.x.ax = 0x4F02;
-        regs.x.bx = mode & 0x81FF;
+        regs.x.bx = mode;
         (void) __dpmi_int(VIDEO_BIOS, &regs);
         /* Record that the window position is unknown */
         vesa_win_pos[0] = 0xFFFFFFFF;
         vesa_win_pos[1] = 0xFFFFFFFF;
     } else {
         iflags.grmode = 0; /* force text mode for error msg */
+        memset(&regs, 0, sizeof(regs));
         regs.x.ax = MODETEXT;
         (void) __dpmi_int(VIDEO_BIOS, &regs);
         g_attribute = attrib_text_normal;
@@ -1057,12 +1060,21 @@ vesa_detect()
     vesa_pixel_size = mode_info.BitsPerPixel;
     vesa_pixel_bytes = (vesa_pixel_size + 7) / 8;
     if (vbe_info.VbeVersion >= 0x0300) {
-        vesa_red_pos = mode_info.RedFieldPosition;
-        vesa_red_size = mode_info.RedMaskSize;
-        vesa_green_pos = mode_info.GreenFieldPosition;
-        vesa_green_size = mode_info.GreenMaskSize;
-        vesa_blue_pos = mode_info.BlueFieldPosition;
-        vesa_blue_size = mode_info.BlueMaskSize;
+        if (mode_info.ModeAttributes & 0x80) {
+            vesa_red_pos = mode_info.LinRedFieldPosition;
+            vesa_red_size = mode_info.LinRedMaskSize;
+            vesa_green_pos = mode_info.LinGreenFieldPosition;
+            vesa_green_size = mode_info.LinGreenMaskSize;
+            vesa_blue_pos = mode_info.LinBlueFieldPosition;
+            vesa_blue_size = mode_info.LinBlueMaskSize;
+        } else {
+            vesa_red_pos = mode_info.RedFieldPosition;
+            vesa_red_size = mode_info.RedMaskSize;
+            vesa_green_pos = mode_info.GreenFieldPosition;
+            vesa_green_size = mode_info.GreenMaskSize;
+            vesa_blue_pos = mode_info.BlueFieldPosition;
+            vesa_blue_size = mode_info.BlueMaskSize;
+        }
     } else {
         switch (vesa_pixel_size) {
         case 15: