📄 vgabios.diff
字号:
// ---------------------------------------------------------------------------------------------static void biosfn_read_video_state_size (CX,ES,BX) Bit16u CX;Bit16u ES;Bit16u BX;+// --------------------------------------------------------------------------------------------+static Bit16u biosfn_read_video_state_size2 (CX) + Bit16u CX; {-#ifdef DEBUG- unimplemented();-#endif+ Bit16u size;+ size = 0;+ if (CX & 1) {+ size += 0x46;+ }+ if (CX & 2) {+ size += (5 + 8 + 5) * 2 + 6;+ }+ if (CX & 4) {+ size += 3 + 256 * 3 + 1; }-static void biosfn_save_video_state (CX,ES,BX) Bit16u CX;Bit16u ES;Bit16u BX;+ return size;+}++static void biosfn_read_video_state_size (CX, BX) + Bit16u CX; Bit16u *BX; {-#ifdef DEBUG- unimplemented();-#endif+ Bit16u ss=get_SS();+ write_word(ss, BX, biosfn_read_video_state_size2(CX)); }-static void biosfn_restore_video_state (CX,ES,BX) Bit16u CX;Bit16u ES;Bit16u BX;++static Bit16u biosfn_save_video_state (CX,ES,BX) + Bit16u CX;Bit16u ES;Bit16u BX; {-#ifdef DEBUG- unimplemented();-#endif+ Bit16u i, v, crtc_addr, ar_index;++ crtc_addr = read_word(BIOSMEM_SEG, BIOSMEM_CRTC_ADDRESS);+ if (CX & 1) {+ write_byte(ES, BX, inb(VGAREG_SEQU_ADDRESS)); BX++;+ write_byte(ES, BX, inb(crtc_addr)); BX++;+ write_byte(ES, BX, inb(VGAREG_GRDC_ADDRESS)); BX++;+ inb(VGAREG_ACTL_RESET);+ ar_index = inb(VGAREG_ACTL_ADDRESS);+ write_byte(ES, BX, ar_index); BX++;+ write_byte(ES, BX, inb(VGAREG_READ_FEATURE_CTL)); BX++;++ for(i=1;i<=4;i++){+ outb(VGAREG_SEQU_ADDRESS, i);+ write_byte(ES, BX, inb(VGAREG_SEQU_DATA)); BX++;+ }+ outb(VGAREG_SEQU_ADDRESS, 0);+ write_byte(ES, BX, inb(VGAREG_SEQU_DATA)); BX++;++ for(i=0;i<=0x18;i++) {+ outb(crtc_addr,i);+ write_byte(ES, BX, inb(crtc_addr+1)); BX++;+ }++ for(i=0;i<=0x13;i++) {+ inb(VGAREG_ACTL_RESET);+ outb(VGAREG_ACTL_ADDRESS, i | (ar_index & 0x20));+ write_byte(ES, BX, inb(VGAREG_ACTL_READ_DATA)); BX++;+ }+ inb(VGAREG_ACTL_RESET);++ for(i=0;i<=8;i++) {+ outb(VGAREG_GRDC_ADDRESS,i);+ write_byte(ES, BX, inb(VGAREG_GRDC_DATA)); BX++;+ }++ write_word(ES, BX, crtc_addr); BX+= 2;++ /* XXX: read plane latches */+ write_byte(ES, BX, 0); BX++;+ write_byte(ES, BX, 0); BX++;+ write_byte(ES, BX, 0); BX++;+ write_byte(ES, BX, 0); BX++;+ }+ if (CX & 2) {+ write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE)); BX++;+ write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS)); BX += 2;+ write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_PAGE_SIZE)); BX += 2;+ write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS)); BX += 2;+ write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS)); BX++;+ write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT)); BX += 2;+ write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_VIDEO_CTL)); BX++;+ write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_SWITCHES)); BX++;+ write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_MODESET_CTL)); BX++;+ write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_CURSOR_TYPE)); BX += 2;+ for(i=0;i<8;i++) {+ write_word(ES, BX, read_word(BIOSMEM_SEG, BIOSMEM_CURSOR_POS+2*i));+ BX += 2;+ }+ write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_CURRENT_START)); BX += 2;+ write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_PAGE)); BX++;+ /* current font */+ write_word(ES, BX, read_word(0, 0x1f * 4)); BX += 2;+ write_word(ES, BX, read_word(0, 0x1f * 4 + 2)); BX += 2;+ write_word(ES, BX, read_word(0, 0x43 * 4)); BX += 2;+ write_word(ES, BX, read_word(0, 0x43 * 4 + 2)); BX += 2;+ }+ if (CX & 4) {+ /* XXX: check this */+ write_byte(ES, BX, inb(VGAREG_DAC_STATE)); BX++; /* read/write mode dac */+ write_byte(ES, BX, inb(VGAREG_DAC_WRITE_ADDRESS)); BX++; /* pix address */+ write_byte(ES, BX, inb(VGAREG_PEL_MASK)); BX++;+ // Set the whole dac always, from 0+ outb(VGAREG_DAC_WRITE_ADDRESS,0x00);+ for(i=0;i<256*3;i++) {+ write_byte(ES, BX, inb(VGAREG_DAC_DATA)); BX++;+ }+ write_byte(ES, BX, 0); BX++; /* color select register */+ }+ return BX;+}++static Bit16u biosfn_restore_video_state (CX,ES,BX) + Bit16u CX;Bit16u ES;Bit16u BX;+{+ Bit16u i, crtc_addr, v, addr1, ar_index;++ if (CX & 1) {+ // Reset Attribute Ctl flip-flop+ inb(VGAREG_ACTL_RESET);++ crtc_addr = read_word(ES, BX + 0x40);+ addr1 = BX;+ BX += 5;+ + for(i=1;i<=4;i++){+ outb(VGAREG_SEQU_ADDRESS, i);+ outb(VGAREG_SEQU_DATA, read_byte(ES, BX)); BX++;+ }+ outb(VGAREG_SEQU_ADDRESS, 0);+ outb(VGAREG_SEQU_DATA, read_byte(ES, BX)); BX++;++ // Disable CRTC write protection+ outw(crtc_addr,0x0011);+ // Set CRTC regs+ for(i=0;i<=0x18;i++) {+ if (i != 0x11) {+ outb(crtc_addr,i);+ outb(crtc_addr+1, read_byte(ES, BX));+ }+ BX++;+ }+ // select crtc base address+ v = inb(VGAREG_READ_MISC_OUTPUT) & ~0x01;+ if (crtc_addr = 0x3d4)+ v |= 0x01;+ outb(VGAREG_WRITE_MISC_OUTPUT, v);++ // enable write protection if needed+ outb(crtc_addr, 0x11);+ outb(crtc_addr+1, read_byte(ES, BX - 0x18 + 0x11));+ + // Set Attribute Ctl+ ar_index = read_byte(ES, addr1 + 0x03);+ inb(VGAREG_ACTL_RESET);+ for(i=0;i<=0x13;i++) {+ outb(VGAREG_ACTL_ADDRESS, i | (ar_index & 0x20));+ outb(VGAREG_ACTL_WRITE_DATA, read_byte(ES, BX)); BX++;+ }+ outb(VGAREG_ACTL_ADDRESS, ar_index);+ inb(VGAREG_ACTL_RESET);+ + for(i=0;i<=8;i++) {+ outb(VGAREG_GRDC_ADDRESS,i);+ outb(VGAREG_GRDC_DATA, read_byte(ES, BX)); BX++;+ }+ BX += 2; /* crtc_addr */+ BX += 4; /* plane latches */+ + outb(VGAREG_SEQU_ADDRESS, read_byte(ES, addr1)); addr1++;+ outb(crtc_addr, read_byte(ES, addr1)); addr1++;+ outb(VGAREG_GRDC_ADDRESS, read_byte(ES, addr1)); addr1++;+ addr1++;+ outb(crtc_addr - 0x4 + 0xa, read_byte(ES, addr1)); addr1++;+ }+ if (CX & 2) {+ write_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE, read_byte(ES, BX)); BX++;+ write_word(BIOSMEM_SEG,BIOSMEM_NB_COLS, read_word(ES, BX)); BX += 2;+ write_word(BIOSMEM_SEG,BIOSMEM_PAGE_SIZE, read_word(ES, BX)); BX += 2;+ write_word(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS, read_word(ES, BX)); BX += 2;+ write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, read_byte(ES, BX)); BX++;+ write_word(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT, read_word(ES, BX)); BX += 2;+ write_byte(BIOSMEM_SEG,BIOSMEM_VIDEO_CTL, read_byte(ES, BX)); BX++;+ write_byte(BIOSMEM_SEG,BIOSMEM_SWITCHES, read_byte(ES, BX)); BX++;+ write_byte(BIOSMEM_SEG,BIOSMEM_MODESET_CTL, read_byte(ES, BX)); BX++;+ write_word(BIOSMEM_SEG,BIOSMEM_CURSOR_TYPE, read_word(ES, BX)); BX += 2;+ for(i=0;i<8;i++) {+ write_word(BIOSMEM_SEG, BIOSMEM_CURSOR_POS+2*i, read_word(ES, BX));+ BX += 2;+ }+ write_word(BIOSMEM_SEG,BIOSMEM_CURRENT_START, read_word(ES, BX)); BX += 2;+ write_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_PAGE, read_byte(ES, BX)); BX++;+ /* current font */+ write_word(0, 0x1f * 4, read_word(ES, BX)); BX += 2;+ write_word(0, 0x1f * 4 + 2, read_word(ES, BX)); BX += 2;+ write_word(0, 0x43 * 4, read_word(ES, BX)); BX += 2;+ write_word(0, 0x43 * 4 + 2, read_word(ES, BX)); BX += 2;+ }+ if (CX & 4) {+ BX++;+ v = read_byte(ES, BX); BX++;+ outb(VGAREG_PEL_MASK, read_byte(ES, BX)); BX++;+ // Set the whole dac always, from 0+ outb(VGAREG_DAC_WRITE_ADDRESS,0x00);+ for(i=0;i<256*3;i++) {+ outb(VGAREG_DAC_DATA, read_byte(ES, BX)); BX++;+ }+ BX++;+ outb(VGAREG_DAC_WRITE_ADDRESS, v);+ }+ return BX; } // ============================================================================================diff -u -w vbetables-gen.c--- vbetables-gen.c 1970-01-01 01:00:00.000000000 +0100+++ vbetables-gen.c 2006-06-14 00:52:18.000000000 +0200@@ -0,0 +1,217 @@+/* Generate the VGABIOS VBE Tables */+#include <stdlib.h>+#include <stdio.h>++typedef struct {+ int width;+ int height;+ int depth;+ int mode;+} ModeInfo;++ModeInfo modes[] = {+ /* standard VESA modes */+{ 640, 400, 8 , 0x100},+{ 640, 480, 8 , 0x101},+{ 800, 600, 4 , 0x102},+{ 800, 600, 8 , 0x103},+ //{ 1024, 768, 4 , 0x104},+{ 1024, 768, 8 , 0x105},+ //{ 1280, 1024, 4 , 0x106},+{ 1280, 1024, 8 , 0x107},+{ 320, 200, 15 , 0x10D},+{ 320, 200, 16 , 0x10E},+{ 320, 200, 24 , 0x10F},+{ 640, 480, 15 , 0x110},+{ 640, 480, 16 , 0x111},+{ 640, 480, 24 , 0x112},+{ 800, 600, 15 , 0x113},+{ 800, 600, 16 , 0x114},+{ 800, 600, 24 , 0x115},+{ 1024, 768, 15 , 0x116},+{ 1024, 768, 16 , 0x117},+{ 1024, 768, 24 , 0x118},+{ 1280, 1024, 15 , 0x119},+{ 1280, 1024, 16 , 0x11A},+{ 1280, 1024, 24 , 0x11B},+{ 1600, 1200, 8 , 0x11C},+{ 1600, 1200, 15 , 0x11D},+{ 1600, 1200, 16 , 0x11E},+{ 1600, 1200, 24 , 0x11F},++ /* BOCHS/PLE, 86 'own' mode numbers */+{ 320, 200, 32 , 0x140},+{ 640, 400, 32 , 0x141},+{ 640, 480, 32 , 0x142},+{ 800, 600, 32 , 0x143},+{ 1024, 768, 32 , 0x144},+{ 1280, 1024, 32 , 0x145},+{ 320, 200, 8 , 0x146},+{ 1600, 1200, 32 , 0x147},+{ 1152, 864, 8 , 0x148},+{ 1152, 864, 15 , 0x149},+{ 1152, 864, 16 , 0x14a},+{ 1152, 864, 24 , 0x14b},+{ 1152, 864, 32 , 0x14c},+{ 0, },+};++int main(int argc, char **argv)+{+ const ModeInfo *pm;+ int pitch, r_size, r_pos, g_size, g_pos, b_size, b_pos, a_size, a_pos;+ const char *str;++ printf("/* THIS FILE IS AUTOMATICALLY GENERATED - DO NOT EDIT */\n");+ printf("static ModeInfoListItem mode_info_list[]=\n");+ printf("{\n");+ for(pm = modes; pm->mode != 0; pm++) {+ printf("{ 0x%04x, /* %dx%dx%d */\n", + pm->mode, pm->width, pm->height, pm->depth);+ printf("{ /*Bit16u ModeAttributes*/ %s,\n", + "VBE_MODE_ATTRIBUTE_SUPPORTED | "+ "VBE_MODE_ATTRIBUTE_EXTENDED_INFORMATION_AVAILABLE | "+ "VBE_MODE_ATTRIBUTE_COLOR_MODE | "+ "VBE_MODE_ATTRIBUTE_LINEAR_FRAME_BUFFER_MODE | "+ "VBE_MODE_ATTRIBUTE_GRAPHICS_MODE");+ + printf("/*Bit8u WinAAttributes*/ %s,\n",+ "VBE_WINDOW_ATTRIBUTE_RELOCATABLE | "+ "VBE_WINDOW_ATTRIBUTE_READABLE | "+ "VBE_WINDOW_ATTRIBUTE_WRITEABLE");+ + printf("/*Bit8u WinBAttributes*/ %d,\n", 0);+ + printf("/*Bit16u WinGranularity*/ %s,\n", "VBE_DISPI_BANK_SIZE_KB");+ + printf("/*Bit16u WinSize*/ %s,\n", "VBE_DISPI_BANK_SIZE_KB");+ + printf("/*Bit16u WinASegment*/ %s,\n", "VGAMEM_GRAPH");+ + printf("/*Bit16u WinBSegment*/ 0x%04x,\n", 0);+ + printf("/*Bit32u WinFuncPtr*/ %d,\n", 0);+ + if (pm->depth == 4)+ pitch = (pm->width + 7) / 8;+ else+ pitch = pm->width * ((pm->depth + 7) / 8);+ printf("/*Bit16u BytesPerScanLine*/ %d,\n", pitch);++ // Mandatory information for VBE 1.2 and above+ printf("/*Bit16u XResolution*/ %d,\n", pm->width);+ printf("/*Bit16u YResolution*/ %d,\n", pm->height);+ printf("/*Bit8u XCharSize*/ %d,\n", 8);+ printf("/*Bit8u YCharSize*/ %d,\n", 16);+ if (pm->depth == 4) {+ printf("/*Bit8u NumberOfPlanes*/ %d,\n", 4);+ printf("/*Bit8u BitsPerPixel*/ %d,\n", pm->depth);+ } else {+ printf("/*Bit8u NumberOfPlanes*/ %d,\n", 1);+ printf("/*Bit8u BitsPerPixel*/ %d,\n", pm->depth);+ }+ printf("/*Bit8u NumberOfBanks*/ %d,\n", + (pm->height * pitch + 65535) / 65536);++ if (pm->depth == 4)+ str = "VBE_MEMORYMODEL_PLANAR";+ else if (pm->depth == 8)+ str = "VBE_MEMORYMODEL_PACKED_PIXEL";+ else+ str = "VBE_MEMORYMODEL_DIRECT_COLOR";+ printf("/*Bit8u MemoryModel*/ %s,\n", str);+ printf("/*Bit8u BankSize*/ %d,\n", 0);+ /* XXX: check */+ printf("/*Bit8u NumberOfImagePages*/ %d,\n", 0);+ printf("/*Bit8u Reserved_page*/ %d,\n", 0);++ // Direct Color fields (required for direct/6 and YUV/7 memory models)+ switch(pm->depth) {+ case 15:+ r_size = 5;+ r_pos = 10;+ g_size = 5;+ g_pos = 5;+ b_size = 5;+ b_pos = 0;+ a_size = 1;+ a_pos = 15;+ break;+ case 16:+ r_size = 5;+ r_pos = 11;+ g_size = 6;+ g_pos = 5;+ b_size = 5;+ b_pos = 0;+ a_size = 0;+ a_pos = 0;+ break;+ case 24:+ r_size = 8;+ r_pos = 16;+ g_size = 8;+ g_pos = 8;+ b_size = 8;+ b_pos = 0;+ a_size = 0;+ a_pos = 0;+ break;+ case 32:+ r_size = 8;+ r_pos = 16;+ g_size = 8;+ g_pos = 8;+ b_size = 8;+ b_pos = 0;+ a_size = 8;+ a_pos = 24;+ break;+ default:+ r_size = 0;+ r_pos = 0;+ g_size = 0;+ g_pos = 0;+ b_size = 0;+ b_pos = 0;+ a_size = 0;+ a_pos = 0;+ break;+ }++ printf("/*Bit8u RedMaskSize*/ %d,\n", r_size); + printf("/*Bit8u RedFieldPosition*/ %d,\n", r_pos); + printf("/*Bit8u GreenMaskSize*/ %d,\n", g_size); + printf("/*Bit8u GreenFieldPosition*/ %d,\n", g_pos); + printf("/*Bit8u BlueMaskSize*/ %d,\n", b_size); + printf("/*Bit8u BlueFieldPosition*/ %d,\n", b_pos); + printf("/*Bit8u RsvdMaskSize*/ %d,\n", a_size); + printf("/*Bit8u RsvdFieldPosition*/ %d,\n", a_pos); + printf("/*Bit8u DirectColorModeInfo*/ %d,\n", 0); ++// Mandatory information for VBE 2.0 and above+ printf("/*Bit32u PhysBasePtr*/ %s,\n", + "VBE_DISPI_LFB_PHYSICAL_ADDRESS");+ printf("/*Bit32u OffScreenMemOffset*/ %d,\n", 0);+ printf("/*Bit16u OffScreenMemSize*/ %d,\n", 0);+ // Mandatory information for VBE 3.0 and above+ printf("/*Bit16u LinBytesPerScanLine*/ %d,\n", pitch);+ printf("/*Bit8u BnkNumberOfPages*/ %d,\n", 0);+ printf("/*Bit8u LinNumberOfPages*/ %d,\n", 0);+ printf("/*Bit8u LinRedMaskSize*/ %d,\n", r_size);+ printf("/*Bit8u LinRedFieldPosition*/ %d,\n", r_pos);+ printf("/*Bit8u LinGreenMaskSize*/ %d,\n", g_size);+ printf("/*Bit8u LinGreenFieldPosition*/ %d,\n", g_pos);+ printf("/*Bit8u LinBlueMaskSize*/ %d,\n", b_size);+ printf("/*Bit8u LinBlueFieldPosition*/ %d,\n", b_pos);+ printf("/*Bit8u LinRsvdMaskSize*/ %d,\n", a_size);+ printf("/*Bit8u LinRsvdFieldPosition*/ %d,\n", a_pos);+ printf("/*Bit32u MaxPixelClock*/ %d,\n", 0);+ printf("} },\n");+ }+ printf("{ VBE_VESA_MODE_END_OF_LIST,\n");+ printf("{ 0,\n");+ printf("} },\n");+ printf("};\n");+ return 0;+}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -