diff options
author | Jeroen Janssen <japj@xs4all.nl> | 2002-02-18 16:55:49 +0000 |
---|---|---|
committer | Jeroen Janssen <japj@xs4all.nl> | 2002-02-18 16:55:49 +0000 |
commit | fc12746c5843e333056d47183e62e77ba4ddfb99 (patch) | |
tree | fc95288db8ff7d1b39314ac2c069a25576a0eb4a | |
parent | 4b4e3d35e7642d9bbca869c3a5645852b0d1dfa3 (diff) | |
download | vgabios-fc12746c5843e333056d47183e62e77ba4ddfb99.tar.gz |
- merging with vbebios 0.2 release
-rw-r--r-- | Makefile | 30 | ||||
-rwxr-xr-x | dataseghack | 2 | ||||
-rw-r--r-- | vbe.c | 428 | ||||
-rw-r--r-- | vbe.h | 264 | ||||
-rw-r--r-- | vbetables.h | 487 | ||||
-rw-r--r-- | vgabios.c | 68 | ||||
-rw-r--r-- | vgabios.h | 6 |
7 files changed, 1283 insertions, 2 deletions
@@ -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 { }\ @@ -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); @@ -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 @@ -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 @@ -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 |