aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeroen Janssen <japj@xs4all.nl>2002-02-18 16:55:49 +0000
committerJeroen Janssen <japj@xs4all.nl>2002-02-18 16:55:49 +0000
commitfc12746c5843e333056d47183e62e77ba4ddfb99 (patch)
treefc95288db8ff7d1b39314ac2c069a25576a0eb4a
parent4b4e3d35e7642d9bbca869c3a5645852b0d1dfa3 (diff)
downloadvgabios-fc12746c5843e333056d47183e62e77ba4ddfb99.tar.gz
- merging with vbebios 0.2 release
-rw-r--r--Makefile30
-rwxr-xr-xdataseghack2
-rw-r--r--vbe.c428
-rw-r--r--vbe.h264
-rw-r--r--vbetables.h487
-rw-r--r--vgabios.c68
-rw-r--r--vgabios.h6
7 files changed, 1283 insertions, 2 deletions
diff --git a/Makefile b/Makefile
index fb4ab07..6eddaf4 100644
--- a/Makefile
+++ b/Makefile
@@ -10,7 +10,7 @@ RELDATE = `date '+%d %b %Y'`
all: bios
-bios: vgabios.bin vgabios.debug.bin
+bios: vgabios.bin vgabios.debug.bin vbebios.bin vbebios.debug.bin
clean:
/bin/rm -f *.o *.s *.ld86 \
@@ -56,3 +56,31 @@ vgabios.debug.o: vgabios.c vgabios.h vgafonts.h vgatables.h
./dataseghack vgabios.debug.s
as86 vgabios.debug.s -o vgabios.debug.o -u -w -g -0
+vbebios.bin: vbebios.o
+ ld86 -0 -r -o vbebios vbebios.o
+ tools86 vbebios
+ dd if=vbebios of=vbebios.bin ibs=32 skip=1 count=1024
+ rm -f vbebios _vbebios_.c
+ ls -l vbebios.bin
+
+vbebios.o: vgabios.c vgabios.h vgafonts.h vgatables.h vbe.h vbe.c vbetables.h
+ gcc -E vgabios.c -DVBE -DVGABIOS_DATE="\"$(RELDATE)\"" | tools86 -E > _vbebios_.c
+ /usr/lib/bcc/bcc-cc1 -o vbebios.s -c -D__i86__ -0 _vbebios_.c
+ ./dataseghack vbebios.s
+ # bug : with -j i get 1 byte displacement at the end of bin file !
+ #as86 vgabios.s -o vgabios.o -u -w -g -0 -j
+ as86 vbebios.s -o vbebios.o -u -w -g -0
+
+
+vbebios.debug.bin: vbebios.debug.o
+ ld86 -0 -r -o vbebios.debug vbebios.debug.o
+ tools86 vbebios.debug
+ dd if=vbebios.debug of=vbebios.debug.bin ibs=32 skip=1 count=1024
+ rm -f vbebios.debug _vbebios_.debug.c
+ ls -l vbebios.debug.bin
+
+vbebios.debug.o: vgabios.c vgabios.h vgafonts.h vgatables.h vbe.h vbe.c vbetables.h
+ gcc -E vgabios.c -DVBE -DDEBUG -DVGABIOS_DATE="\"$(RELDATE)\"" | tools86 -E > _vbebios_.debug.c
+ /usr/lib/bcc/bcc-cc1 -o vbebios.debug.s -c -D__i86__ -0 _vbebios_.debug.c
+ ./dataseghack vbebios.debug.s
+ as86 vbebios.debug.s -o vbebios.debug.o -u -w -g -0
diff --git a/dataseghack b/dataseghack
index 5d2aca6..02a2d4c 100755
--- a/dataseghack
+++ b/dataseghack
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
awk \
'BEGIN { }\
diff --git a/vbe.c b/vbe.c
new file mode 100644
index 0000000..95a444a
--- /dev/null
+++ b/vbe.c
@@ -0,0 +1,428 @@
+// ============================================================================================
+//
+// Copyright (C) 2002 Jeroen Janssen
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// ============================================================================================
+//
+// 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 :
+// - VESA BIOS EXTENSION (VBE) Core Functions Standard Version 3.0 located at www.vesa.org
+//
+// ============================================================================================
+
+#include "vbe.h"
+#include "vbetables.h"
+
+
+#define VBEInfoData ((VbeInfoBlock *) 0)
+
+extern char vbebios_copyright;
+extern char vbebios_vendor_name;
+extern char vbebios_product_name;
+extern char vbebios_product_revision;
+
+//#define DYN_LIST
+
+#ifndef DYN_LIST
+extern Bit16u vbebios_mode_list;
+#endif
+
+#asm
+_vbebios_copyright:
+.ascii "Bochs/Plex86 VBE(C) 2002 Jeroen Janssen <japj@darius.demon.nl>"
+.byte 0x00
+
+_vbebios_vendor_name:
+.ascii "Bochs/Plex86 Developers"
+.byte 0x00
+
+_vbebios_product_name:
+.ascii "Bochs/Plex86 VBE Adapter"
+.byte 0x00
+
+_vbebios_product_revision:
+.ascii "$Id$"
+.byte 0x00
+
+#ifndef DYN_LIST
+_vbebios_mode_list:
+.word VBE_VESA_MODE_640X400X8
+.word VBE_VESA_MODE_640X480X8
+.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
+.word VBE_VESA_MODE_END_OF_LIST
+#endif
+
+#endasm
+
+/** 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)
+ * Output:
+ * 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);
+#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");
+#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;
+#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)
+ 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");
+#endif
+ 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
+ * Output:
+ * 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);
+#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);
+}
+
+/** Function 02h - Set VBE Mode
+ *
+ * Input:
+ * AX = 4F02h
+ * BX = Desired Mode to set
+ * ES:DI = Pointer to CRTCInfoBlock structure
+ * Output:
+ * 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);
+}
+
+/** Function 03h - Return Current VBE Mode
+ *
+ * Input:
+ * AX = 4F03h
+ * Output:
+ * AX = VBE Return Status
+ * BX = Current VBE Mode
+ *
+ */
+void vbe_biosfn_return_current_mode(AX, BX)
+Bit16u *AX;Bit16u *BX;
+{
+ Bit16u ss=get_SS();
+
+#ifdef DEBUG
+ printf("VBE vbe_biosfn_return_current_mode\n");
+#endif
+
+ 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)
+ * Output:
+ * 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);
+
+/** Function 05h - Display Window Control
+ *
+ * Input:
+ * AX = 4F05h
+ * Note:
+ * 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
+ *
+ * FIXME: incomplete API description, Input & Output
+ */
+void vbe_biosfn_display_window_control(AX);
+
+/** Function 06h - Set/Get Logical Scan Line Length
+ *
+ * Input:
+ * AX = 4F06h
+ * Output:
+ * AX = VBE Return Status
+ *
+ * FIXME: incomplete API description, Input & Output
+ */
+void vbe_biosfn_set_get_logical_scan_line_length(AX);
+
+/** Function 07h - Set/Get Display Start
+ *
+ * Input:
+ * AX = 4F07h
+ * Output:
+ * AX = VBE Return Status
+ *
+ * FIXME: incomplete API description, Input & Output
+ */
+void vbe_biosfn_set_get_display_start(AX);
+
+/** Function 08h - Set/Get Dac Palette Format
+ *
+ * Input:
+ * AX = 4F08h
+ * Output:
+ * AX = VBE Return Status
+ *
+ * FIXME: incomplete API description, Input & Output
+ */
+void vbe_biosfn_set_get_dac_palette_format(AX);
+
+/** Function 09h - Set/Get Palette Data
+ *
+ * Input:
+ * AX = 4F09h
+ * Output:
+ * AX = VBE Return Status
+ *
+ * FIXME: incomplete API description, Input & Output
+ */
+void vbe_biosfn_set_get_palette_data(AX);
+
+/** Function 0Ah - Return VBE Protected Mode Interface
+ *
+ * Input:
+ * AX = 4F0Ah
+ * Output:
+ * AX = VBE Return Status
+ *
+ * FIXME: incomplete API description, Input & Output
+ */
+void vbe_biosfn_return_protected_mode_interface(AX);
diff --git a/vbe.h b/vbe.h
new file mode 100644
index 0000000..c936b5c
--- /dev/null
+++ b/vbe.h
@@ -0,0 +1,264 @@
+#ifndef vbe_h_included
+#define vbe_h_included
+
+#include "vgabios.h"
+
+/** VBE int10 API
+ *
+ * See the function descriptions in vbe.c for more information
+ */
+
+void vbe_biosfn_return_controller_information(AX, ES, DI);
+void vbe_biosfn_return_mode_information(AX, CX, ES, DI);
+void vbe_biosfn_set_mode(AX, BX, ES, DI);
+void vbe_biosfn_return_current_mode(AX, BX);
+void vbe_biosfn_save_restore_state(AX, DL, CX, ES, BX);
+void vbe_biosfn_display_window_control(AX);
+void vbe_biosfn_set_get_logical_scan_line_length(AX);
+void vbe_biosfn_set_get_display_start(AX);
+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);
+
+
+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] ;
+} VbeInfoBlock;
+
+
+// This one is for compactly storing a static list of mode info blocks
+// 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 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
+} 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 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] ;
+} ModeInfoBlock;
+
+
+// VBE Return Status Info
+// AL
+#define VBE_RETURN_STATUS_SUPPORTED 0x4F
+#define VBE_RETURN_STATUS_UNSUPPORTED 0x00
+// AH
+#define VBE_RETURN_STATUS_SUCCESSFULL 0x00
+#define VBE_RETURN_STATUS_FAILED 0x01
+#define VBE_RETURN_STATUS_NOT_SUPPORTED 0x02
+#define VBE_RETURN_STATUS_INVALID 0x03
+
+// VBE Mode Numbers
+
+#define VBE_MODE_VESA_DEFINED 0x0100
+#define VBE_MODE_REFRESH_RATE_USE_CRTC 0x0800
+#define VBE_MODE_LINEAR_FRAME_BUFFER 0x4000
+#define VBE_MODE_PRESERVE_DISPLAY_MEMORY 0x8000
+
+// VBE GFX Mode Number
+
+#define VBE_VESA_MODE_640X400X8 0x100
+#define VBE_VESA_MODE_640X480X8 0x101
+#define VBE_VESA_MODE_800X600X4 0x102
+#define VBE_VESA_MODE_800X600X8 0x103
+#define VBE_VESA_MODE_1024X768X4 0x104
+#define VBE_VESA_MODE_1024X768X8 0x105
+#define VBE_VESA_MODE_1280X1024X4 0x106
+#define VBE_VESA_MODE_1280X1024X8 0x107
+#define VBE_VESA_MODE_320X200X1555 0x10D
+#define VBE_VESA_MODE_320X200X565 0x10E
+#define VBE_VESA_MODE_320X200X888 0x10F
+#define VBE_VESA_MODE_640X480X1555 0x110
+#define VBE_VESA_MODE_640X480X565 0x111
+#define VBE_VESA_MODE_640X480X888 0x112
+#define VBE_VESA_MODE_800X600X1555 0x113
+#define VBE_VESA_MODE_800X600X565 0x114
+#define VBE_VESA_MODE_800X600X888 0x115
+#define VBE_VESA_MODE_1024X768X1555 0x116
+#define VBE_VESA_MODE_1024X768X565 0x117
+#define VBE_VESA_MODE_1024X768X888 0x118
+#define VBE_VESA_MODE_1280X1024X1555 0x119
+#define VBE_VESA_MODE_1280X1024X565 0x11A
+#define VBE_VESA_MODE_1280X1024X888 0x11B
+
+#define VBE_OWN_MODE_320X200X8888 0x140
+#define VBE_OWN_MODE_640X400X8888 0x141
+#define VBE_OWN_MODE_640X480X8888 0x142
+#define VBE_OWN_MODE_800X600X8888 0x143
+#define VBE_OWN_MODE_1024X768X8888 0x144
+#define VBE_OWN_MODE_1280X1024X8888 0x145
+
+#define VBE_VESA_MODE_END_OF_LIST 0xFFFF
+
+// Capabilities
+
+#define VBE_CAPABILITY_8BIT_DAC 0x0001
+#define VBE_CAPABILITY_NOT_VGA_COMPATIBLE 0x0002
+#define VBE_CAPABILITY_RAMDAC_USE_BLANK_BIT 0x0004
+#define VBE_CAPABILITY_STEREOSCOPIC_SUPPORT 0x0008
+#define VBE_CAPABILITY_STEREO_VIA_VESA_EVC 0x0010
+
+// Mode Attributes
+
+#define VBE_MODE_ATTRIBUTE_SUPPORTED 0x0001
+#define VBE_MODE_ATTRIBUTE_TTY_BIOS_SUPPORT 0x0004
+#define VBE_MODE_ATTRIBUTE_COLOR_MODE 0x0008
+#define VBE_MODE_ATTRIBUTE_GRAPHICS_MODE 0x0010
+#define VBE_MODE_ATTRIBUTE_NOT_VGA_COMPATIBLE 0x0020
+#define VBE_MODE_ATTRIBUTE_NO_VGA_COMPATIBLE_WINDOW 0x0040
+#define VBE_MODE_ATTRIBUTE_LINEAR_FRAME_BUFFER_MODE 0x0080
+#define VBE_MODE_ATTRIBUTE_DOUBLE_SCAN_MODE 0x0100
+#define VBE_MODE_ATTRIBUTE_INTERLACE_MODE 0x0200
+#define VBE_MODE_ATTRIBUTE_HARDWARE_TRIPLE_BUFFER 0x0400
+#define VBE_MODE_ATTRIBUTE_HARDWARE_STEREOSCOPIC_DISPLAY 0x0800
+#define VBE_MODE_ATTRIBUTE_DUAL_DISPLAY_START_ADDRESS 0x1000
+
+#define VBE_MODE_ATTTRIBUTE_LFB_ONLY ( VBE_MODE_ATTRIBUTE_NO_VGA_COMPATIBLE_WINDOW | VBE_MODE_ATTRIBUTE_LINEAR_FRAME_BUFFER_MODE )
+
+// Window attributes
+
+#define VBE_WINDOW_ATTRIBUTE_RELOCATABLE 0x01
+#define VBE_WINDOW_ATTRIBUTE_READABLE 0x02
+#define VBE_WINDOW_ATTRIBUTE_WRITEABLE 0x04
+
+// Memory model
+
+#define VBE_MEMORYMODEL_TEXT_MODE 0x00
+#define VBE_MEMORYMODEL_CGA_GRAPHICS 0x01
+#define VBE_MEMORYMODEL_HERCULES_GRAPHICS 0x02
+#define VBE_MEMORYMODEL_PLANAR 0x03
+#define VBE_MEMORYMODEL_PACKED_PIXEL 0x04
+#define VBE_MEMORYMODEL_NON_CHAIN_4_256 0x05
+#define VBE_MEMORYMODEL_DIRECT_COLOR 0x06
+#define VBE_MEMORYMODEL_YUV 0x07
+
+// DirectColorModeInfo
+
+#define VBE_DIRECTCOLOR_COLOR_RAMP_PROGRAMMABLE 0x01
+#define VBE_DIRECTCOLOR_RESERVED_BITS_AVAILABLE 0x02
+
+// GUEST <-> HOST Communication API
+
+#define VBE_PHYSICAL_BASE_ADDRESS 0x3b00000
+//0xE0000000
+#define VBE_BIOS_CALLBACK_IOPORT 0xFF00
+#define VBE_TOTAL_VIDEO_MEMORY_DIV_64K (4*1024/64)
+
+#endif \ No newline at end of file
diff --git a/vbetables.h b/vbetables.h
new file mode 100644
index 0000000..3159f79
--- /dev/null
+++ b/vbetables.h
@@ -0,0 +1,487 @@
+#ifndef vbetables_h_included
+#define vbetables_h_included
+
+typedef struct ModeInfoListItem
+{
+ Bit16u mode;
+ ModeInfoBlockCompact info;
+} ModeInfoListItem;
+
+
+static ModeInfoListItem mode_info_list[]=
+{
+ {
+ VBE_VESA_MODE_640X400X8,
+ {
+/*typedef struct ModeInfoBlock
+{*/
+// Mandatory information for all VBE revisions
+ /*Bit16u ModeAttributes*/ VBE_MODE_ATTRIBUTE_SUPPORTED | VBE_MODE_ATTRIBUTE_GRAPHICS_MODE | VBE_MODE_ATTTRIBUTE_LFB_ONLY,
+ /*Bit8u WinAAttributes*/ 0,
+ /*Bit8u WinBAttributes*/ 0,
+ /*Bit16u WinGranularity*/ 0,
+ /*Bit16u WinSize*/ 0,
+ /*Bit16u WinASegment*/ 0,
+ /*Bit16u WinBSegment*/ 0,
+ /*Bit32u WinFuncPtr*/ 0,
+ /*Bit16u BytesPerScanLine*/ 640,
+// Mandatory information for VBE 1.2 and above
+ /*Bit16u XResolution*/ 640,
+ /*Bit16u YResolution*/ 400,
+ /*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*/ 0,
+ /*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*/ VBE_PHYSICAL_BASE_ADDRESS,
+ /*Bit32u OffScreenMemOffset*/ 0,
+ /*Bit16u OffScreenMemSize*/ 0,
+// Mandatory information for VBE 3.0 and above
+ /*Bit16u LinBytesPerScanLine*/ 640,
+ /*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_640X480X8,
+ {
+/*typedef struct ModeInfoBlock
+{*/
+// Mandatory information for all VBE revisions
+ /*Bit16u ModeAttributes*/ VBE_MODE_ATTRIBUTE_SUPPORTED | VBE_MODE_ATTRIBUTE_GRAPHICS_MODE | VBE_MODE_ATTTRIBUTE_LFB_ONLY,
+ /*Bit8u WinAAttributes*/ 0,
+ /*Bit8u WinBAttributes*/ 0,
+ /*Bit16u WinGranularity*/ 0,
+ /*Bit16u WinSize*/ 0,
+ /*Bit16u WinASegment*/ 0,
+ /*Bit16u WinBSegment*/ 0,
+ /*Bit32u WinFuncPtr*/ 0,
+ /*Bit16u BytesPerScanLine*/ 640,
+// 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*/ 8,
+ /*Bit8u NumberOfBanks*/ 1,
+ /*Bit8u MemoryModel*/ VBE_MEMORYMODEL_PACKED_PIXEL,
+ /*Bit8u BankSize*/ 0,
+ /*Bit8u NumberOfImagePages*/ 0,
+ /*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*/ VBE_PHYSICAL_BASE_ADDRESS,
+ /*Bit32u OffScreenMemOffset*/ 0,
+ /*Bit16u OffScreenMemSize*/ 0,
+// Mandatory information for VBE 3.0 and above
+ /*Bit16u LinBytesPerScanLine*/ 640,
+ /*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_640X480X565,
+ {
+/*typedef struct ModeInfoBlock
+{*/
+// Mandatory information for all VBE revisions
+ /*Bit16u ModeAttributes*/ VBE_MODE_ATTRIBUTE_SUPPORTED | VBE_MODE_ATTRIBUTE_GRAPHICS_MODE | VBE_MODE_ATTTRIBUTE_LFB_ONLY,
+ /*Bit8u WinAAttributes*/ 0,
+ /*Bit8u WinBAttributes*/ 0,
+ /*Bit16u WinGranularity*/ 0,
+ /*Bit16u WinSize*/ 0,
+ /*Bit16u WinASegment*/ 0,
+ /*Bit16u WinBSegment*/ 0,
+ /*Bit32u WinFuncPtr*/ 0,
+ /*Bit16u BytesPerScanLine*/ 640*2,
+// 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*/ 16,
+ /*Bit8u NumberOfBanks*/ 1,
+ /*Bit8u MemoryModel*/ VBE_MEMORYMODEL_DIRECT_COLOR,
+ /*Bit8u BankSize*/ 0,
+ /*Bit8u NumberOfImagePages*/ 0,
+ /*Bit8u Reserved_page*/ 0,
+// Direct Color fields (required for direct/6 and YUV/7 memory models)
+ /*Bit8u RedMaskSize*/ 5,
+ /*Bit8u RedFieldPosition*/ 0,
+ /*Bit8u GreenMaskSize*/ 6,
+ /*Bit8u GreenFieldPosition*/ 5,
+ /*Bit8u BlueMaskSize*/ 5,
+ /*Bit8u BlueFieldPosition*/ 11,
+ /*Bit8u RsvdMaskSize*/ 0,
+ /*Bit8u RsvdFieldPosition*/ 0,
+ /*Bit8u DirectColorModeInfo*/ 0,
+// Mandatory information for VBE 2.0 and above
+ /*Bit32u PhysBasePtr*/ VBE_PHYSICAL_BASE_ADDRESS,
+ /*Bit32u OffScreenMemOffset*/ 0,
+ /*Bit16u OffScreenMemSize*/ 0,
+// Mandatory information for VBE 3.0 and above
+ /*Bit16u LinBytesPerScanLine*/ 640*2,
+ /*Bit8u BnkNumberOfPages*/ 0,
+ /*Bit8u LinNumberOfPages*/ 0,
+ /*Bit8u LinRedMaskSize*/ 5,
+ /*Bit8u LinRedFieldPosition*/ 0,
+ /*Bit8u LinGreenMaskSize*/ 6,
+ /*Bit8u LinGreenFieldPosition*/ 5,
+ /*Bit8u LinBlueMaskSize*/ 5,
+ /*Bit8u LinBlueFieldPosition*/ 11,
+ /*Bit8u LinRsvdMaskSize*/ 0,
+ /*Bit8u LinRsvdFieldPosition*/ 0,
+ /*Bit32u MaxPixelClock*/ 0,
+/*} ModeInfoBlock;*/
+ }
+ },
+
+ {
+ VBE_VESA_MODE_800X600X565,
+ {
+/*typedef struct ModeInfoBlock
+{*/
+// Mandatory information for all VBE revisions
+ /*Bit16u ModeAttributes*/ VBE_MODE_ATTRIBUTE_SUPPORTED | VBE_MODE_ATTRIBUTE_GRAPHICS_MODE | VBE_MODE_ATTTRIBUTE_LFB_ONLY,
+ /*Bit8u WinAAttributes*/ 0,
+ /*Bit8u WinBAttributes*/ 0,
+ /*Bit16u WinGranularity*/ 0,
+ /*Bit16u WinSize*/ 0,
+ /*Bit16u WinASegment*/ 0,
+ /*Bit16u WinBSegment*/ 0,
+ /*Bit32u WinFuncPtr*/ 0,
+ /*Bit16u BytesPerScanLine*/ 800*2,
+// 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*/ 16,
+ /*Bit8u NumberOfBanks*/ 1,
+ /*Bit8u MemoryModel*/ VBE_MEMORYMODEL_DIRECT_COLOR,
+ /*Bit8u BankSize*/ 0,
+ /*Bit8u NumberOfImagePages*/ 0,
+ /*Bit8u Reserved_page*/ 0,
+// Direct Color fields (required for direct/6 and YUV/7 memory models)
+ /*Bit8u RedMaskSize*/ 5,
+ /*Bit8u RedFieldPosition*/ 0,
+ /*Bit8u GreenMaskSize*/ 6,
+ /*Bit8u GreenFieldPosition*/ 5,
+ /*Bit8u BlueMaskSize*/ 5,
+ /*Bit8u BlueFieldPosition*/ 11,
+ /*Bit8u RsvdMaskSize*/ 0,
+ /*Bit8u RsvdFieldPosition*/ 0,
+ /*Bit8u DirectColorModeInfo*/ 0,
+// Mandatory information for VBE 2.0 and above
+ /*Bit32u PhysBasePtr*/ VBE_PHYSICAL_BASE_ADDRESS,
+ /*Bit32u OffScreenMemOffset*/ 0,
+ /*Bit16u OffScreenMemSize*/ 0,
+// Mandatory information for VBE 3.0 and above
+ /*Bit16u LinBytesPerScanLine*/ 800*2,
+ /*Bit8u BnkNumberOfPages*/ 0,
+ /*Bit8u LinNumberOfPages*/ 0,
+ /*Bit8u LinRedMaskSize*/ 5,
+ /*Bit8u LinRedFieldPosition*/ 0,
+ /*Bit8u LinGreenMaskSize*/ 6,
+ /*Bit8u LinGreenFieldPosition*/ 5,
+ /*Bit8u LinBlueMaskSize*/ 5,
+ /*Bit8u LinBlueFieldPosition*/ 11,
+ /*Bit8u LinRsvdMaskSize*/ 0,
+ /*Bit8u LinRsvdFieldPosition*/ 0,
+ /*Bit32u MaxPixelClock*/ 0,
+/*} ModeInfoBlock;*/
+ }
+ },
+
+ {
+ VBE_VESA_MODE_640X480X888,
+ {
+/*typedef struct ModeInfoBlock
+{*/
+// Mandatory information for all VBE revisions
+ /*Bit16u ModeAttributes*/ VBE_MODE_ATTRIBUTE_SUPPORTED | VBE_MODE_ATTRIBUTE_GRAPHICS_MODE | VBE_MODE_ATTTRIBUTE_LFB_ONLY,
+ /*Bit8u WinAAttributes*/ 0,
+ /*Bit8u WinBAttributes*/ 0,
+ /*Bit16u WinGranularity*/ 0,
+ /*Bit16u WinSize*/ 0,
+ /*Bit16u WinASegment*/ 0,
+ /*Bit16u WinBSegment*/ 0,
+ /*Bit32u WinFuncPtr*/ 0,
+ /*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*/ 24,
+ /*Bit8u NumberOfBanks*/ 1,
+ /*Bit8u MemoryModel*/ VBE_MEMORYMODEL_DIRECT_COLOR,
+ /*Bit8u BankSize*/ 0,
+ /*Bit8u NumberOfImagePages*/ 0,
+ /*Bit8u Reserved_page*/ 0,
+// Direct Color fields (required for direct/6 and YUV/7 memory models)
+ /*Bit8u RedMaskSize*/ 8,
+ /*Bit8u RedFieldPosition*/ 0,
+ /*Bit8u GreenMaskSize*/ 8,
+ /*Bit8u GreenFieldPosition*/ 8,
+ /*Bit8u BlueMaskSize*/ 8,
+ /*Bit8u BlueFieldPosition*/ 16,
+ /*Bit8u RsvdMaskSize*/ 0,
+ /*Bit8u RsvdFieldPosition*/ 0,
+ /*Bit8u DirectColorModeInfo*/ 0,
+// Mandatory information for VBE 2.0 and above
+ /*Bit32u PhysBasePtr*/ VBE_PHYSICAL_BASE_ADDRESS,
+ /*Bit32u OffScreenMemOffset*/ 0,
+ /*Bit16u OffScreenMemSize*/ 0,
+// Mandatory information for VBE 3.0 and above
+ /*Bit16u LinBytesPerScanLine*/ 640*3,
+ /*Bit8u BnkNumberOfPages*/ 0,
+ /*Bit8u LinNumberOfPages*/ 0,
+ /*Bit8u LinRedMaskSize*/ 8,
+ /*Bit8u LinRedFieldPosition*/ 0,
+ /*Bit8u LinGreenMaskSize*/ 8,
+ /*Bit8u LinGreenFieldPosition*/ 8,
+ /*Bit8u LinBlueMaskSize*/ 8,
+ /*Bit8u LinBlueFieldPosition*/ 16,
+ /*Bit8u LinRsvdMaskSize*/ 0,
+ /*Bit8u LinRsvdFieldPosition*/ 0,
+ /*Bit32u MaxPixelClock*/ 0,
+/*} ModeInfoBlock;*/
+ }
+ },
+
+ {
+ VBE_VESA_MODE_800X600X888,
+ {
+/*typedef struct ModeInfoBlock
+{*/
+// Mandatory information for all VBE revisions
+ /*Bit16u ModeAttributes*/ VBE_MODE_ATTRIBUTE_SUPPORTED | VBE_MODE_ATTRIBUTE_GRAPHICS_MODE | VBE_MODE_ATTTRIBUTE_LFB_ONLY,
+ /*Bit8u WinAAttributes*/ 0,
+ /*Bit8u WinBAttributes*/ 0,
+ /*Bit16u WinGranularity*/ 0,
+ /*Bit16u WinSize*/ 0,
+ /*Bit16u WinASegment*/ 0,
+ /*Bit16u WinBSegment*/ 0,
+ /*Bit32u WinFuncPtr*/ 0,
+ /*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*/ 24,
+ /*Bit8u NumberOfBanks*/ 1,
+ /*Bit8u MemoryModel*/ VBE_MEMORYMODEL_DIRECT_COLOR,
+ /*Bit8u BankSize*/ 0,
+ /*Bit8u NumberOfImagePages*/ 0,
+ /*Bit8u Reserved_page*/ 0,
+// Direct Color fields (required for direct/6 and YUV/7 memory models)
+ /*Bit8u RedMaskSize*/ 8,
+ /*Bit8u RedFieldPosition*/ 0,
+ /*Bit8u GreenMaskSize*/ 8,
+ /*Bit8u GreenFieldPosition*/ 8,
+ /*Bit8u BlueMaskSize*/ 8,
+ /*Bit8u BlueFieldPosition*/ 16,
+ /*Bit8u RsvdMaskSize*/ 0,
+ /*Bit8u RsvdFieldPosition*/ 0,
+ /*Bit8u DirectColorModeInfo*/ 0,
+// Mandatory information for VBE 2.0 and above
+ /*Bit32u PhysBasePtr*/ VBE_PHYSICAL_BASE_ADDRESS,
+ /*Bit32u OffScreenMemOffset*/ 0,
+ /*Bit16u OffScreenMemSize*/ 0,
+// Mandatory information for VBE 3.0 and above
+ /*Bit16u LinBytesPerScanLine*/ 800*3,
+ /*Bit8u BnkNumberOfPages*/ 0,
+ /*Bit8u LinNumberOfPages*/ 0,
+ /*Bit8u LinRedMaskSize*/ 8,
+ /*Bit8u LinRedFieldPosition*/ 0,
+ /*Bit8u LinGreenMaskSize*/ 8,
+ /*Bit8u LinGreenFieldPosition*/ 8,
+ /*Bit8u LinBlueMaskSize*/ 8,
+ /*Bit8u LinBlueFieldPosition*/ 16,
+ /*Bit8u LinRsvdMaskSize*/ 0,
+ /*Bit8u LinRsvdFieldPosition*/ 0,
+ /*Bit32u MaxPixelClock*/ 0,
+/*} ModeInfoBlock;*/
+ }
+ },
+
+ {
+ VBE_OWN_MODE_800X600X8888,
+ {
+/*typedef struct ModeInfoBlock
+{*/
+// Mandatory information for all VBE revisions
+ /*Bit16u ModeAttributes*/ VBE_MODE_ATTRIBUTE_SUPPORTED | VBE_MODE_ATTRIBUTE_GRAPHICS_MODE | VBE_MODE_ATTTRIBUTE_LFB_ONLY,
+ /*Bit8u WinAAttributes*/ 0,
+ /*Bit8u WinBAttributes*/ 0,
+ /*Bit16u WinGranularity*/ 0,
+ /*Bit16u WinSize*/ 0,
+ /*Bit16u WinASegment*/ 0,
+ /*Bit16u WinBSegment*/ 0,
+ /*Bit32u WinFuncPtr*/ 0,
+ /*Bit16u BytesPerScanLine*/ 800*4,
+// 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 NumberOfBanks*/ 1,
+ /*Bit8u MemoryModel*/ VBE_MEMORYMODEL_DIRECT_COLOR,
+ /*Bit8u BankSize*/ 0,
+ /*Bit8u NumberOfImagePages*/ 0,
+ /*Bit8u Reserved_page*/ 0,
+// Direct Color fields (required for direct/6 and YUV/7 memory models)
+ /*Bit8u RedMaskSize*/ 8,
+ /*Bit8u RedFieldPosition*/ 0,
+ /*Bit8u GreenMaskSize*/ 8,
+ /*Bit8u GreenFieldPosition*/ 8,
+ /*Bit8u BlueMaskSize*/ 8,
+ /*Bit8u BlueFieldPosition*/ 16,
+ /*Bit8u RsvdMaskSize*/ 8,
+ /*Bit8u RsvdFieldPosition*/ 24,
+ /*Bit8u DirectColorModeInfo*/ VBE_DIRECTCOLOR_RESERVED_BITS_AVAILABLE,
+// Mandatory information for VBE 2.0 and above
+ /*Bit32u PhysBasePtr*/ VBE_PHYSICAL_BASE_ADDRESS,
+ /*Bit32u OffScreenMemOffset*/ 0,
+ /*Bit16u OffScreenMemSize*/ 0,
+// Mandatory information for VBE 3.0 and above
+ /*Bit16u LinBytesPerScanLine*/ 800*4,
+ /*Bit8u BnkNumberOfPages*/ 0,
+ /*Bit8u LinNumberOfPages*/ 0,
+ /*Bit8u LinRedMaskSize*/ 8,
+ /*Bit8u LinRedFieldPosition*/ 0,
+ /*Bit8u LinGreenMaskSize*/ 8,
+ /*Bit8u LinGreenFieldPosition*/ 8,
+ /*Bit8u LinBlueMaskSize*/ 8,
+ /*Bit8u LinBlueFieldPosition*/ 16,
+ /*Bit8u LinRsvdMaskSize*/ 8,
+ /*Bit8u LinRsvdFieldPosition*/ 24,
+ /*Bit32u MaxPixelClock*/ 0,
+/*} ModeInfoBlock;*/
+ }
+ },
+
+
+ {
+ VBE_OWN_MODE_1024X768X8888,
+ {
+/*typedef struct ModeInfoBlock
+{*/
+// Mandatory information for all VBE revisions
+ /*Bit16u ModeAttributes*/ VBE_MODE_ATTRIBUTE_SUPPORTED | VBE_MODE_ATTRIBUTE_GRAPHICS_MODE | VBE_MODE_ATTTRIBUTE_LFB_ONLY,
+ /*Bit8u WinAAttributes*/ 0,
+ /*Bit8u WinBAttributes*/ 0,
+ /*Bit16u WinGranularity*/ 0,
+ /*Bit16u WinSize*/ 0,
+ /*Bit16u WinASegment*/ 0,
+ /*Bit16u WinBSegment*/ 0,
+ /*Bit32u WinFuncPtr*/ 0,
+ /*Bit16u BytesPerScanLine*/ 1024*4,
+// Mandatory information for VBE 1.2 and above
+ /*Bit16u XResolution*/ 1024,
+ /*Bit16u YResolution*/ 800,
+ /*Bit8u XCharSize*/ 8,
+ /*Bit8u YCharSize*/ 16,
+ /*Bit8u NumberOfPlanes*/ 1,
+ /*Bit8u BitsPerPixel*/ 32,
+ /*Bit8u NumberOfBanks*/ 1,
+ /*Bit8u MemoryModel*/ VBE_MEMORYMODEL_DIRECT_COLOR,
+ /*Bit8u BankSize*/ 0,
+ /*Bit8u NumberOfImagePages*/ 0,
+ /*Bit8u Reserved_page*/ 0,
+// Direct Color fields (required for direct/6 and YUV/7 memory models)
+ /*Bit8u RedMaskSize*/ 8,
+ /*Bit8u RedFieldPosition*/ 0,
+ /*Bit8u GreenMaskSize*/ 8,
+ /*Bit8u GreenFieldPosition*/ 8,
+ /*Bit8u BlueMaskSize*/ 8,
+ /*Bit8u BlueFieldPosition*/ 16,
+ /*Bit8u RsvdMaskSize*/ 8,
+ /*Bit8u RsvdFieldPosition*/ 24,
+ /*Bit8u DirectColorModeInfo*/ VBE_DIRECTCOLOR_RESERVED_BITS_AVAILABLE,
+// Mandatory information for VBE 2.0 and above
+ /*Bit32u PhysBasePtr*/ VBE_PHYSICAL_BASE_ADDRESS,
+ /*Bit32u OffScreenMemOffset*/ 0,
+ /*Bit16u OffScreenMemSize*/ 0,
+// Mandatory information for VBE 3.0 and above
+ /*Bit16u LinBytesPerScanLine*/ 1024*4,
+ /*Bit8u BnkNumberOfPages*/ 0,
+ /*Bit8u LinNumberOfPages*/ 0,
+ /*Bit8u LinRedMaskSize*/ 8,
+ /*Bit8u LinRedFieldPosition*/ 0,
+ /*Bit8u LinGreenMaskSize*/ 8,
+ /*Bit8u LinGreenFieldPosition*/ 8,
+ /*Bit8u LinBlueMaskSize*/ 8,
+ /*Bit8u LinBlueFieldPosition*/ 16,
+ /*Bit8u LinRsvdMaskSize*/ 8,
+ /*Bit8u LinRsvdFieldPosition*/ 24,
+ /*Bit32u MaxPixelClock*/ 0,
+/*} ModeInfoBlock;*/
+ }
+ },
+
+/** END OF THE LIST **/
+ {
+ VBE_VESA_MODE_END_OF_LIST,
+ {
+ 0,
+ }
+ }
+};
+
+#endif \ No newline at end of file
diff --git a/vgabios.c b/vgabios.c
index 3daba7e..0463ccd 100644
--- a/vgabios.c
+++ b/vgabios.c
@@ -50,6 +50,10 @@
#include "vgabios.h"
+#ifdef VBE
+#include "vbe.h"
+#endif
+
/* Declares */
static Bit8u read_byte();
static Bit16u read_word();
@@ -659,6 +663,66 @@ static void int10_func(DI, SI, BP, SP, BX, DX, CX, AX, DS, ES, FLAGS)
}
SET_AL(0x1C);
break;
+
+#ifdef VBE
+ case 0x4f:
+ switch(GET_AL())
+ {
+ case 0x00:
+ vbe_biosfn_return_controller_information(&AX,ES,DI);
+ break;
+ case 0x01:
+ vbe_biosfn_return_mode_information(&AX,CX,ES,DI);
+ break;
+ case 0x02:
+ vbe_biosfn_set_mode(&AX,BX,ES,DI);
+ break;
+ case 0x03:
+ vbe_biosfn_return_current_mode(&AX,&BX);
+ break;
+ case 0x04:
+#ifdef DEBUG
+ unimplemented();
+#endif
+ break;
+ case 0x05:
+#ifdef DEBUG
+ unimplemented();
+#endif
+ break;
+ case 0x06:
+#ifdef DEBUG
+ unimplemented();
+#endif
+ break;
+ case 0x07:
+#ifdef DEBUG
+ unimplemented();
+#endif
+ break;
+ case 0x08:
+#ifdef DEBUG
+ unimplemented();
+#endif
+ break;
+ case 0x09:
+#ifdef DEBUG
+ unimplemented();
+#endif
+ break;
+ case 0x0A:
+#ifdef DEBUG
+ unimplemented();
+#endif
+ break;
+#ifdef DEBUG
+ default:
+ unknown();
+#endif
+ }
+ break;
+#endif
+
#ifdef DEBUG
default:
unknown();
@@ -2302,6 +2366,10 @@ void printf(s)
}
#endif
+#ifdef VBE
+#include "vbe.c"
+#endif
+
// --------------------------------------------------------------------------------------------
#asm
diff --git a/vgabios.h b/vgabios.h
index b3e69b3..fcfa83a 100644
--- a/vgabios.h
+++ b/vgabios.h
@@ -1,6 +1,10 @@
+#ifndef vgabios_h_included
+#define vgabios_h_included
+
/* Types */
typedef unsigned char Bit8u;
typedef unsigned short Bit16u;
+typedef unsigned long Bit32u;
typedef unsigned short Boolean;
/* Defines */
@@ -50,3 +54,5 @@ typedef unsigned short Boolean;
#define SCREEN_SIZE(x,y) (((x*y*2)|0x00ff)+1)
#define SCREEN_MEM_START(x,y,p) ((((x*y*2)|0x00ff)+1)*p)
#define SCREEN_IO_START(x,y,p) ((((x*y)|0x00ff)+1)*p)
+
+#endif \ No newline at end of file