1 /****************************************************************************
2 *
3 *                   VBE 2.0 Linear Framebuffer Profiler
4 *                    By Kendall Bennett and Brian Hook
5 *
6 * Filename:     LFBPROF.H
7 * Language:     ANSI C
8 * Environment:  Watcom C/C++ 10.0a with DOS4GW
9 *
10 * Description:  Header file for the LFBPROF.C progam.
11 *
12 ****************************************************************************/
13 
14 #ifndef __LFBPROF_H
15 #define __LFBPROF_H
16 
17 /*---------------------- Macros and type definitions ----------------------*/
18 
19 #pragma pack(1)
20 
21 /* SuperVGA information block */
22 
23 typedef struct {
24     char    VESASignature[4];       /* 'VESA' 4 byte signature          */
25     short   VESAVersion;            /* VBE version number               */
26     long    OemStringPtr;           /* Pointer to OEM string            */
27     long    Capabilities;           /* Capabilities of video card       */
28     long    VideoModePtr;           /* Pointer to supported modes       */
29     short   TotalMemory;            /* Number of 64kb memory blocks     */
30 
31     /* VBE 2.0 extensions */
32 
33     short   OemSoftwareRev;         /* OEM Software revision number     */
34     long    OemVendorNamePtr;       /* Pointer to Vendor Name string    */
35     long    OemProductNamePtr;      /* Pointer to Product Name string   */
36     long    OemProductRevPtr;       /* Pointer to Product Revision str  */
37     char    reserved[222];          /* Pad to 256 byte block size       */
38     char    OemDATA[256];           /* Scratch pad for OEM data         */
39     } VBE_vgaInfo;
40 
41 /* SuperVGA mode information block */
42 
43 typedef struct {
44     short   ModeAttributes;         /* Mode attributes                  */
45     char    WinAAttributes;         /* Window A attributes              */
46     char    WinBAttributes;         /* Window B attributes              */
47     short   WinGranularity;         /* Window granularity in k          */
48     short   WinSize;                /* Window size in k                 */
49     short   WinASegment;            /* Window A segment                 */
50     short   WinBSegment;            /* Window B segment                 */
51     long    WinFuncPtr;             /* Pointer to window function       */
52     short   BytesPerScanLine;       /* Bytes per scanline               */
53     short   XResolution;            /* Horizontal resolution            */
54     short   YResolution;            /* Vertical resolution              */
55     char    XCharSize;              /* Character cell width             */
56     char    YCharSize;              /* Character cell height            */
57     char    NumberOfPlanes;         /* Number of memory planes          */
58     char    BitsPerPixel;           /* Bits per pixel                   */
59     char    NumberOfBanks;          /* Number of CGA style banks        */
60     char    MemoryModel;            /* Memory model type                */
61     char    BankSize;               /* Size of CGA style banks          */
62     char    NumberOfImagePages;     /* Number of images pages           */
63     char    res1;                   /* Reserved                         */
64     char    RedMaskSize;            /* Size of direct color red mask    */
65     char    RedFieldPosition;       /* Bit posn of lsb of red mask      */
66     char    GreenMaskSize;          /* Size of direct color green mask  */
67     char    GreenFieldPosition;     /* Bit posn of lsb of green mask    */
68     char    BlueMaskSize;           /* Size of direct color blue mask   */
69     char    BlueFieldPosition;      /* Bit posn of lsb of blue mask     */
70     char    RsvdMaskSize;           /* Size of direct color res mask    */
71     char    RsvdFieldPosition;      /* Bit posn of lsb of res mask      */
72     char    DirectColorModeInfo;    /* Direct color mode attributes     */
73 
74     /* VBE 2.0 extensions */
75 
76     long    PhysBasePtr;            /* Physical address for linear buf  */
77     long    OffScreenMemOffset;     /* Pointer to start of offscreen mem*/
78     short   OffScreenMemSize;       /* Amount of offscreen mem in 1K's  */
79     char    res2[206];              /* Pad to 256 byte block size       */
80     } VBE_modeInfo;
81 
82 #define vbeMemPK        4           /* Packed Pixel memory model        */
83 #define vbeUseLFB       0x4000      /* Enable linear framebuffer mode   */
84 
85 /* Flags for the mode attributes returned by VBE_getModeInfo. If
86  * vbeMdNonBanked is set to 1 and vbeMdLinear is also set to 1, then only
87  * the linear framebuffer mode is available.
88  */
89 
90 #define vbeMdAvailable  0x0001      /* Video mode is available          */
91 #define vbeMdColorMode  0x0008      /* Mode is a color video mode       */
92 #define vbeMdGraphMode  0x0010      /* Mode is a graphics mode          */
93 #define vbeMdNonBanked  0x0040      /* Banked mode is not supported     */
94 #define vbeMdLinear     0x0080      /* Linear mode supported            */
95 
96 /* Structures for issuing real mode interrupts with DPMI */
97 
98 struct _RMWORDREGS {
99     unsigned short ax, bx, cx, dx, si, di, cflag;
100     };
101 
102 struct _RMBYTEREGS {
103     unsigned char   al, ah, bl, bh, cl, ch, dl, dh;
104     };
105 
106 typedef union {
107     struct  _RMWORDREGS x;
108     struct  _RMBYTEREGS h;
109     } RMREGS;
110 
111 typedef struct {
112     unsigned short  es;
113     unsigned short  cs;
114     unsigned short  ss;
115     unsigned short  ds;
116     } RMSREGS;
117 
118 /* Inline assembler block fill/move routines */
119 
120 void LfbMemset(void *p,int c,int n);
121 #pragma aux LfbMemset =             \
122 	"shr    ecx,2"                  \
123 	"xor    eax,eax"                \
124 	"mov    al,bl"                  \
125 	"shl    ebx,8"                  \
126 	"or     ax,bx"                  \
127 	"mov    ebx,eax"                \
128 	"shl    ebx,16"                 \
129 	"or     eax,ebx"                \
130 	"rep    stosd"                  \
131 	parm [edi] [ebx] [ecx];
132 
133 void LfbMemcpy(void *dst,void *src,int n);
134 #pragma aux LfbMemcpy =             \
135 	"shr    ecx,2"                  \
136 	"rep    movsd"                  \
137 	parm [edi] [esi] [ecx];
138 
139 /* Map a real mode pointer into address space */
140 
141 #define LfbMapRealPointer(p)    (void*)(((unsigned)((p)  & 0xFFFF0000) >> 12) + ((p) & 0xFFFF))
142 
143 /* Get the current timer tick count */
144 
145 #define LfbGetTicks()       *((long*)0x46C)
146 
147 #pragma pack()
148 
149 #endif  /* __LFBPROF_H */
150