286 lines
6.6 KiB
C
286 lines
6.6 KiB
C
/*
|
|
* 86Box A hypervisor and IBM PC system emulator that specializes in
|
|
* running old operating systems and software designed for IBM
|
|
* PC systems and compatibles from 1981 through fairly recent
|
|
* system designs based on the PCI bus.
|
|
*
|
|
* This file is part of the 86Box distribution.
|
|
*
|
|
* Emulation of the 8514/A card from IBM for the MCA bus and
|
|
* generic ISA bus clones without vendor extensions.
|
|
*
|
|
*
|
|
*
|
|
* Authors: TheCollector1995
|
|
*
|
|
* Copyright 2022 TheCollector1995.
|
|
*/
|
|
#ifndef VIDEO_8514A_H
|
|
#define VIDEO_8514A_H
|
|
|
|
#define INT_VSY (1 << 0)
|
|
#define INT_GE_BSY (1 << 1)
|
|
#define INT_FIFO_OVR (1 << 2)
|
|
#define INT_FIFO_EMP (1 << 3)
|
|
#define INT_MASK 0xf
|
|
|
|
typedef enum {
|
|
IBM_8514A_TYPE = 0,
|
|
ATI_38800_TYPE,
|
|
ATI_68800_TYPE,
|
|
TYPE_MAX
|
|
} ibm8514_card_type;
|
|
|
|
typedef enum {
|
|
IBM = 0,
|
|
ATI,
|
|
EXTENSIONS_MAX
|
|
} ibm8514_extensions_t;
|
|
|
|
typedef struct hwcursor8514_t {
|
|
int ena;
|
|
int x;
|
|
int y;
|
|
int xoff;
|
|
int yoff;
|
|
int cur_xsize;
|
|
int cur_ysize;
|
|
int v_acc;
|
|
int h_acc;
|
|
uint32_t addr;
|
|
uint32_t pitch;
|
|
} hwcursor8514_t;
|
|
|
|
typedef union {
|
|
uint64_t q;
|
|
uint32_t d[2];
|
|
uint16_t w[4];
|
|
uint8_t b[8];
|
|
} latch8514_t;
|
|
|
|
typedef struct ibm8514_t {
|
|
rom_t bios_rom;
|
|
rom_t bios_rom2;
|
|
mem_mapping_t bios_mapping;
|
|
uint8_t *rom1;
|
|
uint8_t *rom2;
|
|
hwcursor8514_t hwcursor;
|
|
hwcursor8514_t hwcursor_latch;
|
|
uint8_t pos_regs[8];
|
|
char *rom_path;
|
|
|
|
int force_old_addr;
|
|
int type;
|
|
ibm8514_card_type local;
|
|
int bpp;
|
|
int on;
|
|
int accel_bpp;
|
|
|
|
uint32_t vram_size;
|
|
uint32_t vram_mask;
|
|
uint32_t pallook[512];
|
|
uint32_t bios_addr;
|
|
uint32_t ma_latch;
|
|
|
|
PALETTE vgapal;
|
|
uint8_t hwcursor_oddeven;
|
|
uint8_t dac_mask;
|
|
uint8_t dac_status;
|
|
uint32_t *map8;
|
|
int dac_addr;
|
|
int dac_pos;
|
|
int dac_r;
|
|
int dac_g;
|
|
int dac_b;
|
|
int internal_pitch;
|
|
int hwcursor_on;
|
|
int modechange;
|
|
|
|
uint64_t dispontime;
|
|
uint64_t dispofftime;
|
|
|
|
struct {
|
|
uint16_t subsys_cntl;
|
|
uint16_t setup_md;
|
|
uint16_t advfunc_cntl;
|
|
uint16_t advfunc_cntl_old;
|
|
uint16_t cur_y;
|
|
uint16_t cur_x;
|
|
int16_t destx;
|
|
int16_t desty;
|
|
int16_t desty_axstp;
|
|
int16_t destx_distp;
|
|
int16_t err_term;
|
|
int16_t maj_axis_pcnt;
|
|
int16_t maj_axis_pcnt_no_limit;
|
|
uint16_t cmd;
|
|
uint16_t cmd_back;
|
|
uint16_t short_stroke;
|
|
uint16_t bkgd_color;
|
|
uint16_t frgd_color;
|
|
uint16_t wrt_mask;
|
|
uint16_t rd_mask;
|
|
uint16_t color_cmp;
|
|
uint8_t bkgd_mix;
|
|
uint8_t frgd_mix;
|
|
uint8_t bkgd_sel;
|
|
uint8_t frgd_sel;
|
|
uint16_t multifunc_cntl;
|
|
uint16_t multifunc[16];
|
|
uint16_t clip_right;
|
|
uint16_t clip_bottom;
|
|
int16_t clip_left;
|
|
int16_t clip_top;
|
|
uint8_t pix_trans[2];
|
|
int poly_draw;
|
|
int ssv_state;
|
|
int x1;
|
|
int x2;
|
|
int x3;
|
|
int y1;
|
|
int y2;
|
|
int temp_cnt;
|
|
int16_t dx_ibm;
|
|
int16_t dy_ibm;
|
|
int16_t cx;
|
|
int16_t cx_back;
|
|
int16_t cy;
|
|
int16_t oldcx;
|
|
int16_t oldcy;
|
|
int16_t sx;
|
|
int16_t sy;
|
|
int16_t dx;
|
|
int16_t dy;
|
|
int16_t err;
|
|
uint32_t src;
|
|
uint32_t dest;
|
|
int x_count;
|
|
int xx_count;
|
|
int y_count;
|
|
int input;
|
|
int input2;
|
|
int output;
|
|
int output2;
|
|
|
|
int ssv_len;
|
|
int ssv_len_back;
|
|
uint8_t ssv_dir;
|
|
uint8_t ssv_draw;
|
|
int odd_in;
|
|
int odd_out;
|
|
|
|
uint16_t scratch;
|
|
int fill_state;
|
|
int xdir;
|
|
int ydir;
|
|
int linedraw;
|
|
uint32_t ge_offset;
|
|
uint32_t src_ge_offset;
|
|
uint32_t dst_ge_offset;
|
|
uint16_t src_pitch;
|
|
uint16_t dst_pitch;
|
|
int64_t cur_x_24bpp;
|
|
int64_t cur_y_24bpp;
|
|
int64_t dest_x_24bpp;
|
|
int64_t dest_y_24bpp;
|
|
} accel;
|
|
|
|
uint16_t test;
|
|
int h_blankstart;
|
|
int h_blank_end_val;
|
|
int hblankstart;
|
|
int hblank_end_val;
|
|
int hblankend;
|
|
int hblank_ext;
|
|
int hblank_sub;
|
|
|
|
int v_total_reg;
|
|
int v_total;
|
|
int dispend;
|
|
int v_sync_start;
|
|
int v_syncstart;
|
|
int split;
|
|
int h_disp;
|
|
int h_total;
|
|
int h_sync_width;
|
|
int h_disp_time;
|
|
int rowoffset;
|
|
int dispon;
|
|
int hdisp_on;
|
|
int linecountff;
|
|
int vc;
|
|
int linepos;
|
|
int oddeven;
|
|
int cursoron;
|
|
int blink;
|
|
int scrollcache;
|
|
int firstline;
|
|
int lastline;
|
|
int firstline_draw;
|
|
int lastline_draw;
|
|
int displine;
|
|
int fullchange;
|
|
uint32_t ma;
|
|
uint32_t maback;
|
|
|
|
uint8_t *vram;
|
|
uint8_t *changedvram;
|
|
uint8_t linedbl;
|
|
|
|
uint8_t data_available;
|
|
uint8_t data_available2;
|
|
uint8_t rowcount;
|
|
int hsync_start;
|
|
int hsync_width;
|
|
int htotal;
|
|
int hdisp;
|
|
int hdisp2;
|
|
int hdisped;
|
|
int sc;
|
|
int vsyncstart;
|
|
int vsyncwidth;
|
|
int vtotal;
|
|
int v_disp;
|
|
int v_disp2;
|
|
int vdisp;
|
|
int vdisp2;
|
|
int disp_cntl;
|
|
int interlace;
|
|
uint16_t subsys_cntl;
|
|
uint8_t subsys_stat;
|
|
|
|
atomic_int force_busy;
|
|
atomic_int force_busy2;
|
|
atomic_int fifo_idx;
|
|
|
|
int blitter_busy;
|
|
uint64_t blitter_time;
|
|
uint64_t status_time;
|
|
int pitch;
|
|
int ext_pitch;
|
|
int ext_crt_pitch;
|
|
ibm8514_extensions_t extensions;
|
|
int onboard;
|
|
int linear;
|
|
uint32_t vram_amount;
|
|
int vram_512k_8514;
|
|
int vendor_mode;
|
|
int _8514on;
|
|
int _8514crt;
|
|
PALETTE _8514pal;
|
|
|
|
latch8514_t latch;
|
|
|
|
void (*vblank_start)(void *priv);
|
|
void (*accel_out_fifo)(void *priv, uint16_t port, uint16_t val, int len);
|
|
void (*update_irqs)(void *priv);
|
|
|
|
} ibm8514_t;
|
|
|
|
#define IBM_8514A (((dev->local & 0xff) == IBM_8514A_TYPE) && (dev->extensions == IBM))
|
|
#define ATI_8514A_ULTRA (((dev->local & 0xff) == IBM_8514A_TYPE) && (dev->extensions == ATI))
|
|
#define ATI_GRAPHICS_ULTRA ((dev->local & 0xff) == ATI_38800_TYPE)
|
|
#define ATI_MACH32 ((dev->local & 0xff) == ATI_68800_TYPE)
|
|
|
|
#endif /*VIDEO_8514A_H*/
|