aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVolker Ruppert <info@vruppert.de>2004-02-21 18:20:32 +0000
committerVolker Ruppert <info@vruppert.de>2004-02-21 18:20:32 +0000
commit26cd5dbb39625d0dc3dfcf3b008f1572b142e8ad (patch)
tree0c3aed1e7fbcc3d7192a753e5158bb4af0db84d2
parentdab33735761f9650b0ae6d3c328d5de34750be00 (diff)
downloadvgabios-26cd5dbb39625d0dc3dfcf3b008f1572b142e8ad.tar.gz
- dynamicly genarated vbe mode_info list works now
-rw-r--r--vbe.c50
-rw-r--r--vbe.h3
-rw-r--r--vbetables.h138
3 files changed, 91 insertions, 100 deletions
diff --git a/vbe.c b/vbe.c
index 9e345ae..efedcb0 100644
--- a/vbe.c
+++ b/vbe.c
@@ -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);
diff --git a/vbe.h b/vbe.h
index 3f27a3a..4ed03c6 100644
--- a/vbe.h
+++ b/vbe.h
@@ -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,