diff options
author | Volker Ruppert <info@vruppert.de> | 2003-06-30 19:27:05 +0000 |
---|---|---|
committer | Volker Ruppert <info@vruppert.de> | 2003-06-30 19:27:05 +0000 |
commit | 125eba8089e5780bc15ad269da0accd03a71e17e (patch) | |
tree | b2bee43ea51b8e6e66c12fc7bf00ea53c0860ab5 | |
parent | a499d6506c3800b0f1193d621b7b15afadd0343a (diff) | |
download | vgabios-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.c | 61 | ||||
-rw-r--r-- | vbe.h | 7 | ||||
-rw-r--r-- | vbetables.h | 32 |
3 files changed, 37 insertions, 63 deletions
@@ -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 { @@ -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 **/ { |