⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vgabios.diff

📁 xen虚拟机源代码安装包
💻 DIFF
📖 第 1 页 / 共 2 页
字号:
  // ---------------------------------------------------------------------------------------------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 + -