mirror of
https://github.com/86Box/86Box.git
synced 2026-02-23 09:58:19 -07:00
246 lines
5.6 KiB
C
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*/
|