winedos / Add support for VESA mode info

Jukka Heinonen jhei at iki.fi
Sun Feb 9 11:13:27 CST 2003


This patch makes Theme Hospital setup screen readable.
It also prepares some information routines for migration
from dosmem.c to winedos.




Changelog:
  Add support for VESA mode information.
  Reorganize controller and state information routines.




Index: dlls/winedos/int10.c
===================================================================
RCS file: /home/wine/wine/dlls/winedos/int10.c,v
retrieving revision 1.25
diff -u -r1.25 int10.c
--- dlls/winedos/int10.c	28 Jan 2003 00:16:01 -0000	1.25
+++ dlls/winedos/int10.c	9 Feb 2003 17:02:39 -0000
@@ -115,6 +115,255 @@
 
 
 /**********************************************************************
+ *         INT10_FillControllerInformation
+ *
+ * Fill 256-byte (VBE1.x) or 512-byte buffer (VBE2.0+) with
+ * capabilities of the video controller.
+ */
+static void INT10_FillControllerInformation( BYTE *buffer )
+{
+    /*
+     * FIXME: Move VESA info stuff here from dosmem.
+     */
+    memcpy(buffer, &BIOS_EXTRA_PTR->vesa_info, sizeof(VESAINFO));
+}
+
+
+/**********************************************************************
+ *         INT10_FillModeInformation
+ *
+ * Fill 256-byte buffer with extended information about display mode.
+ *
+ * Returns FALSE if mode is unknown and TRUE is mode is known
+ * even if it is not supported.
+ */
+static BOOL INT10_FillModeInformation( BYTE *buffer, WORD mode )
+{
+    const INT10_MODE *ptr = INT10_FindMode( mode );
+    if (!ptr)
+        return FALSE;
+
+    /*
+     * 00 - WORD: mode attributes
+     * Bits:
+     *     0 - Mode supported by present hardware configuration.
+     *     1 - Optional information available. Must be =1 for VBE v1.2+.
+     *     2 - BIOS output supported.
+     *         Int10 functions 01, 02, 06, 07, 09, 0a and 0e are supported.
+     *     3 - Set if color, clear if monochrome.
+     *     4 - Set if graphics mode, clear if text mode.
+     *     5 - Mode is not VGA-compatible if set.
+     *         VGA-compatible modes support standard VGA I/O ports.
+     *     6 - Bank-switched (or windowed) mode is not supported if set.
+     *     7 - Linear framebuffer mode supported.
+     *     8 - Double scanning supported.
+     *     9 - Interlaced operation supported.
+     *    10 - Triple buffering supported.
+     *    11 - Stereoscopic display supported.
+     *    12 - Dual display start address supported.
+     * 13-15 - Reserved.
+     */
+    {
+        WORD attr = 0x000a; /* color mode, optional info */
+
+        /*
+         * FIXME: Attribute handling is incomplete.
+         */
+
+        /* Mode supported? FIXME: correct value */
+        attr |= 0x0001;
+
+        /* Graphical mode? */
+        if (ptr->Depth) 
+            attr |= 0x0010;
+
+        /* Not VGA-compatible? */
+        if (mode > 0xff)
+            attr |= 0x0020;
+
+        *(WORD*)(buffer + 0) = attr;
+    }
+
+    /*
+     * 02 - BYTE[2]: window attributes, window A and window B
+     * Bits:
+     *   0 - Window exists.
+     *   1 - Window is readable.
+     *   2 - Window is writable.
+     * 3-7 - Reserved.
+     */
+    buffer[2] = 0x07; /* window A exists, readable and writable */
+    buffer[3] = 0x00; /* window B not supported */
+
+    /* 04 - WORD: window granularity in KB */
+    *(WORD*)(buffer + 4) = 64;
+
+    /* 06 - WORD: window size in KB */
+    *(WORD*)(buffer + 6) = 64;
+
+    /* 08 - WORD[2]: start segments, window A and window B */
+    *(WORD*)(buffer +  8) = 0xa000; /* window A segment */
+    *(WORD*)(buffer + 10) = 0x0000; /* window B not supported */
+
+    /* 12 - DWORD: window positioning function */
+    *(DWORD*)(buffer + 12) = 0; /* not supported */
+    
+    /* 16 - WORD: bytes per scan line */
+    *(WORD*)(buffer + 16) = 0; /* FIXME */
+
+    /* 18 - WORD: width in pixels (graphics) or characters (text) */
+    *(WORD*)(buffer + 18) = ptr->Width;
+
+    /* 20 - WORD: height in pixels (graphics) or characters (text) */
+    *(WORD*)(buffer + 20) = ptr->Height;
+
+    /* 22 - BYTE: width of character cell in pixels */
+    buffer[22] = 0; /* FIXME */
+
+    /* 23 - BYTE: height of character cell in pixels */
+    buffer[23] = 0; /* FIXME */
+
+    /* 24 - BYTE: number of memory planes */
+    buffer[24] = 1; /* FIXME */
+
+    /* 25 - BYTE: number of bits per pixel */
+    buffer[25] = ptr->Depth; /* FIXME: text modes? reserved bits? */
+
+    /* 26 - BYTE: number of banks */
+    buffer[26] = 1; /* FIXME */
+
+    /*
+     * 27 - BYTE: memory model type
+     * Values (hex):
+     *    00 - Text mode
+     *    01 - CGA graphics
+     *    02 - Hercules graphics
+     *    03 - Planar
+     *    04 - Packed pixel
+     *    05 - Non-chain 4, 256 color
+     *    06 - Direct color
+     *    07 - YUV
+     * 08-0F - Reserved for VESA.
+     * 10-FF - OEM memory models.
+     */
+    if (!ptr->Depth)
+        buffer[27] = 0; /* text mode */
+    else
+        buffer[27] = 3; /* FIXME */
+
+    /* 28 - BYTE: size of bank in KB */
+    buffer[28] = 0; /* FIXME */
+
+    /* 29 - BYTE: number of image pages (less one) in video RAM */
+    buffer[29] = 0; /* FIXME */
+
+    /* 30 - BYTE: reserved (0x00 for VBE 1.0-2.0, 0x01 for VBE 3.0) */
+    buffer[30] = 0x01;
+
+    /* 
+     * 31 - BYTE: red mask size 
+     * Size of red color component in bits.
+     * Used only when memory model is direct color, otherwise set to zero.
+     */
+    buffer[31] = 0; /* FIXME */
+
+    /*
+     * 32 - BYTE: red field position 
+     * Bit position of the least significant bit of red color component.
+     * Used only when memory model is direct color, otherwise set to zero.
+     */
+    buffer[32] = 0; /* FIXME */
+
+    /* 33 - BYTE: green mask size */
+    buffer[33] = 0; /* FIXME */
+
+    /* 34 - BYTE: green field position */
+    buffer[34] = 0; /* FIXME */
+
+    /* 35 - BYTE: blue mask size */
+    buffer[35] = 0; /* FIXME */
+    
+    /* 36 - BYTE: blue field position */
+    buffer[36] = 0;
+
+    /* 37 - BYTE: reserved mask size */
+    buffer[37] = 0;
+
+    /* 38 - BYTE: reserved mask position */
+    buffer[38] = 0;
+
+    /*
+     * 39 - BYTE: direct color mode info 
+     * Bits:
+     * 0 - Set if color ramp is programmable.
+     * 1 - Set if bytes in reserved field may be used by application.
+     */
+    buffer[39] = 0; /* not supported */
+
+    /* 40 - DWORD: physical address of linear video buffer */
+    *(DWORD*)(buffer + 40) = 0; /* not supported */
+
+    /* 44 - DWORD: reserved, always zero */
+    *(DWORD*)(buffer + 44) = 0;
+
+    /* 48 - WORD: reserved, always zero */
+    *(WORD*)(buffer + 48) = 0;
+
+    /* 50 - WORD: bytes per scan line in linear modes */
+    *(WORD*)(buffer + 50) = *(WORD*)(buffer + 16);
+
+    /* 52 - BYTE: number of images (less one) for banked video modes */
+    buffer[52] = 0; /* FIXME */
+
+    /* 53 - BYTE: number of images (less one) for linear video modes */
+    buffer[53] = buffer[52];
+
+    /* 54 - BYTE: red mask size (linear modes) */
+    buffer[54] = buffer[31];
+
+    /* 55 - BYTE: red field position (linear modes) */
+    buffer[55] = buffer[32];
+
+    /* 56 - BYTE: green mask size (linear modes) */
+    buffer[56] = buffer[33];
+
+    /* 57 - BYTE: green field size (linear modes) */
+    buffer[57] = buffer[34];
+
+    /* 58 - BYTE: blue mask size (linear modes) */
+    buffer[58] = buffer[35];
+
+    /* 59 - BYTE: blue field position (linear modes) */
+    buffer[59] = buffer[36];
+
+    /* 60 - BYTE: reserved mask size (linear modes) */
+    buffer[60] = buffer[37];
+
+    /* 61 - BYTE: reserved mask position (linear modes) */
+    buffer[61] = buffer[38];
+
+    /* 62 - DWORD: maximum pixel clock for graphics video mode, in Hz */
+    *(DWORD*)(buffer + 62) = 0; /* FIXME */
+
+    return TRUE;
+}
+
+
+/**********************************************************************
+ *         INT10_FillStateInformation
+ *
+ * Fill 64-byte buffer with VGA state and functionality information.
+ */
+static void INT10_FillStateInformation( BYTE *buffer, BIOSDATA *data )
+{
+    /*
+     * FIXME: Move VGA info stuff here from dosmem.
+     */
+     memcpy( buffer, &BIOS_EXTRA_PTR->vid_state, sizeof(VIDEOSTATE) );
+}
+
+
+/**********************************************************************
  *         INT10_SetVideoMode
  *
  * Change current video mode to any VGA or VESA mode.
@@ -246,18 +495,30 @@
 
     switch(AL_reg(context)) {
 
-    case 0x00: /* GET SuperVGA INFORMATION */
-        TRACE("VESA GET SuperVGA INFORMATION\n");
-        memcpy(CTX_SEG_OFF_TO_LIN(context,context->SegEs,context->Edi),
-               &BIOS_EXTRA_PTR->vesa_info, sizeof(VESAINFO));
-        SET_AL( context, 0x4f );
-        SET_AH( context, 0x00 ); /* 0x00 = successful 0x01 = failed */
+    case 0x00: /* RETURN CONTROLLER INFORMATION */
+        TRACE( "VESA RETURN CONTROLLER INFORMATION\n" );
+        {
+            BYTE *ptr = CTX_SEG_OFF_TO_LIN(context,
+                                           context->SegEs, 
+                                           context->Edi);
+            INT10_FillControllerInformation( ptr );
+            SET_AL( context, 0x4f );
+            SET_AH( context, 0x00 ); /* 0x00 = successful 0x01 = failed */
+        }
         break;
 
-    case 0x01: /* GET SuperVGA MODE INFORMATION */
-        FIXME("VESA GET SuperVGA Mode Information - Not supported\n");
-        SET_AL( context, 0x4f );
-        SET_AH( context, 0x01 ); /* 0x00 = successful 0x01 = failed */
+    case 0x01: /* RETURN MODE INFORMATION */
+        TRACE( "VESA RETURN MODE INFORMATION %04x\n", CX_reg(context) );
+        {
+            BYTE *ptr = CTX_SEG_OFF_TO_LIN(context,
+                                           context->SegEs, 
+                                           context->Edi);
+            SET_AL( context, 0x4f );
+            if (INT10_FillModeInformation( ptr, CX_reg(context) ))
+                SET_AH( context, 0x00 ); /* status: success */
+            else
+                SET_AH( context, 0x01 ); /* status: failed */
+        }
         break;
 
     case 0x02: /* SET SuperVGA VIDEO MODE */
@@ -802,12 +1063,13 @@
 
     case 0x1b: /* FUNCTIONALITY/STATE INFORMATION */
         TRACE("Get functionality/state information\n");
-        if (BX_reg(context) == 0x0)
+        if (BX_reg(context) == 0x0000)
         {
-          SET_AL( context, 0x1b );
-          /* Copy state information structure to ES:DI */
-          memcpy(CTX_SEG_OFF_TO_LIN(context,context->SegEs,context->Edi),
-                 &BIOS_EXTRA_PTR->vid_state,sizeof(VIDEOSTATE));
+            BYTE *ptr = CTX_SEG_OFF_TO_LIN(context,
+                                           context->SegEs, 
+                                           context->Edi);
+            SET_AL( context, 0x1b ); /* Function is supported */
+            INT10_FillStateInformation( ptr, data );
         }
         break;
 


-- 
Jukka Heinonen <http://www.iki.fi/jhei/>



More information about the wine-patches mailing list