Home | History | Annotate | Download | only in vgabios
      1 /* Generate the VGABIOS VBE Tables */
      2 #include <stdlib.h>
      3 #include <stdio.h>
      4 
      5 #define VBE_DISPI_TOTAL_VIDEO_MEMORY_MB 16
      6 
      7 typedef struct {
      8     int width;
      9     int height;
     10     int depth;
     11     int mode;
     12 } ModeInfo;
     13 
     14 ModeInfo modes[] = {
     15     /* standard VESA modes */
     16 { 640, 400, 8                          , 0x100},
     17 { 640, 480, 8                          , 0x101},
     18 { 800, 600, 4                          , 0x102},
     19 { 800, 600, 8                          , 0x103},
     20 { 1024, 768, 4                         , 0x104},
     21 { 1024, 768, 8                         , 0x105},
     22 { 1280, 1024, 4                        , 0x106},
     23 { 1280, 1024, 8                        , 0x107},
     24 { 320, 200, 15                       , 0x10D},
     25 { 320, 200, 16                        , 0x10E},
     26 { 320, 200, 24                        , 0x10F},
     27 { 640, 480, 15                       , 0x110},
     28 { 640, 480, 16                        , 0x111},
     29 { 640, 480, 24                        , 0x112},
     30 { 800, 600, 15                       , 0x113},
     31 { 800, 600, 16                        , 0x114},
     32 { 800, 600, 24                        , 0x115},
     33 { 1024, 768, 15                      , 0x116},
     34 { 1024, 768, 16                       , 0x117},
     35 { 1024, 768, 24                       , 0x118},
     36 { 1280, 1024, 15                     , 0x119},
     37 { 1280, 1024, 16                      , 0x11A},
     38 { 1280, 1024, 24                      , 0x11B},
     39 { 1600, 1200, 8                        , 0x11C},
     40 { 1600, 1200, 15                     , 0x11D},
     41 { 1600, 1200, 16                      , 0x11E},
     42 { 1600, 1200, 24                      , 0x11F},
     43 
     44       /* BOCHS/PLEX86 'own' mode numbers */
     45 { 320, 200, 32                       , 0x140},
     46 { 640, 400, 32                       , 0x141},
     47 { 640, 480, 32                       , 0x142},
     48 { 800, 600, 32                       , 0x143},
     49 { 1024, 768, 32                      , 0x144},
     50 { 1280, 1024, 32                     , 0x145},
     51 { 320, 200, 8                        , 0x146},
     52 { 1600, 1200, 32                     , 0x147},
     53 { 1152, 864, 8                       , 0x148},
     54 { 1152, 864, 15                      , 0x149},
     55 { 1152, 864, 16                      , 0x14a},
     56 { 1152, 864, 24                      , 0x14b},
     57 { 1152, 864, 32                      , 0x14c},
     58 { 1280, 768, 16                      , 0x175},
     59 { 1280, 768, 24                      , 0x176},
     60 { 1280, 768, 32                      , 0x177},
     61 { 1280, 800, 16                      , 0x178},
     62 { 1280, 800, 24                      , 0x179},
     63 { 1280, 800, 32                      , 0x17a},
     64 { 1280, 960, 16                      , 0x17b},
     65 { 1280, 960, 24                      , 0x17c},
     66 { 1280, 960, 32                      , 0x17d},
     67 { 1440, 900, 16                      , 0x17e},
     68 { 1440, 900, 24                      , 0x17f},
     69 { 1440, 900, 32                      , 0x180},
     70 { 1400, 1050, 16                     , 0x181},
     71 { 1400, 1050, 24                     , 0x182},
     72 { 1400, 1050, 32                     , 0x183},
     73 { 1680, 1050, 16                     , 0x184},
     74 { 1680, 1050, 24                     , 0x185},
     75 { 1680, 1050, 32                     , 0x186},
     76 { 1920, 1200, 16                     , 0x187},
     77 { 1920, 1200, 24                     , 0x188},
     78 { 1920, 1200, 32                     , 0x189},
     79 { 2560, 1600, 16                     , 0x18a},
     80 { 2560, 1600, 24                     , 0x18b},
     81 { 2560, 1600, 32                     , 0x18c},
     82 { 1280, 720, 16                      , 0x18d},
     83 { 1280, 720, 24                      , 0x18e},
     84 { 1280, 720, 32                      , 0x18f},
     85 { 1920, 1080, 16                     , 0x190},
     86 { 1920, 1080, 24                     , 0x191},
     87 { 1920, 1080, 32                     , 0x192},
     88 { 0, },
     89 };
     90 
     91 int main(int argc, char **argv)
     92 {
     93   const ModeInfo *pm;
     94   int pages, pitch;
     95   int r_size, r_pos, g_size, g_pos, b_size, b_pos, a_size, a_pos;
     96   const char *str;
     97   long vram_size = VBE_DISPI_TOTAL_VIDEO_MEMORY_MB * 1024 * 1024;
     98 
     99   printf("/* THIS FILE IS AUTOMATICALLY GENERATED - DO NOT EDIT */\n\n");
    100   printf("#define VBE_DISPI_TOTAL_VIDEO_MEMORY_MB %d\n\n", VBE_DISPI_TOTAL_VIDEO_MEMORY_MB);
    101   printf("static ModeInfoListItem mode_info_list[]=\n");
    102   printf("{\n");
    103   for (pm = modes; pm->mode != 0; pm++) {
    104     if (pm->depth == 4)
    105       pitch = (pm->width + 7) / 8;
    106     else
    107       pitch = pm->width * ((pm->depth + 7) / 8);
    108     pages = vram_size / (pm->height * pitch);
    109     if (pages > 0) {
    110       printf("{ 0x%04x, /* %dx%dx%d */\n",
    111              pm->mode, pm->width, pm->height, pm->depth);
    112       if (pm->depth == 4)
    113         printf("{ /*Bit16u ModeAttributes*/ %s,\n",
    114                "VBE_MODE_ATTRIBUTE_SUPPORTED | "
    115                "VBE_MODE_ATTRIBUTE_EXTENDED_INFORMATION_AVAILABLE | "
    116                "VBE_MODE_ATTRIBUTE_COLOR_MODE | "
    117                "VBE_MODE_ATTRIBUTE_TTY_BIOS_SUPPORT | "
    118                "VBE_MODE_ATTRIBUTE_GRAPHICS_MODE");
    119       else
    120         printf("{ /*Bit16u ModeAttributes*/ %s,\n",
    121                "VBE_MODE_ATTRIBUTE_SUPPORTED | "
    122                "VBE_MODE_ATTRIBUTE_EXTENDED_INFORMATION_AVAILABLE | "
    123                "VBE_MODE_ATTRIBUTE_COLOR_MODE | "
    124                "VBE_MODE_ATTRIBUTE_LINEAR_FRAME_BUFFER_MODE | "
    125                "VBE_MODE_ATTRIBUTE_GRAPHICS_MODE");
    126       printf("/*Bit8u  WinAAttributes*/ %s,\n",
    127              "VBE_WINDOW_ATTRIBUTE_RELOCATABLE | "
    128              "VBE_WINDOW_ATTRIBUTE_READABLE | "
    129              "VBE_WINDOW_ATTRIBUTE_WRITEABLE");
    130 
    131       printf("/*Bit8u  WinBAttributes*/ %d,\n", 0);
    132 
    133       printf("/*Bit16u WinGranularity*/ %s,\n", "VBE_DISPI_BANK_SIZE_KB");
    134 
    135       printf("/*Bit16u WinSize*/ %s,\n", "VBE_DISPI_BANK_SIZE_KB");
    136 
    137       printf("/*Bit16u WinASegment*/ %s,\n", "VGAMEM_GRAPH");
    138 
    139       printf("/*Bit16u WinBSegment*/ 0x%04x,\n", 0);
    140 
    141       printf("/*Bit32u WinFuncPtr*/ %d,\n", 0);
    142 
    143       printf("/*Bit16u BytesPerScanLine*/ %d,\n", pitch);
    144 
    145       // Mandatory information for VBE 1.2 and above
    146       printf("/*Bit16u XResolution*/ %d,\n", pm->width);
    147       printf("/*Bit16u YResolution*/ %d,\n", pm->height);
    148       printf("/*Bit8u  XCharSize*/ %d,\n", 8);
    149       printf("/*Bit8u  YCharSize*/ %d,\n", 16);
    150       if (pm->depth == 4) {
    151         printf("/*Bit8u  NumberOfPlanes*/ %d,\n", 4);
    152       } else {
    153         printf("/*Bit8u  NumberOfPlanes*/ %d,\n", 1);
    154       }
    155       printf("/*Bit8u  BitsPerPixel*/ %d,\n", pm->depth);
    156       printf("/*Bit8u  NumberOfBanks*/ %d,\n",
    157              (pm->height * pitch + 65535) / 65536);
    158 
    159       if (pm->depth == 4)
    160         str = "VBE_MEMORYMODEL_PLANAR";
    161       else if (pm->depth == 8)
    162         str = "VBE_MEMORYMODEL_PACKED_PIXEL";
    163       else
    164         str = "VBE_MEMORYMODEL_DIRECT_COLOR";
    165       printf("/*Bit8u  MemoryModel*/ %s,\n", str);
    166       printf("/*Bit8u  BankSize*/ %d,\n", 0);
    167       if (pm->depth == 4)
    168         printf("/*Bit8u  NumberOfImagePages*/ %d,\n", (pages / 4) - 1);
    169       else
    170         printf("/*Bit8u  NumberOfImagePages*/ %d,\n", pages - 1);
    171       printf("/*Bit8u  Reserved_page*/ %d,\n", 0);
    172 
    173       // Direct Color fields (required for direct/6 and YUV/7 memory models)
    174       switch(pm->depth) {
    175         case 15:
    176           r_size = 5;
    177           r_pos = 10;
    178           g_size = 5;
    179           g_pos = 5;
    180           b_size = 5;
    181           b_pos = 0;
    182           a_size = 1;
    183           a_pos = 15;
    184           break;
    185         case 16:
    186           r_size = 5;
    187           r_pos = 11;
    188           g_size = 6;
    189           g_pos = 5;
    190           b_size = 5;
    191           b_pos = 0;
    192           a_size = 0;
    193           a_pos = 0;
    194           break;
    195         case 24:
    196           r_size = 8;
    197           r_pos = 16;
    198           g_size = 8;
    199           g_pos = 8;
    200           b_size = 8;
    201           b_pos = 0;
    202           a_size = 0;
    203           a_pos = 0;
    204           break;
    205         case 32:
    206           r_size = 8;
    207           r_pos = 16;
    208           g_size = 8;
    209           g_pos = 8;
    210           b_size = 8;
    211           b_pos = 0;
    212           a_size = 8;
    213           a_pos = 24;
    214           break;
    215         default:
    216           r_size = 0;
    217           r_pos = 0;
    218           g_size = 0;
    219           g_pos = 0;
    220           b_size = 0;
    221           b_pos = 0;
    222           a_size = 0;
    223           a_pos = 0;
    224           break;
    225       }
    226 
    227       printf("/*Bit8u  RedMaskSize*/ %d,\n", r_size);
    228       printf("/*Bit8u  RedFieldPosition*/ %d,\n", r_pos);
    229       printf("/*Bit8u  GreenMaskSize*/ %d,\n", g_size);
    230       printf("/*Bit8u  GreenFieldPosition*/ %d,\n", g_pos);
    231       printf("/*Bit8u  BlueMaskSize*/ %d,\n", b_size);
    232       printf("/*Bit8u  BlueFieldPosition*/ %d,\n", b_pos);
    233       printf("/*Bit8u  RsvdMaskSize*/ %d,\n", a_size);
    234       printf("/*Bit8u  RsvdFieldPosition*/ %d,\n", a_pos);
    235       if (pm->depth == 32)
    236         printf("/*Bit8u  DirectColorModeInfo*/ %s,\n",
    237                "VBE_DIRECTCOLOR_RESERVED_BITS_AVAILABLE");
    238       else
    239         printf("/*Bit8u  DirectColorModeInfo*/ %s,\n", "0");
    240 
    241 // Mandatory information for VBE 2.0 and above
    242       if (pm->depth > 4)
    243         printf("/*Bit32u PhysBasePtr*/ %s,\n",
    244                "VBE_DISPI_LFB_PHYSICAL_ADDRESS");
    245       else
    246         printf("/*Bit32u PhysBasePtr*/ %s,\n", "0");
    247       printf("/*Bit32u OffScreenMemOffset*/ %d,\n", 0);
    248       printf("/*Bit16u OffScreenMemSize*/ %d,\n", 0);
    249       // Mandatory information for VBE 3.0 and above
    250       printf("/*Bit16u LinBytesPerScanLine*/ %d,\n", pitch);
    251       printf("/*Bit8u  BnkNumberOfPages*/ %d,\n", 0);
    252       printf("/*Bit8u  LinNumberOfPages*/ %d,\n", 0);
    253       printf("/*Bit8u  LinRedMaskSize*/ %d,\n", r_size);
    254       printf("/*Bit8u  LinRedFieldPosition*/ %d,\n", r_pos);
    255       printf("/*Bit8u  LinGreenMaskSize*/ %d,\n", g_size);
    256       printf("/*Bit8u  LinGreenFieldPosition*/ %d,\n", g_pos);
    257       printf("/*Bit8u  LinBlueMaskSize*/ %d,\n", b_size);
    258       printf("/*Bit8u  LinBlueFieldPosition*/ %d,\n", b_pos);
    259       printf("/*Bit8u  LinRsvdMaskSize*/ %d,\n", a_size);
    260       printf("/*Bit8u  LinRsvdFieldPosition*/ %d,\n", a_pos);
    261       printf("/*Bit32u MaxPixelClock*/ %d,\n", 0);
    262       printf("} },\n");
    263     }
    264   }
    265   printf("{ VBE_VESA_MODE_END_OF_LIST,\n");
    266   printf("{ 0,\n");
    267   printf("} },\n");
    268   printf("};\n");
    269   return 0;
    270 }
    271