aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeroen Janssen <japj@xs4all.nl>2002-02-18 17:48:58 +0000
committerJeroen Janssen <japj@xs4all.nl>2002-02-18 17:48:58 +0000
commite86b6b0f14794cec162b97a9b297a85fed7f4852 (patch)
tree07bc995a91d2075b211315dc5f3545d9cca2ecd1
parentf5006dfeab2dbf4674f04be6db79df1a509faac4 (diff)
downloadvgabios-e86b6b0f14794cec162b97a9b297a85fed7f4852.tar.gz
- cosmetic updates to vbe.c/h + added bunch of FIXMEs for work that needs to be done
-rw-r--r--vbe.c527
-rw-r--r--vbe.h243
2 files changed, 406 insertions, 364 deletions
diff --git a/vbe.c b/vbe.c
index 95a444a..70952d7 100644
--- a/vbe.c
+++ b/vbe.c
@@ -20,7 +20,7 @@
//
// This VBE is part of the VGA Bios specific to the plex86/bochs Emulated VGA card.
// You can NOT drive any physical vga card with it.
-//
+//
// ============================================================================================
//
// This VBE Bios is based on information taken from :
@@ -31,6 +31,8 @@
#include "vbe.h"
#include "vbetables.h"
+// The current OEM Software Revision of this VBE Bios
+#define VBE_OEM_SOFTWARE_REV 0x0002;
#define VBEInfoData ((VbeInfoBlock *) 0)
@@ -39,6 +41,7 @@ extern char vbebios_vendor_name;
extern char vbebios_product_name;
extern char vbebios_product_revision;
+// FIXME: find out why we cannot use the dynamic list generation (due to a bug somewhere)
//#define DYN_LIST
#ifndef DYN_LIST
@@ -46,23 +49,26 @@ extern Bit16u vbebios_mode_list;
#endif
#asm
+// FIXME: 'merge' these (c) etc strings with the vgabios.c strings?
_vbebios_copyright:
-.ascii "Bochs/Plex86 VBE(C) 2002 Jeroen Janssen <japj@darius.demon.nl>"
-.byte 0x00
+.ascii "Bochs/Plex86 VBE(C) 2002 Jeroen Janssen <japj@darius.demon.nl>"
+.byte 0x00
_vbebios_vendor_name:
-.ascii "Bochs/Plex86 Developers"
-.byte 0x00
+.ascii "Bochs/Plex86 Developers"
+.byte 0x00
_vbebios_product_name:
-.ascii "Bochs/Plex86 VBE Adapter"
-.byte 0x00
+.ascii "Bochs/Plex86 VBE Adapter"
+.byte 0x00
_vbebios_product_revision:
-.ascii "$Id$"
-.byte 0x00
+.ascii "$Id$"
+.byte 0x00
#ifndef DYN_LIST
+// FIXME: for each new mode add a statement here
+// at least until dynamic list creation is working
_vbebios_mode_list:
.word VBE_VESA_MODE_640X400X8
.word VBE_VESA_MODE_640X480X8
@@ -80,349 +86,380 @@ _vbebios_mode_list:
/** Function 00h - Return VBE Controller Information
*
* Input:
- * AX = 4F00h
- * ES:DI = Pointer to buffer in which to place VbeInfoBlock structure
- * (VbeSignature should be VBE2 when VBE 2.0 information is desired and
- * the info block is 512 bytes in size)
+ * AX = 4F00h
+ * ES:DI = Pointer to buffer in which to place VbeInfoBlock structure
+ * (VbeSignature should be VBE2 when VBE 2.0 information is desired and
+ * the info block is 512 bytes in size)
* Output:
- * AX = VBE Return Status
+ * AX = VBE Return Status
*
*/
void vbe_biosfn_return_controller_information(AX, ES, DI)
Bit16u *AX;Bit16u ES;Bit16u DI;
{
- Bit16u ss=get_SS();
- VbeInfoBlock vbe_info_block;
- Bit16u status;
- Bit16u result;
- //Bit16u *video_mode_list;
- Bit16u cur_mode=0;
- ModeInfoListItem *cur_info=&mode_info_list;
-
- status=read_word(ss,AX);
-
-#ifdef DEBUG
- printf("VBE vbe_biosfn_return_vbe_info ES%x DI%x AX%x\n",ES,DI,status);
+ Bit16u ss=get_SS();
+ VbeInfoBlock vbe_info_block;
+ Bit16u status;
+ Bit16u result;
+#ifdef DYN_LIST
+ Bit16u *video_mode_list;
#endif
- // get vbe_info_block into local variable
- memcpyb(ss,&vbe_info_block,ES,DI,sizeof(vbe_info_block));
-
- // check for VBE2 signature
- if ( (vbe_info_block.VbeSignature[0] == 'V') &&
- (vbe_info_block.VbeSignature[1] == 'B') &&
- (vbe_info_block.VbeSignature[2] == 'E') &&
- (vbe_info_block.VbeSignature[3] == '2') )
- {
-#ifdef DEBUG
- printf("VBE correct VBE2 signature found\n");
+ Bit16u cur_mode=0;
+ ModeInfoListItem *cur_info=&mode_info_list;
+
+ status = read_word(ss, AX);
+
+#ifdef DEBUG
+ printf("VBE vbe_biosfn_return_vbe_info ES%x DI%x AX%x\n",ES,DI,status);
#endif
- // VBE Signature
- vbe_info_block.VbeSignature[0]='V';
- vbe_info_block.VbeSignature[1]='E';
- vbe_info_block.VbeSignature[2]='S';
- vbe_info_block.VbeSignature[3]='A';
-
- // VBE Version supported
- vbe_info_block.VbeVersion=0x0200;
-
- // OEM String
- vbe_info_block.OemStringPtr_Seg=0xc000;
- vbe_info_block.OemStringPtr_Off=&vbebios_copyright;
-
- // Capabilities
- vbe_info_block.Capabilities[0]=0;
- vbe_info_block.Capabilities[1]=0;
- vbe_info_block.Capabilities[2]=0;
- vbe_info_block.Capabilities[3]=0;
+ // get vbe_info_block into local variable
+ memcpyb(ss, &vbe_info_block, ES, DI, sizeof(vbe_info_block));
+
+ // check for VBE2 signature
+ if ( (vbe_info_block.VbeSignature[0] == 'V') &&
+ (vbe_info_block.VbeSignature[1] == 'B') &&
+ (vbe_info_block.VbeSignature[2] == 'E') &&
+ (vbe_info_block.VbeSignature[3] == '2') )
+ {
+#ifdef DEBUG
+ printf("VBE correct VBE2 signature found\n");
+#endif
+ // VBE Signature
+ vbe_info_block.VbeSignature[0] = 'V';
+ vbe_info_block.VbeSignature[1] = 'E';
+ vbe_info_block.VbeSignature[2] = 'S';
+ vbe_info_block.VbeSignature[3] = 'A';
+
+ // VBE Version supported
+ vbe_info_block.VbeVersion = 0x0200;
+
+ // OEM String
+ vbe_info_block.OemStringPtr_Seg = 0xc000;
+ vbe_info_block.OemStringPtr_Off = &vbebios_copyright;
+
+ // Capabilities
+ vbe_info_block.Capabilities[0] = 0;
+ vbe_info_block.Capabilities[1] = 0;
+ vbe_info_block.Capabilities[2] = 0;
+ vbe_info_block.Capabilities[3] = 0;
#ifdef DYN_LIST
- // 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;
+ // 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;
#else
- // VBE Video Mode Pointer (staticly in rom)
- vbe_info_block.VideoModePtr_Seg=0xc000;
- vbe_info_block.VideoModePtr_Off=&vbebios_mode_list;
+ // 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)
- vbe_info_block.TotalMemory=VBE_TOTAL_VIDEO_MEMORY_DIV_64K;
-
- // OEM Stuff
- vbe_info_block.OemSoftwareRev=0x0002;
- vbe_info_block.OemVendorNamePtr_Seg=0xc000;
- vbe_info_block.OemVendorNamePtr_Off=&vbebios_vendor_name;
- vbe_info_block.OemProductNamePtr_Seg=0xc000;
- vbe_info_block.OemProductNamePtr_Off=&vbebios_product_name;
- vbe_info_block.OemProductRevPtr_Seg=0xc000;
- vbe_info_block.OemProductRevPtr_Off=&vbebios_product_revision;
-
- // copy updates in vbe_info_block back
- memcpyb(ES,DI,ss,&vbe_info_block,sizeof(vbe_info_block));
-
- result=0x4f;
- }
- else
- {
-#ifdef DEBUG
- printf("VBE failed VBE2 signature check\n");
+
+// 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)
+ vbe_info_block.TotalMemory = VBE_TOTAL_VIDEO_MEMORY_DIV_64K;
+
+ // OEM Stuff
+ vbe_info_block.OemSoftwareRev = VBE_OEM_SOFTWARE_REV;
+ vbe_info_block.OemVendorNamePtr_Seg = 0xc000;
+ vbe_info_block.OemVendorNamePtr_Off = &vbebios_vendor_name;
+ vbe_info_block.OemProductNamePtr_Seg = 0xc000;
+ vbe_info_block.OemProductNamePtr_Off = &vbebios_product_name;
+ vbe_info_block.OemProductRevPtr_Seg = 0xc000;
+ vbe_info_block.OemProductRevPtr_Off = &vbebios_product_revision;
+
+ // copy updates in vbe_info_block back
+ memcpyb(ES, DI, ss, &vbe_info_block, sizeof(vbe_info_block));
+
+ result = 0x4f;
+ }
+ else
+ {
+#ifdef DEBUG
+ printf("VBE failed VBE2 signature check\n");
#endif
- result=0x0100;
- }
-
- write_word(ss,AX,result);
+ result = 0x0100;
+ }
+
+ write_word(ss, AX, result);
}
+
/** Function 01h - Return VBE Mode Information
*
* Input:
- * AX = 4F01h
- * CX = Mode Number
- * ES:DI = Pointer to buffer in which to place ModeInfoBlock structure
+ * AX = 4F01h
+ * CX = Mode Number
+ * ES:DI = Pointer to buffer in which to place ModeInfoBlock structure
* Output:
- * AX = VBE Return Status
+ * AX = VBE Return Status
*
*/
void vbe_biosfn_return_mode_information(AX, CX, ES, DI)
Bit16u *AX;Bit16u CX; Bit16u ES;Bit16u DI;
{
- Bit16u result=0x0100;
- Bit16u ss=get_SS();
- ModeInfoBlock info;
- ModeInfoListItem *cur_info=&mode_info_list;
- Boolean found=0;
-
-
-#ifdef DEBUG
- printf("VBE vbe_biosfn_return_mode_information ES%x DI%x CX%x\n",ES,DI,CX);
+ Bit16u result=0x0100;
+ Bit16u ss=get_SS();
+ ModeInfoBlock info;
+ ModeInfoListItem *cur_info=&mode_info_list;
+ Boolean found=0;
+
+#ifdef DEBUG
+ printf("VBE vbe_biosfn_return_mode_information ES%x DI%x CX%x\n",ES,DI,CX);
#endif
- while ((cur_info->mode!=VBE_VESA_MODE_END_OF_LIST) && (!found))
- {
- if (cur_info->mode==CX)
- {
- found=1;
- }
- else
- {
- cur_info++;
- }
- }
-
- if (found)
- {
-#ifdef DEBUG
- printf("VBE found mode %x\n",CX);
-#endif
- memsetb(ss,&info,0,sizeof(ModeInfoBlock));
- memcpyb(ss,&info,0xc000,&(cur_info->info),sizeof(ModeInfoBlockCompact));
-
- result=0x4f;
- }
- else
- {
-#ifdef DEBUG
- printf("VBE *NOT* found mode %x\n",CX);
-#endif
- result=0x100;
- }
-
- if (result==0x4f)
- {
- // copy updates in mode_info_block back
- memcpyb(ES,DI,ss,&info,sizeof(info));
- }
-
- write_word(ss,AX,result);
+ while ((cur_info->mode != VBE_VESA_MODE_END_OF_LIST) && (!found))
+ {
+ if (cur_info->mode == CX)
+ {
+ found=1;
+ }
+ else
+ {
+ cur_info++;
+ }
+ }
+
+ if (found)
+ {
+#ifdef DEBUG
+ printf("VBE found mode %x\n",CX);
+#endif
+ memsetb(ss, &info, 0, sizeof(ModeInfoBlock));
+ memcpyb(ss, &info, 0xc000, &(cur_info->info), sizeof(ModeInfoBlockCompact));
+
+ result = 0x4f;
+ }
+ else
+ {
+#ifdef DEBUG
+ printf("VBE *NOT* found mode %x\n",CX);
+#endif
+ result = 0x100;
+ }
+
+ if (result == 0x4f)
+ {
+ // copy updates in mode_info_block back
+ memcpyb(ES, DI, ss, &info, sizeof(info));
+ }
+
+ write_word(ss, AX, result);
}
/** Function 02h - Set VBE Mode
*
* Input:
- * AX = 4F02h
- * BX = Desired Mode to set
- * ES:DI = Pointer to CRTCInfoBlock structure
+ * AX = 4F02h
+ * BX = Desired Mode to set
+ * ES:DI = Pointer to CRTCInfoBlock structure
* Output:
- * AX = VBE Return Status
+ * AX = VBE Return Status
*
*/
void vbe_biosfn_set_mode(AX, BX, ES, DI)
Bit16u *AX;Bit16u BX; Bit16u ES;Bit16u DI;
{
- Bit16u ss=get_SS();
- Bit16u result;
- ModeInfoListItem *cur_info=&mode_info_list;
- Boolean found=0;
- Boolean using_lfb;
-
- using_lfb=((BX & VBE_MODE_LINEAR_FRAME_BUFFER) == VBE_MODE_LINEAR_FRAME_BUFFER);
- BX=(BX & 0x1ff);
-
- //result=read_word(ss,AX);
-
- while ((cur_info->mode!=VBE_VESA_MODE_END_OF_LIST) && (!found))
- {
- if (cur_info->mode==BX)
- {
- found=1;
- }
- else
- {
- cur_info++;
- }
- }
- if (found)
- {
-#ifdef DEBUG
- printf("VBE found mode %x, setting:\n",BX);
- printf("\txres%x yres%x bpp%x\n",
- cur_info->info.XResolution,
- cur_info->info.YResolution,
- cur_info->info.BitsPerPixel);
-#endif
-
- result=0x4f;
- }
- else
- {
-#ifdef DEBUG
- printf("VBE *NOT* found mode %x\n",BX);
-#endif
- result=0x100;
-
- if (BX==3)
- result=0x4f;
- }
-
- write_word(ss,AX,result);
+ Bit16u ss = get_SS();
+ Bit16u result;
+ ModeInfoListItem *cur_info = &mode_info_list;
+ Boolean found = 0;
+ Boolean using_lfb;
+
+ using_lfb=((BX & VBE_MODE_LINEAR_FRAME_BUFFER) == VBE_MODE_LINEAR_FRAME_BUFFER);
+
+ BX = (BX & 0x1ff);
+
+ //result=read_word(ss,AX);
+
+ while ((cur_info->mode != VBE_VESA_MODE_END_OF_LIST) && (!found))
+ {
+ if (cur_info->mode == BX)
+ {
+ found = 1;
+ }
+ else
+ {
+ cur_info++;
+ }
+ }
+ if (found)
+ {
+#ifdef DEBUG
+ printf("VBE found mode %x, setting:\n", BX);
+ printf("\txres%x yres%x bpp%x\n",
+ cur_info->info.XResolution,
+ cur_info->info.YResolution,
+ cur_info->info.BitsPerPixel);
+#endif
+
+ // FIXME: setup gfx mode with host
+ // FIXME: store current mode in CMOS
+
+ result = 0x4f;
+ }
+ else
+ {
+#ifdef DEBUG
+ printf("VBE *NOT* found mode %x\n" , BX);
+#endif
+ result = 0x100;
+
+ // FIXME: redirect non VBE modi to normal VGA bios operation
+ // (switch back to VGA mode
+ if (BX == 3)
+ result = 0x4f;
+ }
+
+ write_word(ss, AX, result);
}
/** Function 03h - Return Current VBE Mode
*
* Input:
- * AX = 4F03h
+ * AX = 4F03h
* Output:
- * AX = VBE Return Status
- * BX = Current VBE Mode
+ * AX = VBE Return Status
+ * BX = Current VBE Mode
*
*/
void vbe_biosfn_return_current_mode(AX, BX)
Bit16u *AX;Bit16u *BX;
{
- Bit16u ss=get_SS();
+ Bit16u ss=get_SS();
+
+// FIXME: get current mode from CMOS reg?
-#ifdef DEBUG
- printf("VBE vbe_biosfn_return_current_mode\n");
+#ifdef DEBUG
+ printf("VBE vbe_biosfn_return_current_mode\n");
#endif
-
- write_word(ss,AX,0x4f);
- write_word(ss,BX,0x3);
+
+ write_word(ss, AX, 0x4f);
+ write_word(ss, BX, 0x3);
}
+
/** Function 04h - Save/Restore State
*
* Input:
- * AX = 4F04h
- * DL = 00h Return Save/Restore State buffer size
- * 01h Save State
- * 02h Restore State
- * CX = Requested states
- * ES:BX = Pointer to buffer (if DL <> 00h)
+ * AX = 4F04h
+ * DL = 00h Return Save/Restore State buffer size
+ * 01h Save State
+ * 02h Restore State
+ * CX = Requested states
+ * ES:BX = Pointer to buffer (if DL <> 00h)
* Output:
- * AX = VBE Return Status
- * BX = Number of 64-byte blocks to hold the state buffer (if DL=00h)
+ * AX = VBE Return Status
+ * BX = Number of 64-byte blocks to hold the state buffer (if DL=00h)
*
*/
-void vbe_biosfn_save_restore_state(AX, DL, CX, ES, BX);
+void vbe_biosfn_save_restore_state(AX, DL, CX, ES, BX)
+{
+}
+
/** Function 05h - Display Window Control
*
* Input:
- * AX = 4F05h
+ * AX = 4F05h
* Note:
- * If this function is called while in a linear frame buffer mode,
- * this function must fail with completion code AH=03h
+ * If this function is called while in a linear frame buffer mode,
+ * this function must fail with completion code AH=03h
*
* Output:
- * AX = VBE Return Status
+ * AX = VBE Return Status
*
* FIXME: incomplete API description, Input & Output
*/
-void vbe_biosfn_display_window_control(AX);
+void vbe_biosfn_display_window_control(AX)
+{
+}
+
/** Function 06h - Set/Get Logical Scan Line Length
*
* Input:
- * AX = 4F06h
+ * AX = 4F06h
* Output:
- * AX = VBE Return Status
+ * AX = VBE Return Status
*
* FIXME: incomplete API description, Input & Output
*/
-void vbe_biosfn_set_get_logical_scan_line_length(AX);
+void vbe_biosfn_set_get_logical_scan_line_length(AX)
+{
+}
+
/** Function 07h - Set/Get Display Start
*
* Input:
- * AX = 4F07h
+ * AX = 4F07h
* Output:
- * AX = VBE Return Status
+ * AX = VBE Return Status
*
* FIXME: incomplete API description, Input & Output
*/
-void vbe_biosfn_set_get_display_start(AX);
+void vbe_biosfn_set_get_display_start(AX)
+{
+}
+
/** Function 08h - Set/Get Dac Palette Format
*
* Input:
- * AX = 4F08h
+ * AX = 4F08h
* Output:
- * AX = VBE Return Status
+ * AX = VBE Return Status
*
* FIXME: incomplete API description, Input & Output
*/
-void vbe_biosfn_set_get_dac_palette_format(AX);
+void vbe_biosfn_set_get_dac_palette_format(AX)
+{
+}
+
/** Function 09h - Set/Get Palette Data
*
* Input:
- * AX = 4F09h
+ * AX = 4F09h
* Output:
- * AX = VBE Return Status
+ * AX = VBE Return Status
*
* FIXME: incomplete API description, Input & Output
*/
-void vbe_biosfn_set_get_palette_data(AX);
+void vbe_biosfn_set_get_palette_data(AX)
+{
+}
/** Function 0Ah - Return VBE Protected Mode Interface
*
* Input:
- * AX = 4F0Ah
+ * AX = 4F0Ah
* Output:
- * AX = VBE Return Status
+ * AX = VBE Return Status
*
* FIXME: incomplete API description, Input & Output
*/
-void vbe_biosfn_return_protected_mode_interface(AX);
+void vbe_biosfn_return_protected_mode_interface(AX)
+{
+}
diff --git a/vbe.h b/vbe.h
index c936b5c..0a879b4 100644
--- a/vbe.h
+++ b/vbe.h
@@ -20,27 +20,27 @@ void vbe_biosfn_set_get_dac_palette_format(AX);
void vbe_biosfn_set_get_palette_data(AX);
void vbe_biosfn_return_protected_mode_interface(AX);
-
+// The official VBE Information Block
typedef struct VbeInfoBlock
{
- Bit8u VbeSignature[4] ;
- Bit16u VbeVersion ;
- Bit16u OemStringPtr_Off ;
- Bit16u OemStringPtr_Seg ;
- Bit8u Capabilities[4] ;
- Bit16u VideoModePtr_Off ;
- Bit16u VideoModePtr_Seg ;
- Bit16u TotalMemory ;
- Bit16u OemSoftwareRev ;
- Bit16u OemVendorNamePtr_Off ;
- Bit16u OemVendorNamePtr_Seg ;
- Bit16u OemProductNamePtr_Off ;
- Bit16u OemProductNamePtr_Seg ;
- Bit16u OemProductRevPtr_Off ;
- Bit16u OemProductRevPtr_Seg ;
- //Bit8u Reserved[222] ;
- Bit16u Reserved[111] ; // DYN_LIST
- Bit8u OemData[256] ;
+ Bit8u VbeSignature[4];
+ Bit16u VbeVersion;
+ Bit16u OemStringPtr_Off;
+ Bit16u OemStringPtr_Seg;
+ Bit8u Capabilities[4];
+ Bit16u VideoModePtr_Off;
+ Bit16u VideoModePtr_Seg;
+ Bit16u TotalMemory;
+ Bit16u OemSoftwareRev;
+ Bit16u OemVendorNamePtr_Off;
+ Bit16u OemVendorNamePtr_Seg;
+ Bit16u OemProductNamePtr_Off;
+ 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
+ Bit8u OemData[256];
} VbeInfoBlock;
@@ -48,113 +48,112 @@ typedef struct VbeInfoBlock
// this saves us 189 bytes per block
typedef struct ModeInfoBlockCompact
{
-// Mandatory information for all VBE revisions
- Bit16u ModeAttributes ;
- Bit8u WinAAttributes ;
- Bit8u WinBAttributes ;
- Bit16u WinGranularity ;
- Bit16u WinSize ;
- Bit16u WinASegment ;
- Bit16u WinBSegment ;
- Bit32u WinFuncPtr ;
- Bit16u BytesPerScanLine ;
-// Mandatory information for VBE 1.2 and above
- Bit16u XResolution ;
- Bit16u YResolution ;
- Bit8u XCharSize ;
- Bit8u YCharSize ;
- Bit8u NumberOfPlanes ;
- Bit8u BitsPerPixel ;
- Bit8u NumberOfBanks ;
- Bit8u MemoryModel ;
- Bit8u BankSize ;
- Bit8u NumberOfImagePages ;
- Bit8u Reserved_page ;
-// Direct Color fields (required for direct/6 and YUV/7 memory models)
- Bit8u RedMaskSize ;
- Bit8u RedFieldPosition ;
- Bit8u GreenMaskSize ;
- Bit8u GreenFieldPosition ;
- Bit8u BlueMaskSize ;
- Bit8u BlueFieldPosition ;
- Bit8u RsvdMaskSize ;
- Bit8u RsvdFieldPosition ;
- Bit8u DirectColorModeInfo ;
+// Mandatory information for all VBE revisions
+ Bit16u ModeAttributes;
+ Bit8u WinAAttributes;
+ Bit8u WinBAttributes;
+ Bit16u WinGranularity;
+ Bit16u WinSize;
+ Bit16u WinASegment;
+ Bit16u WinBSegment;
+ Bit32u WinFuncPtr;
+ Bit16u BytesPerScanLine;
+// Mandatory information for VBE 1.2 and above
+ Bit16u XResolution;
+ Bit16u YResolution;
+ Bit8u XCharSize;
+ Bit8u YCharSize;
+ Bit8u NumberOfPlanes;
+ Bit8u BitsPerPixel;
+ Bit8u NumberOfBanks;
+ Bit8u MemoryModel;
+ Bit8u BankSize;
+ Bit8u NumberOfImagePages;
+ Bit8u Reserved_page;
+// Direct Color fields (required for direct/6 and YUV/7 memory models)
+ Bit8u RedMaskSize;
+ Bit8u RedFieldPosition;
+ Bit8u GreenMaskSize;
+ Bit8u GreenFieldPosition;
+ Bit8u BlueMaskSize;
+ Bit8u BlueFieldPosition;
+ Bit8u RsvdMaskSize;
+ Bit8u RsvdFieldPosition;
+ Bit8u DirectColorModeInfo;
// Mandatory information for VBE 2.0 and above
- Bit32u PhysBasePtr ;
- Bit32u OffScreenMemOffset ;
- Bit16u OffScreenMemSize ;
-// Mandatory information for VBE 3.0 and above
- Bit16u LinBytesPerScanLine ;
- Bit8u BnkNumberOfPages ;
- Bit8u LinNumberOfPages ;
- Bit8u LinRedMaskSize ;
- Bit8u LinRedFieldPosition ;
- Bit8u LinGreenMaskSize ;
- Bit8u LinGreenFieldPosition ;
- Bit8u LinBlueMaskSize ;
- Bit8u LinBlueFieldPosition ;
- Bit8u LinRsvdMaskSize ;
- Bit8u LinRsvdFieldPosition ;
- Bit32u MaxPixelClock ;
-// Bit8u Reserved[189] ; // Compact Mode Info storage in bios
+ Bit32u PhysBasePtr;
+ Bit32u OffScreenMemOffset;
+ Bit16u OffScreenMemSize;
+// Mandatory information for VBE 3.0 and above
+ Bit16u LinBytesPerScanLine;
+ Bit8u BnkNumberOfPages;
+ Bit8u LinNumberOfPages;
+ Bit8u LinRedMaskSize;
+ Bit8u LinRedFieldPosition;
+ Bit8u LinGreenMaskSize;
+ Bit8u LinGreenFieldPosition;
+ Bit8u LinBlueMaskSize;
+ Bit8u LinBlueFieldPosition;
+ Bit8u LinRsvdMaskSize;
+ Bit8u LinRsvdFieldPosition;
+ Bit32u MaxPixelClock;
+// Bit8u Reserved[189]; // DO NOT PUT THIS IN HERE because of Compact Mode Info storage in bios
} ModeInfoBlockCompact;
typedef struct ModeInfoBlock
{
-// Mandatory information for all VBE revisions
- Bit16u ModeAttributes ;
- Bit8u WinAAttributes ;
- Bit8u WinBAttributes ;
- Bit16u WinGranularity ;
- Bit16u WinSize ;
- Bit16u WinASegment ;
- Bit16u WinBSegment ;
- Bit32u WinFuncPtr ;
- Bit16u BytesPerScanLine ;
-// Mandatory information for VBE 1.2 and above
- Bit16u XResolution ;
- Bit16u YResolution ;
- Bit8u XCharSize ;
- Bit8u YCharSize ;
- Bit8u NumberOfPlanes ;
- Bit8u BitsPerPixel ;
- Bit8u NumberOfBanks ;
- Bit8u MemoryModel ;
- Bit8u BankSize ;
- Bit8u NumberOfImagePages ;
- Bit8u Reserved_page ;
-// Direct Color fields (required for direct/6 and YUV/7 memory models)
- Bit8u RedMaskSize ;
- Bit8u RedFieldPosition ;
- Bit8u GreenMaskSize ;
- Bit8u GreenFieldPosition ;
- Bit8u BlueMaskSize ;
- Bit8u BlueFieldPosition ;
- Bit8u RsvdMaskSize ;
- Bit8u RsvdFieldPosition ;
- Bit8u DirectColorModeInfo ;
+// Mandatory information for all VBE revisions
+ Bit16u ModeAttributes;
+ Bit8u WinAAttributes;
+ Bit8u WinBAttributes;
+ Bit16u WinGranularity;
+ Bit16u WinSize;
+ Bit16u WinASegment;
+ Bit16u WinBSegment;
+ Bit32u WinFuncPtr;
+ Bit16u BytesPerScanLine;
+// Mandatory information for VBE 1.2 and above
+ Bit16u XResolution;
+ Bit16u YResolution;
+ Bit8u XCharSize;
+ Bit8u YCharSize;
+ Bit8u NumberOfPlanes;
+ Bit8u BitsPerPixel;
+ Bit8u NumberOfBanks;
+ Bit8u MemoryModel;
+ Bit8u BankSize;
+ Bit8u NumberOfImagePages;
+ Bit8u Reserved_page;
+// Direct Color fields (required for direct/6 and YUV/7 memory models)
+ Bit8u RedMaskSize;
+ Bit8u RedFieldPosition;
+ Bit8u GreenMaskSize;
+ Bit8u GreenFieldPosition;
+ Bit8u BlueMaskSize;
+ Bit8u BlueFieldPosition;
+ Bit8u RsvdMaskSize;
+ Bit8u RsvdFieldPosition;
+ Bit8u DirectColorModeInfo;
// Mandatory information for VBE 2.0 and above
- Bit32u PhysBasePtr ;
- Bit32u OffScreenMemOffset ;
- Bit16u OffScreenMemSize ;
-// Mandatory information for VBE 3.0 and above
- Bit16u LinBytesPerScanLine ;
- Bit8u BnkNumberOfPages ;
- Bit8u LinNumberOfPages ;
- Bit8u LinRedMaskSize ;
- Bit8u LinRedFieldPosition ;
- Bit8u LinGreenMaskSize ;
- Bit8u LinGreenFieldPosition ;
- Bit8u LinBlueMaskSize ;
- Bit8u LinBlueFieldPosition ;
- Bit8u LinRsvdMaskSize ;
- Bit8u LinRsvdFieldPosition ;
- Bit32u MaxPixelClock ;
- Bit8u Reserved[189] ;
+ Bit32u PhysBasePtr;
+ Bit32u OffScreenMemOffset;
+ Bit16u OffScreenMemSize;
+// Mandatory information for VBE 3.0 and above
+ Bit16u LinBytesPerScanLine;
+ Bit8u BnkNumberOfPages;
+ Bit8u LinNumberOfPages;
+ Bit8u LinRedMaskSize;
+ Bit8u LinRedFieldPosition;
+ Bit8u LinGreenMaskSize;
+ Bit8u LinGreenFieldPosition;
+ Bit8u LinBlueMaskSize;
+ Bit8u LinBlueFieldPosition;
+ Bit8u LinRsvdMaskSize;
+ Bit8u LinRsvdFieldPosition;
+ Bit32u MaxPixelClock;
+ Bit8u Reserved[189];
} ModeInfoBlock;
-
// VBE Return Status Info
// AL
#define VBE_RETURN_STATUS_SUPPORTED 0x4F
@@ -198,6 +197,8 @@ typedef struct ModeInfoBlock
#define VBE_VESA_MODE_1280X1024X565 0x11A
#define VBE_VESA_MODE_1280X1024X888 0x11B
+// BOCHS/PLEX86 'own' mode numbers
+// FIXME: Add more modi
#define VBE_OWN_MODE_320X200X8888 0x140
#define VBE_OWN_MODE_640X400X8888 0x141
#define VBE_OWN_MODE_640X480X8888 0x142
@@ -256,9 +257,13 @@ typedef struct ModeInfoBlock
// GUEST <-> HOST Communication API
+// FIXME: either dynamicly ask host for this or put somewhere high in physical memory
+// like 0xE0000000
#define VBE_PHYSICAL_BASE_ADDRESS 0x3b00000
-//0xE0000000
+
+// FIXME: Add actual host <-> guest IOPORT
#define VBE_BIOS_CALLBACK_IOPORT 0xFF00
#define VBE_TOTAL_VIDEO_MEMORY_DIV_64K (4*1024/64)
+// FIXME: Add host <-> guest index port commands
#endif \ No newline at end of file