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

📄 vga.c

📁 qemu虚拟机代码
💻 C
📖 第 1 页 / 共 4 页
字号:
                y_start = y;            if (page0 < page_min)                page_min = page0;            if (page1 > page_max)                page_max = page1;            vga_draw_line(s, d, s->vram_ptr + addr, width);            if (s->cursor_draw_line)                s->cursor_draw_line(s, d, y);        } else {            if (y_start >= 0) {                /* flush to display */                dpy_update(s->ds, 0, y_start,                            disp_width, y - y_start);                y_start = -1;            }        }        if (!multi_run) {            mask = (s->cr[0x17] & 3) ^ 3;            if ((y1 & mask) == mask)                addr1 += line_offset;            y1++;            multi_run = multi_scan;        } else {            multi_run--;        }        /* line compare acts on the displayed lines */        if (y == s->line_compare)            addr1 = 0;        d += linesize;    }    if (y_start >= 0) {        /* flush to display */        dpy_update(s->ds, 0, y_start,                    disp_width, y - y_start);    }    /* reset modified pages */    if (page_max != -1) {        cpu_physical_memory_reset_dirty(page_min, page_max + TARGET_PAGE_SIZE,                                        VGA_DIRTY_FLAG);    }    memset(s->invalidated_y_table, 0, ((height + 31) >> 5) * 4);}static void vga_draw_blank(VGAState *s, int full_update){    int i, w, val;    uint8_t *d;    if (!full_update)        return;    if (s->last_scr_width <= 0 || s->last_scr_height <= 0)        return;    if (s->ds->depth == 8)         val = s->rgb_to_pixel(0, 0, 0);    else        val = 0;    w = s->last_scr_width * ((s->ds->depth + 7) >> 3);    d = s->ds->data;    for(i = 0; i < s->last_scr_height; i++) {        memset(d, val, w);        d += s->ds->linesize;    }    dpy_update(s->ds, 0, 0,                s->last_scr_width, s->last_scr_height);}#define GMODE_TEXT     0#define GMODE_GRAPH    1#define GMODE_BLANK 2 static void vga_update_display(void *opaque){    VGAState *s = (VGAState *)opaque;    int full_update, graphic_mode;    if (s->ds->depth == 0) {        /* nothing to do */    } else {        switch(s->ds->depth) {        case 8:            s->rgb_to_pixel = rgb_to_pixel8_dup;            break;        case 15:            s->rgb_to_pixel = rgb_to_pixel15_dup;            break;        default:        case 16:            s->rgb_to_pixel = rgb_to_pixel16_dup;            break;        case 32:            s->rgb_to_pixel = rgb_to_pixel32_dup;            break;        }                full_update = 0;        if (!(s->ar_index & 0x20)) {            graphic_mode = GMODE_BLANK;        } else {            graphic_mode = s->gr[6] & 1;        }        if (graphic_mode != s->graphic_mode) {            s->graphic_mode = graphic_mode;            full_update = 1;        }        switch(graphic_mode) {        case GMODE_TEXT:            vga_draw_text(s, full_update);            break;        case GMODE_GRAPH:            vga_draw_graphic(s, full_update);            break;        case GMODE_BLANK:        default:            vga_draw_blank(s, full_update);            break;        }    }}/* force a full display refresh */static void vga_invalidate_display(void *opaque){    VGAState *s = (VGAState *)opaque;        s->last_width = -1;    s->last_height = -1;}static void vga_reset(VGAState *s){    memset(s, 0, sizeof(VGAState));    s->graphic_mode = -1; /* force full update */}static CPUReadMemoryFunc *vga_mem_read[3] = {    vga_mem_readb,    vga_mem_readw,    vga_mem_readl,};static CPUWriteMemoryFunc *vga_mem_write[3] = {    vga_mem_writeb,    vga_mem_writew,    vga_mem_writel,};static void vga_save(QEMUFile *f, void *opaque){    VGAState *s = opaque;    int i;    qemu_put_be32s(f, &s->latch);    qemu_put_8s(f, &s->sr_index);    qemu_put_buffer(f, s->sr, 8);    qemu_put_8s(f, &s->gr_index);    qemu_put_buffer(f, s->gr, 16);    qemu_put_8s(f, &s->ar_index);    qemu_put_buffer(f, s->ar, 21);    qemu_put_be32s(f, &s->ar_flip_flop);    qemu_put_8s(f, &s->cr_index);    qemu_put_buffer(f, s->cr, 256);    qemu_put_8s(f, &s->msr);    qemu_put_8s(f, &s->fcr);    qemu_put_8s(f, &s->st00);    qemu_put_8s(f, &s->st01);    qemu_put_8s(f, &s->dac_state);    qemu_put_8s(f, &s->dac_sub_index);    qemu_put_8s(f, &s->dac_read_index);    qemu_put_8s(f, &s->dac_write_index);    qemu_put_buffer(f, s->dac_cache, 3);    qemu_put_buffer(f, s->palette, 768);    qemu_put_be32s(f, &s->bank_offset);#ifdef CONFIG_BOCHS_VBE    qemu_put_byte(f, 1);    qemu_put_be16s(f, &s->vbe_index);    for(i = 0; i < VBE_DISPI_INDEX_NB; i++)        qemu_put_be16s(f, &s->vbe_regs[i]);    qemu_put_be32s(f, &s->vbe_start_addr);    qemu_put_be32s(f, &s->vbe_line_offset);    qemu_put_be32s(f, &s->vbe_bank_mask);#else    qemu_put_byte(f, 0);#endif}static int vga_load(QEMUFile *f, void *opaque, int version_id){    VGAState *s = opaque;    int is_vbe, i;    if (version_id != 1)        return -EINVAL;    qemu_get_be32s(f, &s->latch);    qemu_get_8s(f, &s->sr_index);    qemu_get_buffer(f, s->sr, 8);    qemu_get_8s(f, &s->gr_index);    qemu_get_buffer(f, s->gr, 16);    qemu_get_8s(f, &s->ar_index);    qemu_get_buffer(f, s->ar, 21);    qemu_get_be32s(f, &s->ar_flip_flop);    qemu_get_8s(f, &s->cr_index);    qemu_get_buffer(f, s->cr, 256);    qemu_get_8s(f, &s->msr);    qemu_get_8s(f, &s->fcr);    qemu_get_8s(f, &s->st00);    qemu_get_8s(f, &s->st01);    qemu_get_8s(f, &s->dac_state);    qemu_get_8s(f, &s->dac_sub_index);    qemu_get_8s(f, &s->dac_read_index);    qemu_get_8s(f, &s->dac_write_index);    qemu_get_buffer(f, s->dac_cache, 3);    qemu_get_buffer(f, s->palette, 768);    qemu_get_be32s(f, &s->bank_offset);    is_vbe = qemu_get_byte(f);#ifdef CONFIG_BOCHS_VBE    if (!is_vbe)        return -EINVAL;    qemu_get_be16s(f, &s->vbe_index);    for(i = 0; i < VBE_DISPI_INDEX_NB; i++)        qemu_get_be16s(f, &s->vbe_regs[i]);    qemu_get_be32s(f, &s->vbe_start_addr);    qemu_get_be32s(f, &s->vbe_line_offset);    qemu_get_be32s(f, &s->vbe_bank_mask);#else    if (is_vbe)        return -EINVAL;#endif    /* force refresh */    s->graphic_mode = -1;    return 0;}static void vga_map(PCIDevice *pci_dev, int region_num,                     uint32_t addr, uint32_t size, int type){    VGAState *s = vga_state;    if (region_num == PCI_ROM_SLOT) {        cpu_register_physical_memory(addr, s->bios_size, s->bios_offset);    } else {        cpu_register_physical_memory(addr, s->vram_size, s->vram_offset);    }}void vga_common_init(VGAState *s, DisplayState *ds, uint8_t *vga_ram_base,                      unsigned long vga_ram_offset, int vga_ram_size){    int i, j, v, b;    for(i = 0;i < 256; i++) {        v = 0;        for(j = 0; j < 8; j++) {            v |= ((i >> j) & 1) << (j * 4);        }        expand4[i] = v;        v = 0;        for(j = 0; j < 4; j++) {            v |= ((i >> (2 * j)) & 3) << (j * 4);        }        expand2[i] = v;    }    for(i = 0; i < 16; i++) {        v = 0;        for(j = 0; j < 4; j++) {            b = ((i >> j) & 1);            v |= b << (2 * j);            v |= b << (2 * j + 1);        }        expand4to8[i] = v;    }    vga_reset(s);    s->vram_ptr = vga_ram_base;    s->vram_offset = vga_ram_offset;    s->vram_size = vga_ram_size;    s->ds = ds;    s->get_bpp = vga_get_bpp;    s->get_offsets = vga_get_offsets;    s->get_resolution = vga_get_resolution;    graphic_console_init(s->ds, vga_update_display, vga_invalidate_display,                         vga_screen_dump, s);    /* XXX: currently needed for display */    vga_state = s;}int vga_initialize(PCIBus *bus, DisplayState *ds, uint8_t *vga_ram_base,                    unsigned long vga_ram_offset, int vga_ram_size,                   unsigned long vga_bios_offset, int vga_bios_size){    VGAState *s;    s = qemu_mallocz(sizeof(VGAState));    if (!s)        return -1;    vga_common_init(s, ds, vga_ram_base, vga_ram_offset, vga_ram_size);    register_savevm("vga", 0, 1, vga_save, vga_load, s);    register_ioport_write(0x3c0, 16, 1, vga_ioport_write, s);    register_ioport_write(0x3b4, 2, 1, vga_ioport_write, s);    register_ioport_write(0x3d4, 2, 1, vga_ioport_write, s);    register_ioport_write(0x3ba, 1, 1, vga_ioport_write, s);    register_ioport_write(0x3da, 1, 1, vga_ioport_write, s);    register_ioport_read(0x3c0, 16, 1, vga_ioport_read, s);    register_ioport_read(0x3b4, 2, 1, vga_ioport_read, s);    register_ioport_read(0x3d4, 2, 1, vga_ioport_read, s);    register_ioport_read(0x3ba, 1, 1, vga_ioport_read, s);    register_ioport_read(0x3da, 1, 1, vga_ioport_read, s);    s->bank_offset = 0;#ifdef CONFIG_BOCHS_VBE    s->vbe_regs[VBE_DISPI_INDEX_ID] = VBE_DISPI_ID0;    s->vbe_bank_mask = ((s->vram_size >> 16) - 1);#if defined (TARGET_I386)    register_ioport_read(0x1ce, 1, 2, vbe_ioport_read_index, s);    register_ioport_read(0x1cf, 1, 2, vbe_ioport_read_data, s);    register_ioport_write(0x1ce, 1, 2, vbe_ioport_write_index, s);    register_ioport_write(0x1cf, 1, 2, vbe_ioport_write_data, s);    /* old Bochs IO ports */    register_ioport_read(0xff80, 1, 2, vbe_ioport_read_index, s);    register_ioport_read(0xff81, 1, 2, vbe_ioport_read_data, s);    register_ioport_write(0xff80, 1, 2, vbe_ioport_write_index, s);    register_ioport_write(0xff81, 1, 2, vbe_ioport_write_data, s); #else    register_ioport_read(0x1ce, 1, 2, vbe_ioport_read_index, s);    register_ioport_read(0x1d0, 1, 2, vbe_ioport_read_data, s);    register_ioport_write(0x1ce, 1, 2, vbe_ioport_write_index, s);    register_ioport_write(0x1d0, 1, 2, vbe_ioport_write_data, s);#endif#endif /* CONFIG_BOCHS_VBE */    vga_io_memory = cpu_register_io_memory(0, vga_mem_read, vga_mem_write, s);    cpu_register_physical_memory(isa_mem_base + 0x000a0000, 0x20000,                                  vga_io_memory);    if (bus) {        PCIDevice *d;        uint8_t *pci_conf;        d = pci_register_device(bus, "VGA",                                 sizeof(PCIDevice),                                -1, NULL, NULL);        pci_conf = d->config;        pci_conf[0x00] = 0x34; // dummy VGA (same as Bochs ID)        pci_conf[0x01] = 0x12;        pci_conf[0x02] = 0x11;        pci_conf[0x03] = 0x11;        pci_conf[0x0a] = 0x00; // VGA controller         pci_conf[0x0b] = 0x03;        pci_conf[0x0e] = 0x00; // header_type        /* XXX: vga_ram_size must be a power of two */        pci_register_io_region(d, 0, vga_ram_size,                                PCI_ADDRESS_SPACE_MEM_PREFETCH, vga_map);        if (vga_bios_size != 0) {            unsigned int bios_total_size;            s->bios_offset = vga_bios_offset;            s->bios_size = vga_bios_size;            /* must be a power of two */            bios_total_size = 1;            while (bios_total_size < vga_bios_size)                bios_total_size <<= 1;            pci_register_io_region(d, PCI_ROM_SLOT, bios_total_size,                                    PCI_ADDRESS_SPACE_MEM_PREFETCH, vga_map);        }    } else {#ifdef CONFIG_BOCHS_VBE        /* XXX: use optimized standard vga accesses */        cpu_register_physical_memory(VBE_DISPI_LFB_PHYSICAL_ADDRESS,                                      vga_ram_size, vga_ram_offset);#endif    }    return 0;}/********************************************************//* vga screen dump */static int vga_save_w, vga_save_h;static void vga_save_dpy_update(DisplayState *s,                                 int x, int y, int w, int h){}static void vga_save_dpy_resize(DisplayState *s, int w, int h){    s->linesize = w * 4;    s->data = qemu_malloc(h * s->linesize);    vga_save_w = w;    vga_save_h = h;}static void vga_save_dpy_refresh(DisplayState *s){}static int ppm_save(const char *filename, uint8_t *data,                     int w, int h, int linesize){    FILE *f;    uint8_t *d, *d1;    unsigned int v;    int y, x;    f = fopen(filename, "wb");    if (!f)        return -1;    fprintf(f, "P6\n%d %d\n%d\n",            w, h, 255);    d1 = data;    for(y = 0; y < h; y++) {        d = d1;        for(x = 0; x < w; x++) {            v = *(uint32_t *)d;            fputc((v >> 16) & 0xff, f);            fputc((v >> 8) & 0xff, f);            fputc((v) & 0xff, f);            d += 4;        }        d1 += linesize;    }    fclose(f);    return 0;}/* save the vga display in a PPM image even if no display is   available */static void vga_screen_dump(void *opaque, const char *filename){    VGAState *s = (VGAState *)opaque;    DisplayState *saved_ds, ds1, *ds = &ds1;        /* XXX: this is a little hackish */    vga_invalidate_display(s);    saved_ds = s->ds;    memset(ds, 0, sizeof(DisplayState));    ds->dpy_update = vga_save_dpy_update;    ds->dpy_resize = vga_save_dpy_resize;    ds->dpy_refresh = vga_save_dpy_refresh;    ds->depth = 32;    s->ds = ds;    s->graphic_mode = -1;    vga_update_display(s);        if (ds->data) {        ppm_save(filename, ds->data, vga_save_w, vga_save_h,                  s->ds->linesize);        qemu_free(ds->data);    }    s->ds = saved_ds;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -