aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVolker Ruppert <info@vruppert.de>2003-06-30 19:27:05 +0000
committerVolker Ruppert <info@vruppert.de>2003-06-30 19:27:05 +0000
commit125eba8089e5780bc15ad269da0accd03a71e17e (patch)
treeb2bee43ea51b8e6e66c12fc7bf00ea53c0860ab5
parenta499d6506c3800b0f1193d621b7b15afadd0343a (diff)
downloadvgabios-125eba8089e5780bc15ad269da0accd03a71e17e.tar.gz
- VBE mode info blocks of modes with >8bpp enabled
- VBE modes with 24 bpp: bytes per scanline fixed - vbe_biosfn_set_mode() now supports >8bpp - VBE will be enabled with new VBE_DISPI_ID2 (0xB0C2)
-rw-r--r--vbe.c61
-rw-r--r--vbe.h7
-rw-r--r--vbetables.h32
3 files changed, 37 insertions, 63 deletions
diff --git a/vbe.c b/vbe.c
index 4ba5ebf..71c171b 100644
--- a/vbe.c
+++ b/vbe.c
@@ -39,9 +39,6 @@
// dynamicly generate a mode_info list
//#define DYN_LIST
-// enable unsupported modi in the mode_info list (ie >8bpp)
-//#define LIST_UNSUPPORTED_MODI
-
#include "vbe.h"
#include "vbetables.h"
@@ -100,20 +97,17 @@ _no_vbebios_info_string:
// at least until dynamic list creation is working
_vbebios_mode_list:
-#ifdef LIST_UNSUPPORTED_MODI
-.word VBE_VESA_MODE_640X480X565
-.word VBE_VESA_MODE_800X600X565
-.word VBE_VESA_MODE_640X480X888
-.word VBE_VESA_MODE_800X600X888
-.word VBE_OWN_MODE_800X600X8888
-.word VBE_OWN_MODE_1024X768X8888
-#endif
-
.word VBE_VESA_MODE_640X400X8
.word VBE_VESA_MODE_640X480X8
.word VBE_VESA_MODE_800X600X4
.word VBE_VESA_MODE_800X600X8
.word VBE_VESA_MODE_1024X768X8
+.word VBE_VESA_MODE_640X480X565
+.word VBE_VESA_MODE_640X480X888
+.word VBE_VESA_MODE_800X600X565
+.word VBE_VESA_MODE_800X600X888
+.word VBE_OWN_MODE_800X600X8888
+.word VBE_OWN_MODE_1024X768X8888
.word VBE_OWN_MODE_320X200X8
.word VBE_VESA_MODE_END_OF_LIST
#endif
@@ -317,9 +311,9 @@ static ModeInfoListItem* mode_info_find_mode(mode, using_lfb)
*/
Boolean vbe_has_vbe_display()
{
- dispi_set_id(VBE_DISPI_ID1);
+ dispi_set_id(VBE_DISPI_ID2);
- return (dispi_get_id()==VBE_DISPI_ID1);
+ return (dispi_get_id()==VBE_DISPI_ID2);
}
/** VBE Init - Initialise the Vesa Bios Extension Code
@@ -618,35 +612,24 @@ Bit16u *AX;Bit16u BX; Bit16u ES;Bit16u DI;
cur_info->info.YResolution,
cur_info->info.BitsPerPixel);
#endif
- // FIXME: this is here so we can do some testing
- // at least until bochs host side display is up & running
- // (we're using the 'standard' 320x200x256 vga mode as if it
- // were a vesa mode)
- if (cur_info->info.BitsPerPixel <= 8)
+ // first disable current mode (when switching between vesa modi)
+ dispi_set_enable(VBE_DISPI_DISABLED);
+
+ if (cur_info->mode == VBE_VESA_MODE_800X600X4)
{
- // we have a 4bpp or 8bpp mode, preparing to set it
-
- // first disable current mode (when switching between vesa modi)
- dispi_set_enable(VBE_DISPI_DISABLED);
-
- if (cur_info->mode == VBE_VESA_MODE_800X600X4)
- {
- biosfn_set_video_mode(0x6a);
- }
-
- dispi_set_xres(cur_info->info.XResolution);
- dispi_set_yres(cur_info->info.YResolution);
- dispi_set_bpp((cur_info->info.BitsPerPixel == 8)?VBE_DISPI_BPP_8:VBE_DISPI_BPP_4);
- dispi_set_bank(0);
- dispi_set_enable(VBE_DISPI_ENABLED);
+ biosfn_set_video_mode(0x6a);
+ }
+
+ dispi_set_xres(cur_info->info.XResolution);
+ dispi_set_yres(cur_info->info.YResolution);
+ dispi_set_bpp(cur_info->info.BitsPerPixel);
+ dispi_set_bank(0);
+ dispi_set_enable(VBE_DISPI_ENABLED);
// FIXME: store current mode in BIOS data area
-
- result = 0x4f;
- }
-
- //FIXME: new resolutions will need special code (per bpp)
+
+ result = 0x4f;
}
else
{
diff --git a/vbe.h b/vbe.h
index 09a27f8..6067034 100644
--- a/vbe.h
+++ b/vbe.h
@@ -292,13 +292,8 @@ typedef struct ModeInfoBlock
#define VBE_DISPI_ID0 0xB0C0
#define VBE_DISPI_ID1 0xB0C1
+ #define VBE_DISPI_ID2 0xB0C2
- #define VBE_DISPI_BPP_8 0x0
- #define VBE_DISPI_BPP_4 0x4
-// The following is not support yet, but just for reference available.
-// #define VBE_DISPI_BPP_RGB565 0x1
-// #define VBE_DISPI_BPP_RGB555 0x2
-
#define VBE_DISPI_DISABLED 0x00
#define VBE_DISPI_ENABLED 0x01
diff --git a/vbetables.h b/vbetables.h
index c286616..0c7f99b 100644
--- a/vbetables.h
+++ b/vbetables.h
@@ -14,8 +14,6 @@ typedef struct ModeInfoListItem
ModeInfoBlockCompact info;
} ModeInfoListItem;
-//#define LIST_UNSUPPORTED_MODI
-
// FIXME: check all member variables to be correct for the different modi
// FIXME: add more modi
static ModeInfoListItem mode_info_list[]=
@@ -431,7 +429,6 @@ static ModeInfoListItem mode_info_list[]=
}
},
-#ifdef LIST_UNSUPPORTED_MODI
{
VBE_VESA_MODE_640X480X565,
{
@@ -594,14 +591,14 @@ static ModeInfoListItem mode_info_list[]=
/*Bit16u WinASegment*/ VGAMEM_GRAPH,
/*Bit16u WinBSegment*/ 0,
/*Bit32u WinFuncPtr*/ 0,
- /*Bit16u BytesPerScanLine*/ 640*4,
+ /*Bit16u BytesPerScanLine*/ 640*3,
// Mandatory information for VBE 1.2 and above
/*Bit16u XResolution*/ 640,
/*Bit16u YResolution*/ 480,
/*Bit8u XCharSize*/ 8,
/*Bit8u YCharSize*/ 16,
/*Bit8u NumberOfPlanes*/ 1,
- /*Bit8u BitsPerPixel*/ 32,
+ /*Bit8u BitsPerPixel*/ 24,
/*Bit8u NumberOfBanks*/ 1,
/*Bit8u MemoryModel*/ VBE_MEMORYMODEL_DIRECT_COLOR,
/*Bit8u BankSize*/ 0,
@@ -614,8 +611,8 @@ static ModeInfoListItem mode_info_list[]=
/*Bit8u GreenFieldPosition*/ 8,
/*Bit8u BlueMaskSize*/ 8,
/*Bit8u BlueFieldPosition*/ 0,
- /*Bit8u RsvdMaskSize*/ 8,
- /*Bit8u RsvdFieldPosition*/ 24,
+ /*Bit8u RsvdMaskSize*/ 0,
+ /*Bit8u RsvdFieldPosition*/ 0,
/*Bit8u DirectColorModeInfo*/ 0,
// Mandatory information for VBE 2.0 and above
#ifdef VBE_HAVE_LFB
@@ -626,7 +623,7 @@ static ModeInfoListItem mode_info_list[]=
/*Bit32u OffScreenMemOffset*/ 0,
/*Bit16u OffScreenMemSize*/ 0,
// Mandatory information for VBE 3.0 and above
- /*Bit16u LinBytesPerScanLine*/ 640*4,
+ /*Bit16u LinBytesPerScanLine*/ 640*3,
/*Bit8u BnkNumberOfPages*/ 0,
/*Bit8u LinNumberOfPages*/ 0,
/*Bit8u LinRedMaskSize*/ 8,
@@ -635,8 +632,8 @@ static ModeInfoListItem mode_info_list[]=
/*Bit8u LinGreenFieldPosition*/ 8,
/*Bit8u LinBlueMaskSize*/ 8,
/*Bit8u LinBlueFieldPosition*/ 0,
- /*Bit8u LinRsvdMaskSize*/ 8,
- /*Bit8u LinRsvdFieldPosition*/ 24,
+ /*Bit8u LinRsvdMaskSize*/ 0,
+ /*Bit8u LinRsvdFieldPosition*/ 0,
/*Bit32u MaxPixelClock*/ 0,
/*} ModeInfoBlock;*/
}
@@ -664,14 +661,14 @@ static ModeInfoListItem mode_info_list[]=
/*Bit16u WinASegment*/ VGAMEM_GRAPH,
/*Bit16u WinBSegment*/ 0,
/*Bit32u WinFuncPtr*/ 0,
- /*Bit16u BytesPerScanLine*/ 800*4,
+ /*Bit16u BytesPerScanLine*/ 800*3,
// Mandatory information for VBE 1.2 and above
/*Bit16u XResolution*/ 800,
/*Bit16u YResolution*/ 600,
/*Bit8u XCharSize*/ 8,
/*Bit8u YCharSize*/ 16,
/*Bit8u NumberOfPlanes*/ 1,
- /*Bit8u BitsPerPixel*/ 32,
+ /*Bit8u BitsPerPixel*/ 24,
/*Bit8u NumberOfBanks*/ 1,
/*Bit8u MemoryModel*/ VBE_MEMORYMODEL_DIRECT_COLOR,
/*Bit8u BankSize*/ 0,
@@ -684,8 +681,8 @@ static ModeInfoListItem mode_info_list[]=
/*Bit8u GreenFieldPosition*/ 8,
/*Bit8u BlueMaskSize*/ 8,
/*Bit8u BlueFieldPosition*/ 0,
- /*Bit8u RsvdMaskSize*/ 8,
- /*Bit8u RsvdFieldPosition*/ 24,
+ /*Bit8u RsvdMaskSize*/ 0,
+ /*Bit8u RsvdFieldPosition*/ 0,
/*Bit8u DirectColorModeInfo*/ 0,
// Mandatory information for VBE 2.0 and above
#ifdef VBE_HAVE_LFB
@@ -696,7 +693,7 @@ static ModeInfoListItem mode_info_list[]=
/*Bit32u OffScreenMemOffset*/ 0,
/*Bit16u OffScreenMemSize*/ 0,
// Mandatory information for VBE 3.0 and above
- /*Bit16u LinBytesPerScanLine*/ 800*4,
+ /*Bit16u LinBytesPerScanLine*/ 800*3,
/*Bit8u BnkNumberOfPages*/ 0,
/*Bit8u LinNumberOfPages*/ 0,
/*Bit8u LinRedMaskSize*/ 8,
@@ -705,8 +702,8 @@ static ModeInfoListItem mode_info_list[]=
/*Bit8u LinGreenFieldPosition*/ 8,
/*Bit8u LinBlueMaskSize*/ 8,
/*Bit8u LinBlueFieldPosition*/ 0,
- /*Bit8u LinRsvdMaskSize*/ 8,
- /*Bit8u LinRsvdFieldPosition*/ 24,
+ /*Bit8u LinRsvdMaskSize*/ 0,
+ /*Bit8u LinRsvdFieldPosition*/ 0,
/*Bit32u MaxPixelClock*/ 0,
/*} ModeInfoBlock;*/
}
@@ -851,7 +848,6 @@ static ModeInfoListItem mode_info_list[]=
/*} ModeInfoBlock;*/
}
},
-#endif
/** END OF THE LIST **/
{