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;
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: