From: Ray Chason Date: Sat, 25 Jan 2020 19:23:04 +0000 (-0500) Subject: More bits for linear frame buffer X-Git-Tag: NetHack-3.7.0_WIP~18 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=aa3303cafcf4fa5e4154ac6c6e4089f2e2a783c5;p=nethack More bits for linear frame buffer --- diff --git a/sys/msdos/vidvesa.c b/sys/msdos/vidvesa.c index 9061d7ee7..0b9c61845 100644 --- a/sys/msdos/vidvesa.c +++ b/sys/msdos/vidvesa.c @@ -925,18 +925,21 @@ unsigned mode; if (mode == MODETEXT) { iflags.grmode = 0; + memset(®s, 0, sizeof(regs)); regs.x.ax = mode; (void) __dpmi_int(VIDEO_BIOS, ®s); } else if (mode >= 0x100) { iflags.grmode = 1; + memset(®s, 0, sizeof(regs)); regs.x.ax = 0x4F02; - regs.x.bx = mode & 0x81FF; + regs.x.bx = mode; (void) __dpmi_int(VIDEO_BIOS, ®s); /* 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(®s, 0, sizeof(regs)); regs.x.ax = MODETEXT; (void) __dpmi_int(VIDEO_BIOS, ®s); 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: