aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVolker Ruppert <info@vruppert.de>2003-02-09 10:02:45 +0000
committerVolker Ruppert <info@vruppert.de>2003-02-09 10:02:45 +0000
commitf93afc8d0eb415d19e81a1c64233cae9f9986b64 (patch)
treefa51418049b595779e4f01434c04c13db1961324
parent5468a07ad6645416fd441ba929151fe81f654df3 (diff)
downloadvgabios-f93afc8d0eb415d19e81a1c64233cae9f9986b64.tar.gz
- VESA mode 0x102 added (uses existing SVGA mode 0x6a)
- all VESA modes with the LFB flag set removed from the list (Linux doesn't like mode numbers > 0x07ff)
-rw-r--r--vbe.c24
-rw-r--r--vbe.h1
-rw-r--r--vbetables.h63
3 files changed, 74 insertions, 14 deletions
diff --git a/vbe.c b/vbe.c
index d96de02..4ef4031 100644
--- a/vbe.c
+++ b/vbe.c
@@ -102,28 +102,19 @@ _vbebios_mode_list:
#ifdef LIST_UNSUPPORTED_MODI
.word VBE_VESA_MODE_640X480X565
-.word VBE_VESA_MODE_640X480X565 + 0x4000
.word VBE_VESA_MODE_800X600X565
-.word VBE_VESA_MODE_800X600X565 + 0x4000
.word VBE_VESA_MODE_640X480X888
-.word VBE_VESA_MODE_640X480X888 + 0x4000
.word VBE_VESA_MODE_800X600X888
-.word VBE_VESA_MODE_800X600X888 + 0x4000
.word VBE_OWN_MODE_800X600X8888
-.word VBE_OWN_MODE_800X600X8888 + 0x4000
.word VBE_OWN_MODE_1024X768X8888
-.word VBE_OWN_MODE_1024X768X8888 + 0x4000
#endif
-.word VBE_OWN_MODE_320X200X8
.word VBE_VESA_MODE_640X400X8
-.word VBE_VESA_MODE_640X400X8 + 0x4000
.word VBE_VESA_MODE_640X480X8
-.word VBE_VESA_MODE_640X480X8 + 0x4000
+.word VBE_VESA_MODE_800X600X4
.word VBE_VESA_MODE_800X600X8
-.word VBE_VESA_MODE_800X600X8 + 0x4000
.word VBE_VESA_MODE_1024X768X8
-.word VBE_VESA_MODE_1024X768X8 + 0x4000
+.word VBE_OWN_MODE_320X200X8
.word VBE_VESA_MODE_END_OF_LIST
#endif
@@ -596,16 +587,21 @@ Bit16u *AX;Bit16u BX; Bit16u ES;Bit16u DI;
// (we're using the 'standard' 320x200x256 vga mode as if it
// were a vesa mode)
- if (cur_info->info.BitsPerPixel == 8)
+ if (cur_info->info.BitsPerPixel <= 8)
{
- // we have a 8bpp mode, preparing to set it
+ // 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(VBE_DISPI_BPP_8);
+ 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);
diff --git a/vbe.h b/vbe.h
index 1e618e8..2ca0d11 100644
--- a/vbe.h
+++ b/vbe.h
@@ -293,6 +293,7 @@ typedef struct ModeInfoBlock
#define VBE_DISPI_ID1 0xB0C1
#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
diff --git a/vbetables.h b/vbetables.h
index ae208ad..d3c712e 100644
--- a/vbetables.h
+++ b/vbetables.h
@@ -366,6 +366,69 @@ static ModeInfoListItem mode_info_list[]=
},
{
+ VBE_VESA_MODE_800X600X4,
+ {
+/*typedef struct ModeInfoBlock
+{*/
+// Mandatory information for all VBE revisions
+ /*Bit16u ModeAttributes*/ VBE_MODE_ATTRIBUTE_SUPPORTED |
+ VBE_MODE_ATTRIBUTE_GRAPHICS_MODE |
+ VBE_MODE_ATTRIBUTE_COLOR_MODE |
+ VBE_MODE_ATTRIBUTE_GRAPHICS_MODE,
+ /*Bit8u WinAAttributes*/ VBE_WINDOW_ATTRIBUTE_READABLE |
+ VBE_WINDOW_ATTRIBUTE_WRITEABLE |
+ VBE_WINDOW_ATTRIBUTE_RELOCATABLE,
+ /*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*/ 800,
+// Mandatory information for VBE 1.2 and above
+ /*Bit16u XResolution*/ 800,
+ /*Bit16u YResolution*/ 600,
+ /*Bit8u XCharSize*/ 8,
+ /*Bit8u YCharSize*/ 16,
+ /*Bit8u NumberOfPlanes*/ 4,
+ /*Bit8u BitsPerPixel*/ 4,
+ /*Bit8u NumberOfBanks*/ 1,
+ /*Bit8u MemoryModel*/ VBE_MEMORYMODEL_PLANAR,
+ /*Bit8u BankSize*/ 0,
+ /*Bit8u NumberOfImagePages*/ 1,
+ /*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
+ /*Bit32u PhysBasePtr*/ 0,
+ /*Bit32u OffScreenMemOffset*/ 0,
+ /*Bit16u OffScreenMemSize*/ 0,
+// Mandatory information for VBE 3.0 and above
+ /*Bit16u LinBytesPerScanLine*/ 800,
+ /*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_800X600X8,
{
/*typedef struct ModeInfoBlock