From d2d7c65e37047d8b44be25e2da349c3e4c4f790f Mon Sep 17 00:00:00 2001 From: Volker Ruppert Date: Fri, 18 Aug 2006 15:43:20 +0000 Subject: [PATCH] - VGA memory is now a part of the common video memory (same as real hardware) - sequencer map mask bit handling simplified - some save/restore data format changes --- bochs/iodev/svga_cirrus.cc | 67 +++++++--------- bochs/iodev/svga_cirrus.h | 4 +- bochs/iodev/vga.cc | 155 ++++++++++++++++++------------------- bochs/iodev/vga.h | 7 +- 4 files changed, 108 insertions(+), 125 deletions(-) diff --git a/bochs/iodev/svga_cirrus.cc b/bochs/iodev/svga_cirrus.cc index 19f72cde0..df8fadf11 100644 --- a/bochs/iodev/svga_cirrus.cc +++ b/bochs/iodev/svga_cirrus.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: svga_cirrus.cc,v 1.33 2006-05-29 22:33:38 sshwarts Exp $ +// $Id: svga_cirrus.cc,v 1.34 2006-08-18 15:43:19 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004 Makoto Suzuki (suzu) @@ -236,15 +236,9 @@ void libvga_LTX_plugin_fini(void) bx_svga_cirrus_c::bx_svga_cirrus_c() : bx_vga_c () { put("CLVGA"); - vidmem = NULL; } -bx_svga_cirrus_c::~bx_svga_cirrus_c() -{ - if (vidmem != NULL) { - delete [] vidmem; - } -} +bx_svga_cirrus_c::~bx_svga_cirrus_c() {} void bx_svga_cirrus_c::init(void) { @@ -321,8 +315,8 @@ void bx_svga_cirrus_c::svga_init_members() BX_CIRRUS_THIS hw_cursor.size = 0; // memory allocation. - if (BX_CIRRUS_THIS vidmem == NULL) - BX_CIRRUS_THIS vidmem = new Bit8u[CIRRUS_VIDEO_MEMORY_BYTES]; + if (BX_CIRRUS_THIS s.memory == NULL) + BX_CIRRUS_THIS s.memory = new Bit8u[CIRRUS_VIDEO_MEMORY_BYTES]; // set some registers. @@ -336,7 +330,7 @@ void bx_svga_cirrus_c::svga_init_members() BX_CIRRUS_THIS sequencer.reg[0x0F] = 0x98; BX_CIRRUS_THIS sequencer.reg[0x17] = CIRRUS_BUSTYPE_PCI; BX_CIRRUS_THIS sequencer.reg[0x15] = 0x04; // memory size 4MB - BX_CIRRUS_THIS memsize = (4 << 20); + BX_CIRRUS_THIS s.memsize = (4 << 20); } else #endif { @@ -345,14 +339,14 @@ void bx_svga_cirrus_c::svga_init_members() BX_CIRRUS_THIS sequencer.reg[0x0F] = CIRRUS_MEMSIZE_2M; BX_CIRRUS_THIS sequencer.reg[0x17] = CIRRUS_BUSTYPE_ISA; BX_CIRRUS_THIS sequencer.reg[0x15] = 0x03; // memory size 2MB - BX_CIRRUS_THIS memsize = (2 << 20); + BX_CIRRUS_THIS s.memsize = (2 << 20); } BX_CIRRUS_THIS hidden_dac.lockindex = 5; BX_CIRRUS_THIS hidden_dac.data = 0; - memset(BX_CIRRUS_THIS vidmem, 0xff, CIRRUS_VIDEO_MEMORY_BYTES); - BX_CIRRUS_THIS disp_ptr = BX_CIRRUS_THIS vidmem; + memset(BX_CIRRUS_THIS s.memory, 0xff, CIRRUS_VIDEO_MEMORY_BYTES); + BX_CIRRUS_THIS disp_ptr = BX_CIRRUS_THIS s.memory; } void bx_svga_cirrus_c::reset(unsigned type) @@ -373,7 +367,7 @@ void bx_svga_cirrus_c::register_state(void) char name[6]; bx_list_c *reg; - if (BX_CIRRUS_THIS vidmem != NULL) { + if (!strcmp(SIM->get_param_string(BXPN_VGA_EXTENSION)->getptr(), "cirrus")) { bx_list_c *list = new bx_list_c(SIM->get_sr_root(), "svga_cirrus", "Cirrus SVGA State", 18); bx_list_c *crtc = new bx_list_c(list, "crtc"); new bx_shadow_num_c(crtc, "index", &BX_CIRRUS_THIS crtc.index, BASE_HEX); @@ -420,7 +414,6 @@ void bx_svga_cirrus_c::register_state(void) new bx_shadow_num_c(cursor, "x", &BX_CIRRUS_THIS hw_cursor.x, BASE_HEX); new bx_shadow_num_c(cursor, "y", &BX_CIRRUS_THIS hw_cursor.y, BASE_HEX); new bx_shadow_num_c(cursor, "size", &BX_CIRRUS_THIS hw_cursor.size, BASE_HEX); - new bx_shadow_data_c(list, "vidmem", BX_CIRRUS_THIS vidmem, BX_CIRRUS_THIS memsize); #if BX_SUPPORT_PCI && BX_SUPPORT_CLGD54XX_PCI if (BX_CIRRUS_THIS pci_enabled) { bx_list_c *pci_conf = new bx_list_c(list, "pci_conf", 256); @@ -512,7 +505,7 @@ void bx_svga_cirrus_c::mem_write_mode4and5_8bpp(Bit8u mode, Bit32u offset, Bit8u Bit8u val = value; Bit8u *dst; - dst = BX_CIRRUS_THIS vidmem + offset; + dst = BX_CIRRUS_THIS s.memory + offset; for (int x = 0; x < 8; x++) { if (val & 0x80) { *dst = BX_CIRRUS_THIS control.shadow_reg1; @@ -529,7 +522,7 @@ void bx_svga_cirrus_c::mem_write_mode4and5_16bpp(Bit8u mode, Bit32u offset, Bit8 Bit8u val = value; Bit8u *dst; - dst = BX_CIRRUS_THIS vidmem + offset; + dst = BX_CIRRUS_THIS s.memory + offset; for (int x = 0; x < 8; x++) { if (val & 0x80) { *dst = BX_CIRRUS_THIS control.shadow_reg1; @@ -594,7 +587,7 @@ Bit8u bx_svga_cirrus_c::mem_read(Bit32u addr) } } - ptr = BX_CIRRUS_THIS vidmem; + ptr = BX_CIRRUS_THIS s.memory; offset = addr - BX_CIRRUS_THIS pci_memaddr; if ((BX_CIRRUS_THIS control.reg[0x0b] & 0x14) == 0x14) { offset <<= 4; @@ -650,8 +643,8 @@ Bit8u bx_svga_cirrus_c::mem_read(Bit32u addr) } else if (BX_CIRRUS_THIS control.reg[0x0b] & 0x02) { offset <<= 3; } - offset &= (BX_CIRRUS_THIS memsize - 1); - return *(BX_CIRRUS_THIS vidmem + offset); + offset &= (BX_CIRRUS_THIS s.memsize - 1); + return *(BX_CIRRUS_THIS s.memory + offset); } else { return 0xff; @@ -728,7 +721,7 @@ void bx_svga_cirrus_c::mem_write(Bit32u addr, Bit8u value) } mode = BX_CIRRUS_THIS control.reg[0x05] & 0x07; if ((mode < 4) || (mode > 5) || ((BX_CIRRUS_THIS control.reg[0x0b] & 0x4) == 0)) { - *(BX_CIRRUS_THIS vidmem + offset) = value; + *(BX_CIRRUS_THIS s.memory + offset) = value; } else { if ((BX_CIRRUS_THIS control.reg[0x0b] & 0x14) != 0x14) { mem_write_mode4and5_8bpp(mode, offset, value); @@ -785,10 +778,10 @@ void bx_svga_cirrus_c::mem_write(Bit32u addr, Bit8u value) } else if (BX_CIRRUS_THIS control.reg[0x0b] & 0x02) { offset <<= 3; } - offset &= (BX_CIRRUS_THIS memsize - 1); + offset &= (BX_CIRRUS_THIS s.memsize - 1); mode = BX_CIRRUS_THIS control.reg[0x05] & 0x07; if ((mode < 4) || (mode > 5) || ((BX_CIRRUS_THIS control.reg[0x0b] & 0x4) == 0)) { - *(BX_CIRRUS_THIS vidmem + offset) = value; + *(BX_CIRRUS_THIS s.memory + offset) = value; } else { if ((BX_CIRRUS_THIS control.reg[0x0b] & 0x14) != 0x14) { mem_write_mode4and5_8bpp(mode, offset, value); @@ -1088,7 +1081,7 @@ void bx_svga_cirrus_c::svga_modeupdate(void) BX_CIRRUS_THIS svga_yres = iHeight; BX_CIRRUS_THIS svga_bpp = iBpp; BX_CIRRUS_THIS svga_dispbpp = iDispBpp; - BX_CIRRUS_THIS disp_ptr = BX_CIRRUS_THIS vidmem + iTopOffset; + BX_CIRRUS_THIS disp_ptr = BX_CIRRUS_THIS s.memory + iTopOffset; } void bx_svga_cirrus_c::draw_hardware_cursor(unsigned xc, unsigned yc, bx_svga_tileinfo_t *info) @@ -1115,7 +1108,7 @@ void bx_svga_cirrus_c::draw_hardware_cursor(unsigned xc, unsigned yc, bx_svga_ti if (info->bpp == 15) info->bpp = 16; tile_ptr = bx_gui->graphics_tile_get(xc, yc, &w, &h) + info->pitch * (cy0 - yc) + (info->bpp / 8) * (cx0 - xc); - plane0_ptr = BX_CIRRUS_THIS vidmem + BX_CIRRUS_THIS memsize - 16384; + plane0_ptr = BX_CIRRUS_THIS s.memory + BX_CIRRUS_THIS s.memsize - 16384; switch (BX_CIRRUS_THIS hw_cursor.size) { case 32: @@ -1531,11 +1524,11 @@ void bx_svga_cirrus_c::update_bank_ptr(Bit8u bank_index) else offset <<= 12; - if (BX_CIRRUS_THIS memsize <= offset) { + if (BX_CIRRUS_THIS s.memsize <= offset) { limit = 0; BX_ERROR(("bank offset %08x is invalid",offset)); } else { - limit = BX_CIRRUS_THIS memsize - offset; + limit = BX_CIRRUS_THIS s.memsize - offset; } if (!BX_CIRRUS_THIS banking_is_dual() && (bank_index != 0)) { @@ -2504,14 +2497,14 @@ void bx_svga_cirrus_c::svga_bitblt() ReadHostWordFromLittleEndian(&BX_CIRRUS_THIS control.reg[0x26],tmp16); BX_CIRRUS_THIS bitblt.srcpitch = (int)tmp16 & (int)0x1fff; ReadHostDWordFromLittleEndian(&BX_CIRRUS_THIS control.reg[0x28],tmp32); - dstaddr = tmp32 & (BX_CIRRUS_THIS memsize - 1); + dstaddr = tmp32 & (BX_CIRRUS_THIS s.memsize - 1); ReadHostDWordFromLittleEndian(&BX_CIRRUS_THIS control.reg[0x2c],tmp32); - srcaddr = tmp32 & (BX_CIRRUS_THIS memsize - 1); + srcaddr = tmp32 & (BX_CIRRUS_THIS s.memsize - 1); BX_CIRRUS_THIS bitblt.srcaddr = srcaddr; BX_CIRRUS_THIS bitblt.bltmode = BX_CIRRUS_THIS control.reg[0x30]; BX_CIRRUS_THIS bitblt.bltmodeext = BX_CIRRUS_THIS control.reg[0x33]; BX_CIRRUS_THIS bitblt.bltrop = BX_CIRRUS_THIS control.reg[0x32]; - offset = dstaddr - (BX_CIRRUS_THIS disp_ptr - BX_CIRRUS_THIS vidmem); + offset = dstaddr - (BX_CIRRUS_THIS disp_ptr - BX_CIRRUS_THIS s.memory); BX_CIRRUS_THIS redraw.x = (offset % BX_CIRRUS_THIS bitblt.dstpitch) / (BX_CIRRUS_THIS svga_bpp >> 3); BX_CIRRUS_THIS redraw.y = offset / BX_CIRRUS_THIS bitblt.dstpitch; BX_CIRRUS_THIS redraw.w = BX_CIRRUS_THIS bitblt.bltwidth / (BX_CIRRUS_THIS svga_bpp >> 3); @@ -2561,7 +2554,7 @@ void bx_svga_cirrus_c::svga_bitblt() CIRRUS_BLTMODE_COLOREXPAND)) == (CIRRUS_BLTMODE_PATTERNCOPY | CIRRUS_BLTMODE_COLOREXPAND)) { BX_CIRRUS_THIS bitblt.rop_handler = svga_get_fwd_rop_handler(BX_CIRRUS_THIS bitblt.bltrop); - BX_CIRRUS_THIS bitblt.dst = BX_CIRRUS_THIS vidmem + dstaddr; + BX_CIRRUS_THIS bitblt.dst = BX_CIRRUS_THIS s.memory + dstaddr; svga_solidfill(); } else { @@ -2601,7 +2594,7 @@ void bx_svga_cirrus_c::svga_setup_bitblt_cputovideo(Bit32u dstaddr,Bit32u srcadd BX_CIRRUS_THIS bitblt.bltmode &= ~CIRRUS_BLTMODE_MEMSYSSRC; - BX_CIRRUS_THIS bitblt.dst = BX_CIRRUS_THIS vidmem + dstaddr; + BX_CIRRUS_THIS bitblt.dst = BX_CIRRUS_THIS s.memory + dstaddr; BX_CIRRUS_THIS bitblt.src = NULL; BX_CIRRUS_THIS bitblt.memsrc_ptr = &BX_CIRRUS_THIS bitblt.memsrc[0]; @@ -2646,7 +2639,7 @@ void bx_svga_cirrus_c::svga_setup_bitblt_videotocpu(Bit32u dstaddr,Bit32u srcadd #if 0 BX_CIRRUS_THIS bitblt.dst = NULL; - BX_CIRRUS_THIS bitblt.src = BX_CIRRUS_THIS vidmem + srcaddr; + BX_CIRRUS_THIS bitblt.src = BX_CIRRUS_THIS s.memory + srcaddr; BX_CIRRUS_THIS bitblt.memdst_ptr = &BX_CIRRUS_THIS bitblt.memdst[0]; BX_CIRRUS_THIS bitblt.memdst_endptr = &BX_CIRRUS_THIS bitblt.memdst[0]; @@ -2666,14 +2659,14 @@ void bx_svga_cirrus_c::svga_setup_bitblt_videotocpu(Bit32u dstaddr,Bit32u srcadd void bx_svga_cirrus_c::svga_setup_bitblt_videotovideo(Bit32u dstaddr,Bit32u srcaddr) { - BX_CIRRUS_THIS bitblt.dst = BX_CIRRUS_THIS vidmem + dstaddr; + BX_CIRRUS_THIS bitblt.dst = BX_CIRRUS_THIS s.memory + dstaddr; if (BX_CIRRUS_THIS bitblt.bltmode & CIRRUS_BLTMODE_PATTERNCOPY) { BX_CIRRUS_THIS bitblt.bitblt_ptr = svga_patterncopy_static; - BX_CIRRUS_THIS bitblt.src = BX_CIRRUS_THIS vidmem + (srcaddr & ~0x07); + BX_CIRRUS_THIS bitblt.src = BX_CIRRUS_THIS s.memory + (srcaddr & ~0x07); } else { BX_CIRRUS_THIS bitblt.bitblt_ptr = svga_simplebitblt_static; - BX_CIRRUS_THIS bitblt.src = BX_CIRRUS_THIS vidmem + srcaddr; + BX_CIRRUS_THIS bitblt.src = BX_CIRRUS_THIS s.memory + srcaddr; } (*BX_CIRRUS_THIS bitblt.bitblt_ptr)(); diff --git a/bochs/iodev/svga_cirrus.h b/bochs/iodev/svga_cirrus.h index 2ab528506..ea3d7e8a7 100644 --- a/bochs/iodev/svga_cirrus.h +++ b/bochs/iodev/svga_cirrus.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: svga_cirrus.h,v 1.9 2006-05-27 15:54:49 sshwarts Exp $ +// $Id: svga_cirrus.h,v 1.10 2006-08-18 15:43:20 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (c) 2004 Makoto Suzuki (suzu) @@ -205,10 +205,8 @@ private: unsigned svga_bpp; unsigned svga_dispbpp; - Bit8u *vidmem; Bit32u bank_base[2]; Bit32u bank_limit[2]; - Bit32u memsize; Bit8u *disp_ptr; #if BX_SUPPORT_PCI && BX_SUPPORT_CLGD54XX_PCI bx_bool pci_enabled; diff --git a/bochs/iodev/vga.cc b/bochs/iodev/vga.cc index 9c2ff9bcc..7af9cd850 100644 --- a/bochs/iodev/vga.cc +++ b/bochs/iodev/vga.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: vga.cc,v 1.136 2006-08-17 17:06:08 vruppert Exp $ +// $Id: vga.cc,v 1.137 2006-08-18 15:43:20 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2002 MandrakeSoft S.A. @@ -108,18 +108,14 @@ bx_vga_c::bx_vga_c() s.x_tilesize = X_TILESIZE; s.y_tilesize = Y_TILESIZE; timer_id = BX_NULL_TIMER_HANDLE; -#if BX_SUPPORT_VBE - s.vbe_memory = NULL; -#endif + s.memory = NULL; } bx_vga_c::~bx_vga_c() { -#if BX_SUPPORT_VBE - if (s.vbe_memory != NULL) { - delete [] s.vbe_memory; + if (s.memory != NULL) { + delete [] s.memory; } -#endif } void bx_vga_c::init(void) @@ -133,6 +129,7 @@ void bx_vga_c::init(void) char *argv[16]; char *ptr; char string[512]; + char *extname; #if BX_SUPPORT_VBE unsigned addr; #endif @@ -215,9 +212,6 @@ void bx_vga_c::init(void) BX_VGA_THIS s.sequencer.index = 0; BX_VGA_THIS s.sequencer.map_mask = 0; - for (i=0; i<4; i++) { - BX_VGA_THIS s.sequencer.map_mask_bit[i] = 0; - } BX_VGA_THIS s.sequencer.reset1 = 1; BX_VGA_THIS s.sequencer.reset2 = 1; BX_VGA_THIS s.sequencer.reg1 = 0; @@ -226,7 +220,13 @@ void bx_vga_c::init(void) BX_VGA_THIS s.sequencer.odd_even = 1; // use sequential addressing mode BX_VGA_THIS s.sequencer.chain_four = 0; // use map mask & read map select - memset(BX_VGA_THIS s.vga_memory, 0, sizeof(BX_VGA_THIS s.vga_memory)); + extname = SIM->get_param_string(BXPN_VGA_EXTENSION)->getptr(); + if ((strlen(extname) == 0) || (!strcmp(extname, "none"))) { + BX_VGA_THIS s.memsize = 0x40000; + if (BX_VGA_THIS s.memory == NULL) + BX_VGA_THIS s.memory = new Bit8u[BX_VGA_THIS s.memsize]; + memset(BX_VGA_THIS s.memory, 0, BX_VGA_THIS s.memsize); + } BX_VGA_THIS s.vga_mem_updated = 0; for (y=0; y<480/Y_TILESIZE; y++) @@ -283,7 +283,7 @@ void bx_vga_c::init(void) BX_VGA_THIS s.vbe_enabled=0; BX_VGA_THIS s.vbe_8bit_dac=0; - if (!strcmp(SIM->get_param_string(BXPN_VGA_EXTENSION)->getptr(), "vbe")) { + if (!strcmp(extname, "vbe")) { for (addr=VBE_DISPI_IOPORT_INDEX; addr<=VBE_DISPI_IOPORT_DATA; addr++) { DEV_register_ioread_handler(this, vbe_read_handler, addr, "vga video", 7); DEV_register_iowrite_handler(this, vbe_write_handler, addr, "vga video", 7); @@ -298,9 +298,10 @@ void bx_vga_c::init(void) VBE_DISPI_LFB_PHYSICAL_ADDRESS, VBE_DISPI_LFB_PHYSICAL_ADDRESS + VBE_DISPI_TOTAL_VIDEO_MEMORY_BYTES - 1); - if (BX_VGA_THIS s.vbe_memory == NULL) - BX_VGA_THIS s.vbe_memory = new Bit8u[VBE_DISPI_TOTAL_VIDEO_MEMORY_BYTES]; - memset(BX_VGA_THIS s.vbe_memory, 0, VBE_DISPI_TOTAL_VIDEO_MEMORY_BYTES); + if (BX_VGA_THIS s.memory == NULL) + BX_VGA_THIS s.memory = new Bit8u[VBE_DISPI_TOTAL_VIDEO_MEMORY_BYTES]; + memset(BX_VGA_THIS s.memory, 0, VBE_DISPI_TOTAL_VIDEO_MEMORY_BYTES); + BX_VGA_THIS s.memsize = VBE_DISPI_TOTAL_VIDEO_MEMORY_BYTES; BX_VGA_THIS s.vbe_cur_dispi=VBE_DISPI_ID0; BX_VGA_THIS s.vbe_xres=640; BX_VGA_THIS s.vbe_yres=480; @@ -451,7 +452,7 @@ void bx_vga_c::register_state(void) new bx_shadow_num_c(pel, "read_data_register", &BX_VGA_THIS s.pel.read_data_register, BASE_HEX); new bx_shadow_num_c(pel, "read_data_cycle", &BX_VGA_THIS s.pel.read_data_cycle); new bx_shadow_num_c(pel, "dac_state", &BX_VGA_THIS s.pel.dac_state); - new bx_shadow_num_c(pel, "mask", &BX_VGA_THIS s.pel.mask); + new bx_shadow_num_c(pel, "mask", &BX_VGA_THIS s.pel.mask, BASE_HEX); new bx_shadow_data_c(list, "pel_data", &BX_VGA_THIS s.pel.data[0].red, sizeof(BX_VGA_THIS s.pel.data)); bx_list_c *gfxc = new bx_list_c(list, "graphics_ctrl", 20); new bx_shadow_num_c(gfxc, "index", &BX_VGA_THIS s.graphics_ctrl.index); @@ -462,28 +463,24 @@ void bx_vga_c::register_state(void) new bx_shadow_num_c(gfxc, "raster_op", &BX_VGA_THIS s.graphics_ctrl.raster_op); new bx_shadow_num_c(gfxc, "read_map_select", &BX_VGA_THIS s.graphics_ctrl.read_map_select); new bx_shadow_num_c(gfxc, "write_mode", &BX_VGA_THIS s.graphics_ctrl.write_mode); - new bx_shadow_bool_c(gfxc, "read_mode", &BX_VGA_THIS s.graphics_ctrl.read_mode); + new bx_shadow_num_c(gfxc, "read_mode", &BX_VGA_THIS s.graphics_ctrl.read_mode); new bx_shadow_bool_c(gfxc, "odd_even", &BX_VGA_THIS s.graphics_ctrl.odd_even); new bx_shadow_bool_c(gfxc, "chain_odd_even", &BX_VGA_THIS s.graphics_ctrl.chain_odd_even); new bx_shadow_num_c(gfxc, "shift_reg", &BX_VGA_THIS s.graphics_ctrl.shift_reg); new bx_shadow_bool_c(gfxc, "graphics_alpha", &BX_VGA_THIS s.graphics_ctrl.graphics_alpha); new bx_shadow_num_c(gfxc, "memory_mapping", &BX_VGA_THIS s.graphics_ctrl.memory_mapping); - new bx_shadow_num_c(gfxc, "color_dont_care", &BX_VGA_THIS s.graphics_ctrl.color_dont_care); - new bx_shadow_num_c(gfxc, "bitmask", &BX_VGA_THIS s.graphics_ctrl.bitmask); - new bx_shadow_num_c(gfxc, "latch0", &BX_VGA_THIS s.graphics_ctrl.latch[0]); - new bx_shadow_num_c(gfxc, "latch1", &BX_VGA_THIS s.graphics_ctrl.latch[1]); - new bx_shadow_num_c(gfxc, "latch2", &BX_VGA_THIS s.graphics_ctrl.latch[2]); - new bx_shadow_num_c(gfxc, "latch3", &BX_VGA_THIS s.graphics_ctrl.latch[3]); + new bx_shadow_num_c(gfxc, "color_dont_care", &BX_VGA_THIS s.graphics_ctrl.color_dont_care, BASE_HEX); + new bx_shadow_num_c(gfxc, "bitmask", &BX_VGA_THIS s.graphics_ctrl.bitmask, BASE_HEX); + new bx_shadow_num_c(gfxc, "latch0", &BX_VGA_THIS s.graphics_ctrl.latch[0], BASE_HEX); + new bx_shadow_num_c(gfxc, "latch1", &BX_VGA_THIS s.graphics_ctrl.latch[1], BASE_HEX); + new bx_shadow_num_c(gfxc, "latch2", &BX_VGA_THIS s.graphics_ctrl.latch[2], BASE_HEX); + new bx_shadow_num_c(gfxc, "latch3", &BX_VGA_THIS s.graphics_ctrl.latch[3], BASE_HEX); bx_list_c *sequ = new bx_list_c(list, "sequencer", 13); new bx_shadow_num_c(sequ, "index", &BX_VGA_THIS s.sequencer.index); new bx_shadow_num_c(sequ, "map_mask", &BX_VGA_THIS s.sequencer.map_mask); - new bx_shadow_bool_c(sequ, "map_mask_bit0", &BX_VGA_THIS s.sequencer.map_mask_bit[0]); - new bx_shadow_bool_c(sequ, "map_mask_bit1", &BX_VGA_THIS s.sequencer.map_mask_bit[1]); - new bx_shadow_bool_c(sequ, "map_mask_bit2", &BX_VGA_THIS s.sequencer.map_mask_bit[2]); - new bx_shadow_bool_c(sequ, "map_mask_bit3", &BX_VGA_THIS s.sequencer.map_mask_bit[3]); new bx_shadow_bool_c(sequ, "reset1", &BX_VGA_THIS s.sequencer.reset1); new bx_shadow_bool_c(sequ, "reset2", &BX_VGA_THIS s.sequencer.reset2); - new bx_shadow_num_c(sequ, "reg1", &BX_VGA_THIS s.sequencer.reg1); + new bx_shadow_num_c(sequ, "reg1", &BX_VGA_THIS s.sequencer.reg1, BASE_HEX); new bx_shadow_num_c(sequ, "char_map_select", &BX_VGA_THIS s.sequencer.char_map_select); new bx_shadow_bool_c(sequ, "extended_mem", &BX_VGA_THIS s.sequencer.extended_mem); new bx_shadow_bool_c(sequ, "odd_even", &BX_VGA_THIS s.sequencer.odd_even); @@ -496,11 +493,11 @@ void bx_vga_c::register_state(void) new bx_shadow_bool_c(list, "x_dotclockdiv2", &BX_VGA_THIS s.x_dotclockdiv2); new bx_shadow_bool_c(list, "y_doublescan", &BX_VGA_THIS s.y_doublescan); new bx_shadow_num_c(list, "last_bpp", &BX_VGA_THIS s.last_bpp); - new bx_shadow_data_c(list, "memory", BX_VGA_THIS s.vga_memory, sizeof(BX_VGA_THIS s.vga_memory)); + new bx_shadow_data_c(list, "memory", BX_VGA_THIS s.memory, BX_VGA_THIS s.memsize); #if BX_SUPPORT_VBE - if (BX_VGA_THIS s.vbe_memory != NULL) { + if (!strcmp(SIM->get_param_string(BXPN_VGA_EXTENSION)->getptr(), "vbe")) { bx_list_c *vbe = new bx_list_c(list, "vbe", 18); - new bx_shadow_num_c(vbe, "cur_dispi", &BX_VGA_THIS s.vbe_cur_dispi); + new bx_shadow_num_c(vbe, "cur_dispi", &BX_VGA_THIS s.vbe_cur_dispi, BASE_HEX); new bx_shadow_num_c(vbe, "xres", &BX_VGA_THIS s.vbe_xres); new bx_shadow_num_c(vbe, "yres", &BX_VGA_THIS s.vbe_yres); new bx_shadow_num_c(vbe, "bpp", &BX_VGA_THIS s.vbe_bpp); @@ -517,7 +514,6 @@ void bx_vga_c::register_state(void) new bx_shadow_bool_c(vbe, "lfb_enabled", &BX_VGA_THIS s.vbe_lfb_enabled); new bx_shadow_bool_c(vbe, "get_capabilities", &BX_VGA_THIS s.vbe_get_capabilities); new bx_shadow_bool_c(vbe, "8bit_dac", &BX_VGA_THIS s.vbe_8bit_dac); - new bx_shadow_data_c(vbe, "memory", BX_VGA_THIS s.vbe_memory, VBE_DISPI_TOTAL_VIDEO_MEMORY_BYTES); } #endif } @@ -539,7 +535,7 @@ void bx_vga_c::after_restore_state(void) BX_VGA_THIS s.pel.data[i].blue<<2); } } - bx_gui->set_text_charmap(&BX_VGA_THIS s.vga_memory[0x20000 + BX_VGA_THIS s.charmap_address]); + bx_gui->set_text_charmap(&BX_VGA_THIS s.memory[0x20000 + BX_VGA_THIS s.charmap_address]); old_iWidth = BX_MAX_XRES; old_iHeight = BX_MAX_YRES; BX_VGA_THIS redraw_area(0, 0, BX_MAX_XRES, BX_MAX_YRES); @@ -974,7 +970,6 @@ void bx_vga_c::write_handler_no_log(void *this_ptr, Bit32u address, Bit32u value void bx_vga_c::write(Bit32u address, Bit32u value, unsigned io_len, bx_bool no_log) { - unsigned i; Bit8u charmap1, charmap2, prev_memory_mapping; bx_bool prev_video_enabled, prev_line_graphics, prev_int_pal_size; bx_bool prev_graphics_alpha, prev_chain_odd_even; @@ -1093,7 +1088,7 @@ void bx_vga_c::write(Bit32u address, Bit32u value, unsigned io_len, bx_bool no_l (value >> 7) & 0x01; if (((value >> 2) & 0x01) != prev_line_graphics) { bx_gui->set_text_charmap( - & BX_VGA_THIS s.vga_memory[0x20000 + BX_VGA_THIS s.charmap_address]); + & BX_VGA_THIS s.memory[0x20000 + BX_VGA_THIS s.charmap_address]); BX_VGA_THIS s.vga_mem_updated = 1; } if (((value >> 7) & 0x01) != prev_int_pal_size) { @@ -1193,7 +1188,7 @@ void bx_vga_c::write(Bit32u address, Bit32u value, unsigned io_len, bx_bool no_l BX_VGA_THIS s.sequencer.char_map_select = 0; BX_VGA_THIS s.charmap_address = 0; bx_gui->set_text_charmap( - & BX_VGA_THIS s.vga_memory[0x20000 + BX_VGA_THIS s.charmap_address]); + & BX_VGA_THIS s.memory[0x20000 + BX_VGA_THIS s.charmap_address]); BX_VGA_THIS s.vga_mem_updated = 1; } BX_VGA_THIS s.sequencer.reset1 = (value >> 0) & 0x01; @@ -1209,8 +1204,6 @@ void bx_vga_c::write(Bit32u address, Bit32u value, unsigned io_len, bx_bool no_l break; case 2: /* sequencer: map mask register */ BX_VGA_THIS s.sequencer.map_mask = (value & 0x0f); - for (i=0; i<4; i++) - BX_VGA_THIS s.sequencer.map_mask_bit[i] = (value >> i) & 0x01; break; case 3: /* sequencer: character map select register */ BX_VGA_THIS s.sequencer.char_map_select = value & 0x3f; @@ -1221,7 +1214,7 @@ void bx_vga_c::write(Bit32u address, Bit32u value, unsigned io_len, bx_bool no_l if (BX_VGA_THIS s.CRTC.reg[0x09] > 0) { BX_VGA_THIS s.charmap_address = charmap_offset[charmap1]; bx_gui->set_text_charmap( - & BX_VGA_THIS s.vga_memory[0x20000 + BX_VGA_THIS s.charmap_address]); + & BX_VGA_THIS s.memory[0x20000 + BX_VGA_THIS s.charmap_address]); BX_VGA_THIS s.vga_mem_updated = 1; } if (charmap2 != charmap1) @@ -1578,7 +1571,7 @@ void bx_vga_c::update(void) iWidth=BX_VGA_THIS s.vbe_xres; iHeight=BX_VGA_THIS s.vbe_yres; pitch = BX_VGA_THIS s.line_offset; - Bit8u *disp_ptr = &BX_VGA_THIS s.vbe_memory[BX_VGA_THIS s.vbe_virtual_start]; + Bit8u *disp_ptr = &BX_VGA_THIS s.memory[BX_VGA_THIS s.vbe_virtual_start]; if (bx_gui->graphics_tile_info(&info)) { if (info.is_indexed) { @@ -1888,7 +1881,7 @@ void bx_vga_c::update(void) byte_offset += (x / 8); bit_no = 7 - (x % 8); - palette_reg_val = (((BX_VGA_THIS s.vga_memory[byte_offset]) >> bit_no) & 1); + palette_reg_val = (((BX_VGA_THIS s.memory[byte_offset]) >> bit_no) & 1); DAC_regno = BX_VGA_THIS s.attribute_ctrl.palette_reg[palette_reg_val]; BX_VGA_THIS s.tile[r*X_TILESIZE + c] = DAC_regno; } @@ -1904,20 +1897,20 @@ void bx_vga_c::update(void) #if BX_SUPPORT_VBE if (BX_VGA_THIS s.vbe_enabled) { - plane0 = &BX_VGA_THIS s.vbe_memory[0<>= 1; } @@ -2000,7 +1993,7 @@ void bx_vga_c::update(void) byte_offset += (x / 4); attribute = 6 - 2*(x % 4); - palette_reg_val = (BX_VGA_THIS s.vga_memory[byte_offset]) >> attribute; + palette_reg_val = (BX_VGA_THIS s.memory[byte_offset]) >> attribute; palette_reg_val &= 3; DAC_regno = BX_VGA_THIS s.attribute_ctrl.palette_reg[palette_reg_val]; BX_VGA_THIS s.tile[r*X_TILESIZE + c] = DAC_regno; @@ -2036,7 +2029,7 @@ void bx_vga_c::update(void) plane = (pixelx % 4); byte_offset = start_addr + (plane * 65536) + (pixely * BX_VGA_THIS s.line_offset) + (pixelx & ~0x03); - color = BX_VGA_THIS s.vga_memory[byte_offset]; + color = BX_VGA_THIS s.memory[byte_offset]; BX_VGA_THIS s.tile[r*X_TILESIZE + c] = color; } } @@ -2062,7 +2055,7 @@ void bx_vga_c::update(void) byte_offset = (plane * 65536) + (pixely * BX_VGA_THIS s.line_offset) + (pixelx >> 2); - color = BX_VGA_THIS s.vga_memory[start_addr + byte_offset]; + color = BX_VGA_THIS s.memory[start_addr + byte_offset]; BX_VGA_THIS s.tile[r*X_TILESIZE + c] = color; } } @@ -2151,11 +2144,11 @@ void bx_vga_c::update(void) cursor_y = ((cursor_address - start_address)/2) / (iWidth/cWidth); } bx_gui->text_update(BX_VGA_THIS s.text_snapshot, - &BX_VGA_THIS s.vga_memory[start_address], + &BX_VGA_THIS s.memory[start_address], cursor_x, cursor_y, tm_info, rows); // screen updated, copy new VGA memory contents into text snapshot memcpy(BX_VGA_THIS s.text_snapshot, - &BX_VGA_THIS s.vga_memory[start_address], + &BX_VGA_THIS s.memory[start_address], 2*cols*rows); BX_VGA_THIS s.vga_mem_updated = 0; } @@ -2237,24 +2230,24 @@ Bit8u bx_vga_c::mem_read(Bit32u addr) if ( BX_VGA_THIS s.sequencer.chain_four ) { // Mode 13h: 320 x 200 256 color mode: chained pixel representation - return BX_VGA_THIS s.vga_memory[(offset & ~0x03) + (offset % 4)*65536]; + return BX_VGA_THIS s.memory[(offset & ~0x03) + (offset % 4)*65536]; } #if BX_SUPPORT_VBE if (BX_VGA_THIS s.vbe_enabled) { - plane0 = &BX_VGA_THIS s.vbe_memory[(0<=0x2000) { y_tileno = offset - 0x2000; @@ -2435,7 +2428,7 @@ void bx_vga_c::mem_write(Bit32u addr, Bit8u value) unsigned x_tileno, y_tileno; // 320 x 200 256 color mode: chained pixel representation - BX_VGA_THIS s.vga_memory[(offset & ~0x03) + (offset % 4)*65536] = value; + BX_VGA_THIS s.memory[(offset & ~0x03) + (offset % 4)*65536] = value; if (BX_VGA_THIS s.line_offset > 0) { offset -= start_addr; x_tileno = (offset % BX_VGA_THIS s.line_offset) / (X_TILESIZE/2); @@ -2456,18 +2449,18 @@ void bx_vga_c::mem_write(Bit32u addr, Bit8u value) #if BX_SUPPORT_VBE if (BX_VGA_THIS s.vbe_enabled) { - plane0 = &BX_VGA_THIS s.vbe_memory[(0<set_text_charbyte((offset & 0x1fff), new_val[2]); } plane2[offset] = new_val[2]; } - if (BX_VGA_THIS s.sequencer.map_mask_bit[3]) + if (BX_VGA_THIS s.sequencer.map_mask & 0x08) plane3[offset] = new_val[3]; unsigned x_tileno, y_tileno; @@ -2933,7 +2926,7 @@ bx_vga_c::vbe_mem_read(Bit32u addr) if (offset > VBE_DISPI_TOTAL_VIDEO_MEMORY_BYTES) return 0; - return (BX_VGA_THIS s.vbe_memory[offset]); + return (BX_VGA_THIS s.memory[offset]); } void BX_CPP_AttrRegparmN(2) @@ -2972,7 +2965,7 @@ bx_vga_c::vbe_mem_write(Bit32u addr, Bit8u value) // check for out of memory write if (offset < VBE_DISPI_TOTAL_VIDEO_MEMORY_BYTES) { - BX_VGA_THIS s.vbe_memory[offset]=value; + BX_VGA_THIS s.memory[offset]=value; } else { @@ -3325,7 +3318,7 @@ Bit32u bx_vga_c::vbe_write(Bit32u address, Bit32u value, unsigned io_len) BX_VGA_THIS s.vbe_lfb_enabled=(bx_bool)(value & VBE_DISPI_LFB_ENABLED); if ((value & VBE_DISPI_NOCLEARMEM) == 0) { - memset(BX_VGA_THIS s.vbe_memory, 0, BX_VGA_THIS s.vbe_visible_screen_size); + memset(BX_VGA_THIS s.memory, 0, BX_VGA_THIS s.vbe_visible_screen_size); } bx_gui->dimension_update(BX_VGA_THIS s.vbe_xres, BX_VGA_THIS s.vbe_yres, 0, 0, depth); BX_VGA_THIS s.last_bpp = depth; diff --git a/bochs/iodev/vga.h b/bochs/iodev/vga.h index 8bec38513..aabfb9868 100644 --- a/bochs/iodev/vga.h +++ b/bochs/iodev/vga.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: vga.h,v 1.56 2006-08-15 16:48:23 vruppert Exp $ +// $Id: vga.h,v 1.57 2006-08-18 15:43:20 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2002 MandrakeSoft S.A. @@ -258,7 +258,6 @@ protected: struct { Bit8u index; Bit8u map_mask; - bx_bool map_mask_bit[4]; bx_bool reset1; bx_bool reset2; Bit8u reg1; @@ -276,7 +275,8 @@ protected: unsigned line_compare; unsigned vertical_display_end; bx_bool vga_tile_updated[BX_NUM_X_TILES][BX_NUM_Y_TILES]; - Bit8u vga_memory[256 * 1024]; + Bit8u *memory; + Bit32u memsize; Bit8u text_snapshot[128 * 1024]; // current text snapshot Bit8u tile[X_TILESIZE * Y_TILESIZE * 4]; /**< Currently allocates the tile as large as needed. */ Bit16u charmap_address; @@ -285,7 +285,6 @@ protected: Bit8u last_bpp; #if BX_SUPPORT_VBE - Bit8u *vbe_memory; Bit16u vbe_cur_dispi; Bit16u vbe_xres; Bit16u vbe_yres;