1. Corrected the ATI 1881x clocks for use with the ATI Mach8/32 and VGA Wonder chips. The CPU slowdowns should now be gone. 2. Merged I/O ports common to both the ATI and IBM 8514/A compatible chips where they have identical code (extended behavior is still separate). Code duplication is now less than before. 3. Fixed a general polygon pattern issue in the Mach8/32 affecting calc.exe in Win3.x and other stuff. 4. Mode changes are, once again, changed (ATI and IBM), as close as possible to the real thing without destroying existing resolutions. 5. The 8514/A Vertical Counter has been extended to 0xfff so that it can take 1280x1024 resolutions well offered by the Mach32 as well as a better way to change the IBM/ATI modes through a callback swap where approprietate. 6. in 8514/A mode, reads from the 0x3c6-0x3c9 ramdac range is redirected to the 8514/A RAMDAC (0x2ea-0x2ed). 7. LFB access in the Mach32 now no longer takes account of the SVGA derived rops. Fixes Mach32 display on NeXTSTEP/OPENSTEP 3.x/4.x 8. Reworked the Display Sense Status and Subsystem Status ports so that they're not copycats from MAME and instead follow the datasheet.
164 lines
4.1 KiB
C
164 lines
4.1 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-compatible Mach8 and Mach32 graphics
|
|
* chips from ATI for the ISA/VLB/MCA/PCI buses.
|
|
*
|
|
*
|
|
*
|
|
* Authors: TheCollector1995.
|
|
*
|
|
* Copyright 2022-2024 TheCollector1995.
|
|
*/
|
|
#ifndef VIDEO_ATI_MACH8_H
|
|
#define VIDEO_ATI_MACH8_H
|
|
|
|
typedef struct mach_t {
|
|
ati_eeprom_t eeprom;
|
|
svga_t svga;
|
|
|
|
rom_t bios_rom;
|
|
rom_t bios_rom2;
|
|
mem_mapping_t mmio_linear_mapping;
|
|
|
|
int mca_bus;
|
|
int pci_bus;
|
|
int vlb_bus;
|
|
int has_bios;
|
|
|
|
uint8_t regs[256];
|
|
uint8_t pci_regs[256];
|
|
uint8_t int_line;
|
|
uint8_t pci_slot;
|
|
uint8_t irq_state;
|
|
|
|
int index;
|
|
int ramdac_type;
|
|
int old_mode;
|
|
|
|
uint32_t memory;
|
|
|
|
uint16_t config1;
|
|
uint16_t config2;
|
|
|
|
uint8_t pos_regs[8];
|
|
uint8_t pci_cntl_reg;
|
|
uint8_t cursor_col_0;
|
|
uint8_t cursor_col_1;
|
|
uint8_t ext_cur_col_0_r;
|
|
uint8_t ext_cur_col_1_r;
|
|
uint8_t ext_cur_col_0_g;
|
|
uint8_t ext_cur_col_1_g;
|
|
uint16_t cursor_col_0_rg;
|
|
uint16_t cursor_col_1_rg;
|
|
uint16_t cursor_col_b;
|
|
uint16_t cursor_offset_lo;
|
|
uint16_t cursor_offset_lo_reg;
|
|
uint16_t cursor_offset_hi;
|
|
uint16_t cursor_offset_hi_reg;
|
|
uint16_t cursor_vh_offset;
|
|
uint16_t cursor_x;
|
|
uint16_t cursor_y;
|
|
uint16_t misc;
|
|
uint16_t memory_aperture;
|
|
uint16_t local_cntl;
|
|
uint32_t linear_base;
|
|
uint8_t ap_size;
|
|
uint8_t bank_w;
|
|
uint8_t bank_r;
|
|
uint16_t shadow_set;
|
|
uint16_t shadow_cntl;
|
|
int ext_on[2];
|
|
int extended_mode;
|
|
int compat_mode;
|
|
|
|
struct {
|
|
uint8_t line_idx;
|
|
int16_t line_array[6];
|
|
uint8_t patt_idx;
|
|
uint8_t patt_len;
|
|
uint8_t pix_trans[2];
|
|
uint8_t eeprom_control;
|
|
uint16_t dest_x_end;
|
|
uint16_t dest_x_start;
|
|
uint16_t dest_y_end;
|
|
uint16_t src_x_end;
|
|
uint16_t src_x_start;
|
|
uint16_t src_x;
|
|
uint16_t src_y;
|
|
int16_t bres_count;
|
|
uint16_t clock_sel;
|
|
uint16_t crt_pitch;
|
|
uint16_t ge_pitch;
|
|
uint16_t dest_cmp_fn;
|
|
uint16_t dp_config;
|
|
uint16_t ext_ge_config;
|
|
uint16_t ge_offset_lo;
|
|
uint16_t ge_offset_hi;
|
|
uint16_t linedraw_opt;
|
|
uint16_t max_waitstates;
|
|
uint8_t patt_data_idx;
|
|
uint8_t patt_data[0x18];
|
|
uint16_t scan_to_x;
|
|
uint16_t scratch0;
|
|
uint16_t scratch1;
|
|
uint16_t test;
|
|
uint16_t pattern;
|
|
uint16_t test2;
|
|
int src_y_dir;
|
|
int cmd_type;
|
|
int block_write_mono_pattern_enable;
|
|
int mono_pattern_enable;
|
|
int16_t cx_end_line;
|
|
int16_t cy_end_line;
|
|
int16_t cx;
|
|
int16_t cx_end;
|
|
int16_t cy_end;
|
|
int16_t dx;
|
|
int16_t dx_end;
|
|
int16_t dy;
|
|
int16_t dy_end;
|
|
int16_t dx_start;
|
|
int16_t dy_start;
|
|
int16_t cy;
|
|
int16_t sx_start;
|
|
int16_t sx_end;
|
|
int16_t sx;
|
|
int16_t x_count;
|
|
int16_t xx_count;
|
|
int16_t xxx_count;
|
|
int16_t sy;
|
|
int16_t y_count;
|
|
int16_t err;
|
|
int16_t width;
|
|
int16_t src_width;
|
|
int16_t height;
|
|
int16_t bleft, bright, btop, bbottom;
|
|
int poly_src;
|
|
int temp_cnt;
|
|
int stepx;
|
|
int stepy;
|
|
int src_stepx;
|
|
uint8_t color_pattern[16];
|
|
uint8_t color_pattern_full[32];
|
|
uint16_t color_pattern_word[8];
|
|
int mono_pattern[8][8];
|
|
uint32_t ge_offset;
|
|
uint32_t crt_offset;
|
|
uint32_t patt_len_reg;
|
|
int poly_fill;
|
|
uint16_t dst_clr_cmp_mask;
|
|
int clip_overrun;
|
|
int color_pattern_idx;
|
|
} accel;
|
|
|
|
atomic_int force_busy;
|
|
} mach_t;
|
|
|
|
#endif /*VIDEO_ATI_MACH8_H*/
|