Files
86Box/src/include/86box/vid_8514a.h
2025-06-21 01:32:59 +01:00

246 lines
5.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
#include <stdbool.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 ibm8514_hwcursor_s {
int enable;
int x;
int y;
int xoff;
int yoff;
int cur_xsize;
int cur_ysize;
uint32_t addr;
uint32_t pitch;
} ibm8514_hwcursor_t;
typedef union {
uint64_t q;
uint32_t d[2];
uint16_t w[4];
uint8_t b[8];
} ibm8514_latch_t;
typedef struct ibm8514_t {
rom_t bios_rom;
rom_t bios_rom2;
mem_mapping_t bios_mapping;
uint8_t *rom1;
uint8_t *rom2;
ibm8514_hwcursor_t hwcursor;
ibm8514_hwcursor_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 memaddr_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 hwcursor_on;
uint64_t dispontime;
uint64_t dispofftime;
struct {
uint16_t subsys_cntl;
uint16_t advfunc_cntl;
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;
int ssv_state;
int temp_cnt;
int16_t cx;
int16_t cy;
/* oldcx was not used! */
int16_t oldcy;
int16_t sx;
int16_t sy;
int16_t dx;
int16_t dy;
uint32_t src;
uint32_t dest;
int x_count;
/* y_count not used */
int input;
int input2;
int output;
int ssv_len;
int ssv_len_back;
uint8_t ssv_dir;
uint8_t ssv_draw;
int odd_in;
int fill_state;
uint32_t ge_offset;
uint32_t src_ge_offset;
uint32_t dst_ge_offset;
uint16_t src_pitch;
uint16_t dst_pitch;
} accel;
int hblankstart;
int hblankend;
int hblank_ext;
int vtotal_reg;
int vtotal_8514;
int dispend;
int vsyncstart;
int split;
int hdisp_8514;
int htotal_8514;
int rowoffset;
int dispon;
int hdispon;
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 memaddr;
uint32_t memaddr_backup;
uint8_t *vram;
uint8_t *changedvram;
uint8_t linedbl;
uint8_t data_available;
uint8_t rowcount;
int hsync_start;
int hsync_width;
int htotal;
int hdisp_vga;
int hdisped;
int scanline;
int vsyncwidth;
int vtotal;
int vdisp_8514;
int vdisp_vga;
int disp_cntl;
int interlace;
uint16_t subsys_cntl;
uint8_t subsys_stat;
atomic_int force_busy;
atomic_int fifo_idx;
int blitter_busy;
uint64_t blitter_time;
int pitch;
int ext_pitch;
int ext_crt_pitch;
ibm8514_extensions_t extensions;
int onboard;
int linear;
bool vram_is_512k;
uint32_t vram_amount;
int vendor_mode;
int _8514on;
int _8514crt;
PALETTE _8514pal;
ibm8514_latch_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*/