diff options
author | Volker Ruppert <info@vruppert.de> | 2004-02-21 18:20:32 +0000 |
---|---|---|
committer | Volker Ruppert <info@vruppert.de> | 2004-02-21 18:20:32 +0000 |
commit | 26cd5dbb39625d0dc3dfcf3b008f1572b142e8ad (patch) | |
tree | 0c3aed1e7fbcc3d7192a753e5158bb4af0db84d2 | |
parent | dab33735761f9650b0ae6d3c328d5de34750be00 (diff) | |
download | vgabios-26cd5dbb39625d0dc3dfcf3b008f1572b142e8ad.tar.gz |
- dynamicly genarated vbe mode_info list works now
-rw-r--r-- | vbe.c | 50 | ||||
-rw-r--r-- | vbe.h | 3 | ||||
-rw-r--r-- | vbetables.h | 138 |
3 files changed, 91 insertions, 100 deletions
@@ -37,7 +37,7 @@ //#define VBE2_NO_VESA_CHECK // dynamicly generate a mode_info list -//#define DYN_LIST +#define DYN_LIST #include "vbe.h" @@ -392,10 +392,8 @@ Bit16u *AX;Bit16u ES;Bit16u DI; Bit16u status; Bit16u result; Bit16u vbe2_info; -#ifdef DYN_LIST - Bit16u *video_mode_list; -#endif Bit16u cur_mode=0; + Bit16u cur_ptr=34; ModeInfoListItem *cur_info=&mode_info_list; status = read_word(ss, AX); @@ -448,36 +446,13 @@ Bit16u *AX;Bit16u ES;Bit16u DI; vbe_info_block.Capabilities[3] = 0; #ifdef DYN_LIST - // FIXME: This doesn't work correctly somehow? // VBE Video Mode Pointer (dynamicly generated from the mode_info_list) - vbe_info_block.VideoModePtr_Seg= ES ;//0xc000; - vbe_info_block.VideoModePtr_Off= DI + 34;//&(VBEInfoData->Reserved);//&vbebios_mode_list; + vbe_info_block.VideoModePtr_Seg= ES ; + vbe_info_block.VideoModePtr_Off= DI + 34; #else // VBE Video Mode Pointer (staticly in rom) vbe_info_block.VideoModePtr_Seg = 0xc000; vbe_info_block.VideoModePtr_Off = &vbebios_mode_list; - -#endif - -#ifdef DYN_LIST - -// video_mode_list=(Bit16u*)&(vbe_info_block.Reserved); - - do - { -#ifdef DEBUG - printf("VBE found mode %x => %x\n", cur_info->mode,cur_mode); -#endif -// *video_mode_list=cur_info->mode; - vbe_info_block.Reserved[cur_mode] = cur_info->mode; - - cur_info++; - //video_mode_list++; - cur_mode++; - } while (cur_info->mode != VBE_VESA_MODE_END_OF_LIST); - - // Add vesa mode list terminator - vbe_info_block.Reserved[cur_mode] = VBE_VESA_MODE_END_OF_LIST; #endif // VBE Total Memory (in 64b blocks) @@ -503,6 +478,23 @@ Bit16u *AX;Bit16u ES;Bit16u DI; memcpyb(ES, DI, ss, &vbe_info_block, 256); } +#ifdef DYN_LIST + do + { +#ifdef DEBUG + printf("VBE found mode %x => %x\n", cur_info->mode,cur_mode); +#endif + write_word(ES, DI + cur_ptr, cur_info->mode); + + cur_info++; + cur_mode++; + cur_ptr+=2; + } while (cur_info->mode != VBE_VESA_MODE_END_OF_LIST); + + // Add vesa mode list terminator + write_word(ES, DI + cur_ptr, cur_info->mode); +#endif + result = 0x4f; write_word(ss, AX, result); @@ -43,8 +43,7 @@ typedef struct VbeInfoBlock Bit16u OemProductNamePtr_Seg; Bit16u OemProductRevPtr_Off; Bit16u OemProductRevPtr_Seg; - //Bit8u Reserved[222]; - Bit16u Reserved[111];// FIXME use this to put a dynamicly generated mode list in + Bit16u Reserved[111]; // used for dynamicly generated mode list Bit8u OemData[256]; } VbeInfoBlock; diff --git a/vbetables.h b/vbetables.h index b7ed7f9..c9a1a79 100644 --- a/vbetables.h +++ b/vbetables.h @@ -19,75 +19,6 @@ typedef struct ModeInfoListItem static ModeInfoListItem mode_info_list[]= { { - VBE_OWN_MODE_320X200X8, - { -/*typedef struct ModeInfoBlock -{*/ -// Mandatory information for all VBE revisions - /*Bit16u ModeAttributes*/ VBE_MODE_ATTRIBUTE_SUPPORTED | - VBE_MODE_ATTRIBUTE_EXTENDED_INFORMATION_AVAILABLE | - VBE_MODE_ATTRIBUTE_COLOR_MODE | -#ifdef VBE_HAVE_LFB - VBE_MODE_ATTRIBUTE_LINEAR_FRAME_BUFFER_MODE | -#endif - VBE_MODE_ATTRIBUTE_GRAPHICS_MODE, - /*Bit8u WinAAttributes*/ VBE_WINDOW_ATTRIBUTE_READABLE | - VBE_WINDOW_ATTRIBUTE_WRITEABLE, - /*Bit8u WinBAttributes*/ 0, - /*Bit16u WinGranularity*/ VBE_DISPI_BANK_SIZE_KB, - /*Bit16u WinSize*/ VBE_DISPI_BANK_SIZE_KB, - /*Bit16u WinASegment*/ VGAMEM_GRAPH, - /*Bit16u WinBSegment*/ 0, - /*Bit32u WinFuncPtr*/ 0, - /*Bit16u BytesPerScanLine*/ 320, -// Mandatory information for VBE 1.2 and above - /*Bit16u XResolution*/ 320, - /*Bit16u YResolution*/ 200, - /*Bit8u XCharSize*/ 8, - /*Bit8u YCharSize*/ 16, - /*Bit8u NumberOfPlanes*/ 1, - /*Bit8u BitsPerPixel*/ 8, - /*Bit8u NumberOfBanks*/ 1, - /*Bit8u MemoryModel*/ VBE_MEMORYMODEL_PACKED_PIXEL, - /*Bit8u BankSize*/ 0, - /*Bit8u NumberOfImagePages*/ 3, - /*Bit8u Reserved_page*/ 0, -// Direct Color fields (required for direct/6 and YUV/7 memory models) - /*Bit8u RedMaskSize*/ 0, - /*Bit8u RedFieldPosition*/ 0, - /*Bit8u GreenMaskSize*/ 0, - /*Bit8u GreenFieldPosition*/ 0, - /*Bit8u BlueMaskSize*/ 0, - /*Bit8u BlueFieldPosition*/ 0, - /*Bit8u RsvdMaskSize*/ 0, - /*Bit8u RsvdFieldPosition*/ 0, - /*Bit8u DirectColorModeInfo*/ 0, -// Mandatory information for VBE 2.0 and above -#ifdef VBE_HAVE_LFB - /*Bit32u PhysBasePtr*/ VBE_DISPI_LFB_PHYSICAL_ADDRESS, -#else - /*Bit32u PhysBasePtr*/ 0, -#endif - /*Bit32u OffScreenMemOffset*/ 0, - /*Bit16u OffScreenMemSize*/ 0, -// Mandatory information for VBE 3.0 and above - /*Bit16u LinBytesPerScanLine*/ 320, - /*Bit8u BnkNumberOfPages*/ 0, - /*Bit8u LinNumberOfPages*/ 0, - /*Bit8u LinRedMaskSize*/ 0, - /*Bit8u LinRedFieldPosition*/ 0, - /*Bit8u LinGreenMaskSize*/ 0, - /*Bit8u LinGreenFieldPosition*/ 0, - /*Bit8u LinBlueMaskSize*/ 0, - /*Bit8u LinBlueFieldPosition*/ 0, - /*Bit8u LinRsvdMaskSize*/ 0, - /*Bit8u LinRsvdFieldPosition*/ 0, - /*Bit32u MaxPixelClock*/ 0, -/*} ModeInfoBlock;*/ - } - }, - - { VBE_VESA_MODE_640X400X8, { /*typedef struct ModeInfoBlock @@ -1270,6 +1201,75 @@ static ModeInfoListItem mode_info_list[]= } }, + { + VBE_OWN_MODE_320X200X8, + { +/*typedef struct ModeInfoBlock +{*/ +// Mandatory information for all VBE revisions + /*Bit16u ModeAttributes*/ VBE_MODE_ATTRIBUTE_SUPPORTED | + VBE_MODE_ATTRIBUTE_EXTENDED_INFORMATION_AVAILABLE | + VBE_MODE_ATTRIBUTE_COLOR_MODE | +#ifdef VBE_HAVE_LFB + VBE_MODE_ATTRIBUTE_LINEAR_FRAME_BUFFER_MODE | +#endif + VBE_MODE_ATTRIBUTE_GRAPHICS_MODE, + /*Bit8u WinAAttributes*/ VBE_WINDOW_ATTRIBUTE_READABLE | + VBE_WINDOW_ATTRIBUTE_WRITEABLE, + /*Bit8u WinBAttributes*/ 0, + /*Bit16u WinGranularity*/ VBE_DISPI_BANK_SIZE_KB, + /*Bit16u WinSize*/ VBE_DISPI_BANK_SIZE_KB, + /*Bit16u WinASegment*/ VGAMEM_GRAPH, + /*Bit16u WinBSegment*/ 0, + /*Bit32u WinFuncPtr*/ 0, + /*Bit16u BytesPerScanLine*/ 320, +// Mandatory information for VBE 1.2 and above + /*Bit16u XResolution*/ 320, + /*Bit16u YResolution*/ 200, + /*Bit8u XCharSize*/ 8, + /*Bit8u YCharSize*/ 16, + /*Bit8u NumberOfPlanes*/ 1, + /*Bit8u BitsPerPixel*/ 8, + /*Bit8u NumberOfBanks*/ 1, + /*Bit8u MemoryModel*/ VBE_MEMORYMODEL_PACKED_PIXEL, + /*Bit8u BankSize*/ 0, + /*Bit8u NumberOfImagePages*/ 3, + /*Bit8u Reserved_page*/ 0, +// Direct Color fields (required for direct/6 and YUV/7 memory models) + /*Bit8u RedMaskSize*/ 0, + /*Bit8u RedFieldPosition*/ 0, + /*Bit8u GreenMaskSize*/ 0, + /*Bit8u GreenFieldPosition*/ 0, + /*Bit8u BlueMaskSize*/ 0, + /*Bit8u BlueFieldPosition*/ 0, + /*Bit8u RsvdMaskSize*/ 0, + /*Bit8u RsvdFieldPosition*/ 0, + /*Bit8u DirectColorModeInfo*/ 0, +// Mandatory information for VBE 2.0 and above +#ifdef VBE_HAVE_LFB + /*Bit32u PhysBasePtr*/ VBE_DISPI_LFB_PHYSICAL_ADDRESS, +#else + /*Bit32u PhysBasePtr*/ 0, +#endif + /*Bit32u OffScreenMemOffset*/ 0, + /*Bit16u OffScreenMemSize*/ 0, +// Mandatory information for VBE 3.0 and above + /*Bit16u LinBytesPerScanLine*/ 320, + /*Bit8u BnkNumberOfPages*/ 0, + /*Bit8u LinNumberOfPages*/ 0, + /*Bit8u LinRedMaskSize*/ 0, + /*Bit8u LinRedFieldPosition*/ 0, + /*Bit8u LinGreenMaskSize*/ 0, + /*Bit8u LinGreenFieldPosition*/ 0, + /*Bit8u LinBlueMaskSize*/ 0, + /*Bit8u LinBlueFieldPosition*/ 0, + /*Bit8u LinRsvdMaskSize*/ 0, + /*Bit8u LinRsvdFieldPosition*/ 0, + /*Bit32u MaxPixelClock*/ 0, +/*} ModeInfoBlock;*/ + } + }, + /** END OF THE LIST **/ { VBE_VESA_MODE_END_OF_LIST, |