Bochs/bochs/iodev/vga.h
Bryce Denney cec9135e9f - Apply patch.replace-Boolean rev 1.3. Every "Boolean" is now changed to a
"bx_bool" which is always defined as Bit32u on all platforms.  In Carbon
  specific code, Boolean is still used because the Carbon header files
  define it to unsigned char.
- this fixes bug [ 623152 ] MacOSX: Triple Exception Booting win95.
  The bug was that some code in Bochs depends on Boolean to be a
  32 bit value.  (This should be fixed, but I don't know all the places
  where it needs to be fixed yet.)  Because Carbon defined Boolean as
  an unsigned char, Bochs just followed along and used the unsigned char
  definition to avoid compile problems.  This exposed the dependency
  on 32 bit Boolean on MacOS X only and led to major simulation problems,
  that could only be reproduced and debugged on that platform.
- On the mailing list we debated whether to make all Booleans into "bool" or
  our own type.  I chose bx_bool for several reasons.
  1. Unlike C++'s bool, we can guarantee that bx_bool is the same size on all
     platforms, which makes it much less likely to have more platform-specific
     simulation differences in the future.  (I spent hours on a borrowed
     MacOSX machine chasing bug 618388 before discovering that different sized
     Booleans were the problem, and I don't want to repeat that.)
  2. We still have at least one dependency on 32 bit Booleans which must be
     fixed some time, but I don't want to risk introducing new bugs into the
     simulation just before the 2.0 release.

Modified Files:
    bochs.h config.h.in gdbstub.cc logio.cc main.cc pc_system.cc
    pc_system.h plugin.cc plugin.h bios/rombios.c cpu/apic.cc
    cpu/arith16.cc cpu/arith32.cc cpu/arith64.cc cpu/arith8.cc
    cpu/cpu.cc cpu/cpu.h cpu/ctrl_xfer16.cc cpu/ctrl_xfer32.cc
    cpu/ctrl_xfer64.cc cpu/data_xfer16.cc cpu/data_xfer32.cc
    cpu/data_xfer64.cc cpu/debugstuff.cc cpu/exception.cc
    cpu/fetchdecode.cc cpu/flag_ctrl_pro.cc cpu/init.cc
    cpu/io_pro.cc cpu/lazy_flags.cc cpu/lazy_flags.h cpu/mult16.cc
    cpu/mult32.cc cpu/mult64.cc cpu/mult8.cc cpu/paging.cc
    cpu/proc_ctrl.cc cpu/segment_ctrl_pro.cc cpu/stack_pro.cc
    cpu/tasking.cc debug/dbg_main.cc debug/debug.h debug/sim2.cc
    disasm/dis_decode.cc disasm/disasm.h doc/docbook/Makefile
    docs-html/cosimulation.html fpu/wmFPUemu_glue.cc
    gui/amigaos.cc gui/beos.cc gui/carbon.cc gui/gui.cc gui/gui.h
    gui/keymap.cc gui/keymap.h gui/macintosh.cc gui/nogui.cc
    gui/rfb.cc gui/sdl.cc gui/siminterface.cc gui/siminterface.h
    gui/term.cc gui/win32.cc gui/wx.cc gui/wxmain.cc gui/wxmain.h
    gui/x.cc instrument/example0/instrument.cc
    instrument/example0/instrument.h
    instrument/example1/instrument.cc
    instrument/example1/instrument.h
    instrument/stubs/instrument.cc instrument/stubs/instrument.h
    iodev/cdrom.cc iodev/cdrom.h iodev/cdrom_osx.cc iodev/cmos.cc
    iodev/devices.cc iodev/dma.cc iodev/dma.h iodev/eth_arpback.cc
    iodev/eth_packetmaker.cc iodev/eth_packetmaker.h
    iodev/floppy.cc iodev/floppy.h iodev/guest2host.h
    iodev/harddrv.cc iodev/harddrv.h iodev/ioapic.cc
    iodev/ioapic.h iodev/iodebug.cc iodev/iodev.h
    iodev/keyboard.cc iodev/keyboard.h iodev/ne2k.h
    iodev/parallel.h iodev/pci.cc iodev/pci.h iodev/pic.h
    iodev/pit.cc iodev/pit.h iodev/pit_wrap.cc iodev/pit_wrap.h
    iodev/sb16.cc iodev/sb16.h iodev/serial.cc iodev/serial.h
    iodev/vga.cc iodev/vga.h memory/memory.h memory/misc_mem.cc
2002-10-25 11:44:41 +00:00

283 lines
9.0 KiB
C++

/////////////////////////////////////////////////////////////////////////
// $Id: vga.h,v 1.20 2002-10-25 11:44:41 bdenney Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002 MandrakeSoft S.A.
//
// MandrakeSoft S.A.
// 43, rue d'Aboukir
// 75002 Paris - France
// http://www.linux-mandrake.com/
// http://www.mandrakesoft.com/
//
// 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
#if BX_SUPPORT_VBE
#define VBE_DISPI_TOTAL_VIDEO_MEMORY_MB 4
#define VBE_DISPI_BANK_ADDRESS 0xA0000
#define VBE_DISPI_BANK_SIZE_KB 64
#define VBE_DISPI_MAX_XRES 1024
#define VBE_DISPI_MAX_YRES 768
#define VBE_DISPI_IOPORT_INDEX 0xFF80
#define VBE_DISPI_IOPORT_DATA 0xFF81
#define VBE_DISPI_INDEX_ID 0x0
#define VBE_DISPI_INDEX_XRES 0x1
#define VBE_DISPI_INDEX_YRES 0x2
#define VBE_DISPI_INDEX_BPP 0x3
#define VBE_DISPI_INDEX_ENABLE 0x4
#define VBE_DISPI_INDEX_BANK 0x5
#define VBE_DISPI_INDEX_VIRT_WIDTH 0x6
#define VBE_DISPI_INDEX_VIRT_HEIGHT 0x7
#define VBE_DISPI_INDEX_X_OFFSET 0x8
#define VBE_DISPI_INDEX_Y_OFFSET 0x9
#define VBE_DISPI_ID0 0xB0C0
#define VBE_DISPI_ID1 0xB0C1
#define VBE_DISPI_BPP_8 0x0
// The following is not support yet, but just for reference available.
// #define VBE_DISPI_BPP_RGB565 0x1
// #define VBE_DISPI_BPP_RGB555 0x2
#define VBE_DISPI_DISABLED 0x00
#define VBE_DISPI_ENABLED 0x01
#define VBE_DISPI_LFB_PHYSICAL_ADDRESS 0xE0000000
#define VBE_DISPI_TOTAL_VIDEO_MEMORY_KB (VBE_DISPI_TOTAL_VIDEO_MEMORY_MB * 1024)
#define VBE_DISPI_TOTAL_VIDEO_MEMORY_BYTES (VBE_DISPI_TOTAL_VIDEO_MEMORY_KB * 1024)
#define BX_MAX_XRES VBE_DISPI_MAX_XRES
#define BX_MAX_YRES VBE_DISPI_MAX_YRES
#else
#define BX_MAX_XRES 640
#define BX_MAX_YRES 480
#endif //BX_SUPPORT_VBE
#define CGA_TEXT_ADDR(row, column) (0x18000 + ((row)*80 + (column))*2)
#define X_TILESIZE 16
#define Y_TILESIZE 24
#define BX_NUM_X_TILES (BX_MAX_XRES /X_TILESIZE)
#define BX_NUM_Y_TILES (BX_MAX_YRES /Y_TILESIZE)
// Support varying number of rows of text. This used to
// be limited to only 25 lines.
#define BX_MAX_TEXT_LINES 260
#if BX_USE_VGA_SMF
# define BX_VGA_SMF static
# define BX_VGA_THIS theVga->
#else
# define BX_VGA_SMF
# define BX_VGA_THIS this->
#endif
class bx_vga_c : public bx_vga_stub_c {
public:
bx_vga_c(void);
~bx_vga_c(void);
virtual void init(void);
virtual void reset(unsigned type);
virtual Bit8u mem_read(Bit32u addr);
// Note: either leave value of type Bit8u, or mask it when
// used to 8 bits, in memory.cc
virtual void mem_write(Bit32u addr, Bit8u value);
virtual void trigger_timer(void *this_ptr);
#if BX_SUPPORT_VBE
BX_VGA_SMF Bit8u vbe_mem_read(Bit32u addr);
BX_VGA_SMF void vbe_mem_write(Bit32u addr, Bit8u value);
#endif
virtual void redraw_area(unsigned x0, unsigned y0,
unsigned width, unsigned height);
virtual void set_update_interval (unsigned interval);
virtual void get_text_snapshot(Bit8u **text_snapshot, unsigned *txHeight,
unsigned *txWidth);
private:
static Bit32u read_handler(void *this_ptr, Bit32u address, unsigned io_len);
static void write_handler(void *this_ptr, Bit32u address, Bit32u value, unsigned io_len);
static void write_handler_no_log(void *this_ptr, Bit32u address, Bit32u value, unsigned io_len);
#if BX_SUPPORT_VBE
static Bit32u vbe_read_handler(void *this_ptr, Bit32u address, unsigned io_len);
static void vbe_write_handler(void *this_ptr, Bit32u address, Bit32u value, unsigned io_len);
#endif
struct {
struct {
bx_bool color_emulation; // 1=color emulation, base address = 3Dx
// 0=mono emulation, base address = 3Bx
bx_bool enable_ram; // enable CPU access to video memory if set
Bit8u clock_select; // 0=25Mhz 1=28Mhz
bx_bool select_high_bank; // when in odd/even modes, select
// high 64k bank if set
bx_bool horiz_sync_pol; // bit6: negative if set
bx_bool vert_sync_pol; // bit7: negative if set
// bit7,bit6 represent number of lines on display:
// 0 = reserved
// 1 = 400 lines
// 2 = 350 lines
// 3 - 480 lines
} misc_output;
struct {
Bit8u address;
Bit8u reg[0x19];
} CRTC;
struct {
bx_bool flip_flop; /* 0 = address, 1 = data-write */
unsigned address; /* register number */
bx_bool video_enabled;
Bit8u palette_reg[16];
Bit8u overscan_color;
Bit8u color_plane_enable;
Bit8u horiz_pel_panning;
Bit8u color_select;
struct {
bx_bool graphics_alpha;
bx_bool display_type;
bx_bool enable_line_graphics;
bx_bool blink_intensity;
bx_bool pixel_panning_compat;
bx_bool pixel_clock_select;
bx_bool internal_palette_size;
} mode_ctrl;
} attribute_ctrl;
struct {
Bit8u write_data_register;
Bit8u write_data_cycle; /* 0, 1, 2 */
Bit8u read_data_register;
Bit8u read_data_cycle; /* 0, 1, 2 */
struct {
Bit8u red;
Bit8u green;
Bit8u blue;
} data[256];
Bit8u mask;
} pel;
struct {
Bit8u index;
Bit8u set_reset;
Bit8u enable_set_reset;
Bit8u color_compare;
Bit8u data_rotate;
Bit8u raster_op;
Bit8u read_map_select;
Bit8u write_mode;
bx_bool read_mode;
bx_bool odd_even;
bx_bool chain_odd_even;
Bit8u shift_reg;
bx_bool graphics_alpha;
Bit8u memory_mapping; /* 0 = use A0000-BFFFF
* 1 = use A0000-AFFFF EGA/VGA graphics modes
* 2 = use B0000-B7FFF Monochrome modes
* 3 = use B8000-BFFFF CGA modes
*/
Bit8u color_dont_care;
Bit8u bitmask;
Bit8u latch[4];
} graphics_ctrl;
struct {
Bit8u index;
Bit8u map_mask;
bx_bool map_mask_bit[4];
bx_bool reset1;
bx_bool reset2;
Bit8u reg1;
Bit8u char_map_select;
bx_bool extended_mem;
bx_bool odd_even;
bx_bool chain_four;
} sequencer;
bx_bool vga_mem_updated;
unsigned x_tilesize;
unsigned y_tilesize;
unsigned scan_bits;
bx_bool vga_tile_updated[BX_NUM_X_TILES][BX_NUM_Y_TILES];
Bit8u vga_memory[256 * 1024];
Bit8u text_snapshot[2 * 80 * BX_MAX_TEXT_LINES]; // current text snapshot
unsigned horiz_tick;
unsigned vert_tick;
Bit8u rgb[3 * 256];
Bit8u tile[X_TILESIZE * Y_TILESIZE];
Bit16u charmap_address;
#if BX_SUPPORT_VBE
Bit8u vbe_memory[VBE_DISPI_TOTAL_VIDEO_MEMORY_BYTES];
Bit16u vbe_cur_dispi;
Bit16u vbe_xres;
Bit16u vbe_yres;
Bit16u vbe_bpp;
Bit16u vbe_bank;
bx_bool vbe_enabled;
Bit16u vbe_curindex;
Bit32u vbe_visable_screen_size; // in bytes
Bit16u vbe_offset_x;
Bit16u vbe_offset_y;
Bit16u vbe_virtual_xres;
Bit16u vbe_virtual_yres;
#endif
} s; // state information
#if !BX_USE_VGA_SMF
Bit32u read(Bit32u address, unsigned io_len);
void write(Bit32u address, Bit32u value, unsigned io_len, bx_bool no_log);
#else
void write(Bit32u address, Bit32u value, unsigned io_len, bx_bool no_log);
#endif
#if BX_SUPPORT_VBE
#if !BX_USE_VGA_SMF
Bit32u vbe_read(Bit32u address, unsigned io_len);
void vbe_write(Bit32u address, Bit32u value, unsigned io_len, bx_bool no_log);
#else
void vbe_write(Bit32u address, Bit32u value, unsigned io_len, bx_bool no_log);
#endif
#endif
int timer_id;
public:
static void timer_handler(void *);
BX_VGA_SMF void timer(void);
private:
BX_VGA_SMF void update(void);
BX_VGA_SMF void dump_status(void);
BX_VGA_SMF void determine_screen_dimensions(unsigned *piHeight,
unsigned *piWidth);
};