2001-10-03 17:10:38 +04:00
|
|
|
/////////////////////////////////////////////////////////////////////////
|
2002-10-13 12:14:31 +04:00
|
|
|
// $Id: vga.h,v 1.18 2002-10-13 08:14:31 vruppert Exp $
|
2001-10-03 17:10:38 +04:00
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
2002-02-04 23:31:35 +03:00
|
|
|
// Copyright (C) 2002 MandrakeSoft S.A.
|
2001-04-10 05:04:59 +04:00
|
|
|
//
|
|
|
|
// 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
|
|
|
|
|
2002-03-10 07:51:24 +03:00
|
|
|
#if BX_SUPPORT_VBE
|
2002-03-13 21:33:00 +03:00
|
|
|
#define VBE_DISPI_TOTAL_VIDEO_MEMORY_MB 4
|
|
|
|
|
2002-03-10 07:51:24 +03:00
|
|
|
#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
|
2002-04-29 17:06:06 +04:00
|
|
|
#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
|
|
|
|
|
2002-03-10 07:51:24 +03:00
|
|
|
#define VBE_DISPI_ID0 0xB0C0
|
2002-04-29 17:06:06 +04:00
|
|
|
#define VBE_DISPI_ID1 0xB0C1
|
|
|
|
|
2002-03-10 07:51:24 +03:00
|
|
|
#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
|
2001-04-10 05:04:59 +04:00
|
|
|
|
2002-03-10 07:51:24 +03:00
|
|
|
#define VBE_DISPI_DISABLED 0x00
|
|
|
|
#define VBE_DISPI_ENABLED 0x01
|
2002-04-03 20:48:15 +04:00
|
|
|
#define VBE_DISPI_LFB_PHYSICAL_ADDRESS 0xE0000000
|
|
|
|
|
2002-09-22 15:31:48 +04:00
|
|
|
|
|
|
|
#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)
|
2002-03-10 07:51:24 +03:00
|
|
|
|
|
|
|
#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
|
2001-04-10 05:04:59 +04:00
|
|
|
#define CGA_TEXT_ADDR(row, column) (0x18000 + ((row)*80 + (column))*2)
|
|
|
|
|
2002-09-19 05:32:38 +04:00
|
|
|
#define X_TILESIZE 16
|
|
|
|
#define Y_TILESIZE 24
|
2002-03-10 07:51:24 +03:00
|
|
|
#define BX_NUM_X_TILES (BX_MAX_XRES /X_TILESIZE)
|
|
|
|
#define BX_NUM_Y_TILES (BX_MAX_YRES /Y_TILESIZE)
|
2001-04-10 05:04:59 +04:00
|
|
|
|
|
|
|
// Support varying number of rows of text. This used to
|
|
|
|
// be limited to only 25 lines.
|
2001-10-02 22:38:03 +04:00
|
|
|
#define BX_MAX_TEXT_LINES 260
|
2001-04-10 05:04:59 +04:00
|
|
|
|
|
|
|
#if BX_USE_VGA_SMF
|
|
|
|
# define BX_VGA_SMF static
|
|
|
|
# define BX_VGA_THIS bx_vga.
|
|
|
|
#else
|
|
|
|
# define BX_VGA_SMF
|
|
|
|
# define BX_VGA_THIS this->
|
|
|
|
#endif
|
|
|
|
|
2002-03-10 07:51:24 +03:00
|
|
|
|
merge in BRANCH-io-cleanup.
To see the commit logs for this use either cvsweb or
cvs update -r BRANCH-io-cleanup and then 'cvs log' the various files.
In general this provides a generic interface for logging.
logfunctions:: is a class that is inherited by some classes, and also
. allocated as a standalone global called 'genlog'. All logging uses
. one of the ::info(), ::error(), ::ldebug(), ::panic() methods of this
. class through 'BX_INFO(), BX_ERROR(), BX_DEBUG(), BX_PANIC()' macros
. respectively.
.
. An example usage:
. BX_INFO(("Hello, World!\n"));
iofunctions:: is a class that is allocated once by default, and assigned
as the iofunction of each logfunctions instance. It is this class that
maintains the file descriptor and other output related code, at this
point using vfprintf(). At some future point, someone may choose to
write a gui 'console' for bochs to which messages would be redirected
simply by assigning a different iofunction class to the various logfunctions
objects.
More cleanup is coming, but this works for now. If you want to see alot
of debugging output, in main.cc, change onoff[LOGLEV_DEBUG]=0 to =1.
Comments, bugs, flames, to me: todd@fries.net
2001-05-15 18:49:57 +04:00
|
|
|
class bx_vga_c : public logfunctions {
|
2001-04-10 05:04:59 +04:00
|
|
|
public:
|
|
|
|
|
|
|
|
bx_vga_c(void);
|
|
|
|
~bx_vga_c(void);
|
|
|
|
BX_VGA_SMF void init(bx_devices_c *, bx_cmos_c *cmos);
|
2002-08-27 23:54:46 +04:00
|
|
|
BX_VGA_SMF void reset(unsigned type);
|
2001-04-10 05:04:59 +04:00
|
|
|
BX_VGA_SMF Bit8u mem_read(Bit32u addr);
|
|
|
|
// Note: either leave value of type Bit8u, or mask it when
|
|
|
|
// used to 8 bits, in memory.cc
|
|
|
|
BX_VGA_SMF void mem_write(Bit32u addr, Bit8u value);
|
2002-03-10 07:51:24 +03:00
|
|
|
|
|
|
|
#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
|
|
|
|
|
2001-04-10 05:04:59 +04:00
|
|
|
BX_VGA_SMF void redraw_area(unsigned x0, unsigned y0,
|
|
|
|
unsigned width, unsigned height);
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
2002-03-10 07:51:24 +03:00
|
|
|
#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
|
|
|
|
|
2001-04-10 05:04:59 +04:00
|
|
|
struct {
|
|
|
|
struct {
|
|
|
|
Boolean color_emulation; // 1=color emulation, base address = 3Dx
|
|
|
|
// 0=mono emulation, base address = 3Bx
|
|
|
|
Boolean enable_ram; // enable CPU access to video memory if set
|
|
|
|
Bit8u clock_select; // 0=25Mhz 1=28Mhz
|
|
|
|
Boolean select_high_bank; // when in odd/even modes, select
|
|
|
|
// high 64k bank if set
|
|
|
|
Boolean horiz_sync_pol; // bit6: negative if set
|
|
|
|
Boolean 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 {
|
|
|
|
Boolean flip_flop; /* 0 = address, 1 = data-write */
|
|
|
|
unsigned address; /* register number */
|
|
|
|
Boolean video_enabled;
|
|
|
|
Bit8u palette_reg[16];
|
|
|
|
Bit8u overscan_color;
|
|
|
|
Bit8u color_plane_enable;
|
|
|
|
Bit8u horiz_pel_panning;
|
|
|
|
Bit8u color_select;
|
|
|
|
struct {
|
|
|
|
Boolean graphics_alpha;
|
|
|
|
Boolean display_type;
|
|
|
|
Boolean enable_line_graphics;
|
|
|
|
Boolean blink_intensity;
|
|
|
|
Boolean pixel_panning_compat;
|
|
|
|
Boolean pixel_clock_select;
|
|
|
|
Boolean 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;
|
|
|
|
Boolean read_mode;
|
|
|
|
Boolean odd_even;
|
|
|
|
Boolean chain_odd_even;
|
|
|
|
Bit8u shift_reg;
|
|
|
|
Boolean 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;
|
|
|
|
Boolean map_mask_bit[4];
|
2002-10-13 12:14:31 +04:00
|
|
|
Boolean reset1;
|
|
|
|
Boolean reset2;
|
2001-04-10 05:04:59 +04:00
|
|
|
Bit8u reg1;
|
|
|
|
Bit8u char_map_select;
|
|
|
|
Boolean extended_mem;
|
|
|
|
Boolean odd_even;
|
|
|
|
Boolean chain_four;
|
|
|
|
} sequencer;
|
|
|
|
|
|
|
|
Boolean vga_mem_updated;
|
|
|
|
unsigned x_tilesize;
|
|
|
|
unsigned y_tilesize;
|
|
|
|
unsigned scan_bits;
|
|
|
|
Boolean 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];
|
2002-09-19 22:59:50 +04:00
|
|
|
Bit16u charmap_address;
|
2002-03-10 07:51:24 +03:00
|
|
|
|
|
|
|
#if BX_SUPPORT_VBE
|
2002-09-22 15:31:48 +04:00
|
|
|
Bit8u vbe_memory[VBE_DISPI_TOTAL_VIDEO_MEMORY_BYTES];
|
2002-04-29 17:06:06 +04:00
|
|
|
Bit16u vbe_cur_dispi;
|
2002-03-10 07:51:24 +03:00
|
|
|
Bit16u vbe_xres;
|
|
|
|
Bit16u vbe_yres;
|
|
|
|
Bit16u vbe_bpp;
|
|
|
|
Bit16u vbe_bank;
|
|
|
|
Boolean vbe_enabled;
|
|
|
|
Bit16u vbe_curindex;
|
2002-03-16 13:22:57 +03:00
|
|
|
Bit32u vbe_visable_screen_size; // in bytes
|
2002-04-29 17:06:06 +04:00
|
|
|
Bit16u vbe_offset_x;
|
|
|
|
Bit16u vbe_offset_y;
|
|
|
|
Bit16u vbe_virtual_xres;
|
|
|
|
Bit16u vbe_virtual_yres;
|
2002-03-10 07:51:24 +03:00
|
|
|
#endif
|
2001-04-10 05:04:59 +04:00
|
|
|
} s; // state information
|
|
|
|
|
|
|
|
|
|
|
|
bx_devices_c *devices;
|
|
|
|
|
|
|
|
#if !BX_USE_VGA_SMF
|
|
|
|
Bit32u read(Bit32u address, unsigned io_len);
|
|
|
|
void write(Bit32u address, Bit32u value, unsigned io_len, Boolean no_log);
|
|
|
|
#else
|
|
|
|
void write(Bit32u address, Bit32u value, unsigned io_len, Boolean no_log);
|
|
|
|
#endif
|
2002-03-10 07:51:24 +03:00
|
|
|
|
|
|
|
#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, Boolean no_log);
|
|
|
|
#else
|
|
|
|
void vbe_write(Bit32u address, Bit32u value, unsigned io_len, Boolean no_log);
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
2001-06-09 23:57:56 +04:00
|
|
|
int timer_id;
|
2001-04-10 05:04:59 +04:00
|
|
|
|
|
|
|
public:
|
|
|
|
static void timer_handler(void *);
|
|
|
|
BX_VGA_SMF void timer(void);
|
2001-06-09 23:57:56 +04:00
|
|
|
BX_VGA_SMF void set_update_interval (unsigned interval);
|
2002-02-04 23:31:35 +03:00
|
|
|
BX_VGA_SMF void get_text_snapshot(Bit8u **text_snapshot, unsigned *txHeight,
|
|
|
|
unsigned *txWidth);
|
2001-04-10 05:04:59 +04:00
|
|
|
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);
|
|
|
|
};
|
|
|
|
|
|
|
|
extern bx_vga_c bx_vga;
|