sonarlint vid_xga.c

This commit is contained in:
Jasmine Iwanek
2023-07-30 20:17:51 -04:00
parent 996d06d019
commit 2d7c62c853
2 changed files with 404 additions and 225 deletions

View File

@@ -20,7 +20,7 @@
#include <86box/rom.h>
typedef struct {
typedef struct xga_hwcursor_t {
int ena;
int x;
int y;
@@ -37,11 +37,14 @@ typedef struct xga_t {
mem_mapping_t video_mapping;
rom_t bios_rom;
rom_t vga_bios_rom;
xga_hwcursor_t hwcursor, hwcursor_latch;
xga_hwcursor_t hwcursor;
xga_hwcursor_t hwcursor_latch;
PALETTE extpal;
uint8_t test, atest[2], testpixel;
;
uint8_t test;
uint8_t atest[2];
uint8_t testpixel;
uint8_t pos_regs[8];
uint8_t disp_addr;
uint8_t cfg_reg;
@@ -54,34 +57,44 @@ typedef struct xga_t {
uint8_t regs_idx;
uint8_t hwc_hotspot_x;
uint8_t hwc_hotspot_y;
uint8_t disp_cntl_1, disp_cntl_2;
uint8_t clk_sel_1, clk_sel_2;
uint8_t disp_cntl_1;
uint8_t disp_cntl_2;
uint8_t clk_sel_1;
uint8_t clk_sel_2;
uint8_t hwc_control;
uint8_t bus_arb;
uint8_t isa_pos_enable;
uint8_t hwcursor_oddeven;
uint8_t cfg_reg_instance;
uint8_t rowcount;
uint8_t pal_idx, pal_idx_prefetch;
uint8_t pal_idx;
uint8_t pal_idx_prefetch;
uint8_t pal_seq;
uint8_t pal_mask;
uint8_t pal_r, pal_r_prefetch;
uint8_t pal_g, pal_g_prefetch;
uint8_t pal_b, pal_b_prefetch;
uint8_t pal_r;
uint8_t pal_r_prefetch;
uint8_t pal_g;
uint8_t pal_g_prefetch;
uint8_t pal_b;
uint8_t pal_b_prefetch;
uint8_t sprite_data[1024];
uint8_t scrollcache;
uint8_t border_color;
uint8_t direct_color;
uint8_t dma_channel;
uint8_t instance_isa, instance_num, ext_mem_addr;
uint8_t *vram, *changedvram;
uint8_t instance_isa;
uint8_t instance_num;
uint8_t ext_mem_addr;
uint8_t *vram;
uint8_t *changedvram;
int16_t hwc_pos_x;
int16_t hwc_pos_y;
uint16_t pos_idx;
uint16_t htotal;
uint16_t sprite_idx, sprite_idx_prefetch;
uint16_t sprite_idx;
uint16_t sprite_idx_prefetch;
uint16_t hdisp;
uint16_t vtotal;
uint16_t vdispend;
@@ -89,41 +102,74 @@ typedef struct xga_t {
uint16_t vsyncstart;
uint16_t linecmp;
uint16_t pix_map_width;
uint16_t sprite_pal_addr_idx, old_pal_addr_idx;
uint16_t sprite_pal_addr_idx;
uint16_t old_pal_addr_idx;
uint16_t sprite_pal_addr_idx_prefetch;
int v_total, dispend, v_syncstart, split, v_blankstart,
h_disp, h_disp_old, h_total, h_disp_time, rowoffset,
dispon, h_disp_on, vc, sc, linepos, oddeven, firstline, lastline,
firstline_draw, lastline_draw, displine, fullchange, interlace,
char_width, hwcursor_on;
int pal_pos, pal_pos_prefetch;
int v_total;
int dispend;
int v_syncstart;
int split;
int v_blankstart;
int h_disp;
int h_disp_old;
int h_total;
int h_disp_time;
int rowoffset;
int dispon;
int h_disp_on;
int vc;
int sc;
int linepos;
int oddeven;
int firstline;
int lastline;
int firstline_draw;
int lastline_draw;
int displine;
int fullchange;
int interlace;
int char_width;
int hwcursor_on;
int pal_pos;
int pal_pos_prefetch;
int on;
int op_mode_reset, linear_endian_reverse;
int sprite_pos, sprite_pos_prefetch, cursor_data_on;
int pal_test, a5_test;
int type, bus;
int op_mode_reset;
int linear_endian_reverse;
int sprite_pos;
int sprite_pos_prefetch;
int cursor_data_on;
int pal_test;
int a5_test;
int type;
int bus;
uint32_t linear_base, linear_size, banked_mask;
uint32_t linear_base;
uint32_t linear_size;
uint32_t banked_mask;
uint32_t base_addr_1mb;
uint32_t hwc_color0, hwc_color1;
uint32_t hwc_color0;
uint32_t hwc_color1;
uint32_t disp_start_addr;
uint32_t ma_latch;
uint32_t vram_size;
uint32_t vram_mask;
uint32_t rom_addr;
uint32_t ma, maback;
uint32_t ma;
uint32_t maback;
uint32_t extpallook[256];
uint32_t read_bank, write_bank;
uint32_t read_bank;
uint32_t write_bank;
uint32_t px_map_base;
uint64_t dispontime, dispofftime;
uint64_t dispontime;
uint64_t dispofftime;
struct
{
struct {
uint8_t control;
uint8_t px_map_idx;
uint8_t frgd_mix, bkgd_mix;
uint8_t frgd_mix;
uint8_t bkgd_mix;
uint8_t cc_cond;
uint8_t octant;
uint8_t draw_mode;
@@ -134,15 +180,19 @@ typedef struct xga_t {
uint8_t short_stroke_vector4;
int16_t bres_err_term;
int16_t bres_k1, bres_k2;
int16_t bres_k1;
int16_t bres_k2;
uint16_t blt_width;
uint16_t blt_height;
uint16_t mask_map_origin_x_off;
uint16_t mask_map_origin_y_off;
uint16_t src_map_x, src_map_y;
uint16_t dst_map_x, dst_map_y;
uint16_t pat_map_x, pat_map_y;
uint16_t src_map_x;
uint16_t src_map_y;
uint16_t dst_map_x;
uint16_t dst_map_y;
uint16_t pat_map_x;
uint16_t pat_map_y;
int ssv_state;
int pat_src;
@@ -150,7 +200,14 @@ typedef struct xga_t {
int dst_map;
int bkgd_src;
int fore_src;
int x, y, sx, sy, dx, dy, px, py;
int x;
int y;
int sx;
int sy;
int dx;
int dy;
int px;
int py;
int pattern;
int command_len;
@@ -158,7 +215,8 @@ typedef struct xga_t {
uint32_t color_cmp;
uint32_t carry_chain;
uint32_t plane_mask;
uint32_t frgd_color, bkgd_color;
uint32_t frgd_color;
uint32_t bkgd_color;
uint32_t command;
uint32_t dir_cmd;

View File

@@ -34,6 +34,7 @@
#include <86box/vid_svga_render.h>
#include <86box/vid_xga_device.h>
#include "cpu.h"
#include <86box/plat_unused.h>
#define XGA_BIOS_PATH "roms/video/xga/XGA_37F9576_Ver200.BIN"
#define XGA2_BIOS_PATH "roms/video/xga/xga2_v300.bin"
@@ -42,18 +43,18 @@
static video_timings_t timing_xga_isa = { .type = VIDEO_ISA, .write_b = 3, .write_w = 3, .write_l = 6, .read_b = 5, .read_w = 5, .read_l = 10 };
static video_timings_t timing_xga_mca = { .type = VIDEO_MCA, .write_b = 4, .write_w = 5, .write_l = 10, .read_b = 5, .read_w = 5, .read_l = 10 };
static void xga_ext_outb(uint16_t addr, uint8_t val, void *p);
static uint8_t xga_ext_inb(uint16_t addr, void *p);
static void xga_ext_outb(uint16_t addr, uint8_t val, void *priv);
static uint8_t xga_ext_inb(uint16_t addr, void *priv);
static void xga_writew(uint32_t addr, uint16_t val, void *p);
static uint16_t xga_readw(uint32_t addr, void *p);
static void xga_writew(uint32_t addr, uint16_t val, void *priv);
static uint16_t xga_readw(uint32_t addr, void *priv);
int xga_has_vga = 0;
void
svga_xga_out(uint16_t addr, uint8_t val, void *p)
svga_xga_out(uint16_t addr, uint8_t val, void *priv)
{
svga_t *svga = (svga_t *)p;
svga_t *svga = (svga_t *) priv;
uint8_t old;
if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1))
@@ -84,14 +85,17 @@ svga_xga_out(uint16_t addr, uint8_t val, void *p)
}
}
break;
default:
break;
}
svga_out(addr, val, svga);
}
uint8_t
svga_xga_in(uint16_t addr, void *p)
svga_xga_in(uint16_t addr, void *priv)
{
svga_t *svga = (svga_t *)p;
svga_t *svga = (svga_t *) priv;
uint8_t temp;
if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1))
@@ -119,7 +123,9 @@ xga_updatemapping(svga_t *svga)
{
xga_t *xga = &svga->xga;
//pclog("OpMode = %x, linear base = %08x, aperture cntl = %d, access mode = %x, map = %x, endian reverse = %d, a5test = %d, XGA on = %d.\n", xga->op_mode, xga->linear_base, xga->aperture_cntl, xga->access_mode, svga->gdcreg[6] & 0x0c, xga->linear_endian_reverse, xga->a5_test, xga->on);
#if 0
pclog("OpMode = %x, linear base = %08x, aperture cntl = %d, access mode = %x, map = %x, endian reverse = %d, a5test = %d, XGA on = %d.\n", xga->op_mode, xga->linear_base, xga->aperture_cntl, xga->access_mode, svga->gdcreg[6] & 0x0c, xga->linear_endian_reverse, xga->a5_test, xga->on);
#endif
if (((xga->op_mode & 7) >= 4) || ((xga->op_mode & 7) == 0)) {
if ((xga->aperture_cntl == 1) || (xga->aperture_cntl == 2)) {
mem_mapping_disable(&svga->mapping);
@@ -151,9 +157,13 @@ xga_updatemapping(svga_t *svga)
vga_on = !xga->on;
}
}
//pclog("XGA opmode (extended) = %d, disp mode = %d, aperture = %d.\n", xga->op_mode & 7, xga->disp_cntl_2 & 7, xga->aperture_cntl);
#if 0
pclog("XGA opmode (extended) = %d, disp mode = %d, aperture = %d.\n", xga->op_mode & 7, xga->disp_cntl_2 & 7, xga->aperture_cntl);
#endif
}
//pclog("VGA on = %d.\n", vga_on);
#if 0
pclog("VGA on = %d.\n", vga_on);
#endif
}
void
@@ -188,16 +198,19 @@ xga_recalctimings(svga_t *svga)
switch ((xga->clk_sel_1 >> 2) & 3) {
case 0:
if (xga->clk_sel_2 & 0x80) {
svga->clock = (cpuclock * (double) (1ull << 32)) / 41539000.0;
svga->clock = (cpuclock * (double) (1ULL << 32)) / 41539000.0;
} else {
svga->clock = (cpuclock * (double) (1ull << 32)) / 25175000.0;
svga->clock = (cpuclock * (double) (1ULL << 32)) / 25175000.0;
}
break;
case 1:
svga->clock = (cpuclock * (double) (1ull << 32)) / 28322000.0;
svga->clock = (cpuclock * (double) (1ULL << 32)) / 28322000.0;
break;
case 3:
svga->clock = (cpuclock * (double) (1ull << 32)) / 44900000.0;
svga->clock = (cpuclock * (double) (1ULL << 32)) / 44900000.0;
break;
default:
break;
}
}
@@ -390,7 +403,9 @@ xga_ext_out_reg(xga_t *xga, svga_t *svga, uint8_t idx, uint8_t val)
xga->cursor_data_on = 0;
}
}
// pclog("Sprite POS = %d, data on = %d, idx = %d, apcntl = %d\n", xga->sprite_pos, xga->cursor_data_on, xga->sprite_pal_addr_idx, xga->aperture_cntl);
#if 0
pclog("Sprite POS = %d, data on = %d, idx = %d, apcntl = %d\n", xga->sprite_pos, xga->cursor_data_on, xga->sprite_pal_addr_idx, xga->aperture_cntl);
#endif
break;
case 0x62:
@@ -428,6 +443,9 @@ xga_ext_out_reg(xga_t *xga, svga_t *svga, uint8_t idx, uint8_t val)
svga->dac_pos = 0;
svga->dac_addr = (svga->dac_addr + 1) & 0xff;
break;
default:
break;
}
break;
@@ -454,16 +472,21 @@ xga_ext_out_reg(xga_t *xga, svga_t *svga, uint8_t idx, uint8_t val)
xga->clk_sel_2 = val;
svga_recalctimings(svga);
break;
default:
break;
}
}
static void
xga_ext_outb(uint16_t addr, uint8_t val, void *p)
xga_ext_outb(uint16_t addr, uint8_t val, void *priv)
{
svga_t *svga = (svga_t *) p;
svga_t *svga = (svga_t *) priv;
xga_t *xga = &svga->xga;
//pclog("[%04X:%08X]: EXT OUTB = %02x, val = %02x\n", CS, cpu_state.pc, addr, val);
#if 0
pclog("[%04X:%08X]: EXT OUTB = %02x, val = %02x\n", CS, cpu_state.pc, addr, val);
#endif
switch (addr & 0x0f) {
case 0:
xga->op_mode = val;
@@ -479,7 +502,9 @@ xga_ext_outb(uint16_t addr, uint8_t val, void *p)
break;
case 8:
xga->ap_idx = val;
//pclog("Aperture CNTL = %d, val = %02x, up to bit6 = %02x\n", xga->aperture_cntl, val, val & 0x3f);
#if 0
pclog("Aperture CNTL = %d, val = %02x, up to bit6 = %02x\n", xga->aperture_cntl, val, val & 0x3f);
#endif
if ((xga->op_mode & 7) < 4) {
xga->write_bank = xga->read_bank = 0;
} else {
@@ -501,15 +526,18 @@ xga_ext_outb(uint16_t addr, uint8_t val, void *p)
xga->regs[xga->regs_idx] = val;
xga_ext_out_reg(xga, svga, xga->regs_idx, xga->regs[xga->regs_idx]);
break;
default:
break;
}
}
static uint8_t
xga_ext_inb(uint16_t addr, void *p)
xga_ext_inb(uint16_t addr, void *priv)
{
svga_t *svga = (svga_t *) p;
svga_t *svga = (svga_t *) priv;
xga_t *xga = &svga->xga;
uint8_t ret;
uint8_t ret = 0;
uint8_t index;
switch (addr & 0x0f) {
@@ -693,6 +721,9 @@ xga_ext_inb(uint16_t addr, void *p)
svga->dac_addr = (svga->dac_addr + 1) & 0xff;
ret = svga->vgapal[index].b;
break;
default:
break;
}
break;
@@ -711,7 +742,9 @@ xga_ext_inb(uint16_t addr, void *p)
break;
case 0x6a:
// pclog("Sprite POS Read = %d, addr idx = %04x\n", xga->sprite_pos, xga->sprite_pal_addr_idx_prefetch);
#if 0
pclog("Sprite POS Read = %d, addr idx = %04x\n", xga->sprite_pos, xga->sprite_pal_addr_idx_prefetch);
#endif
ret = xga->sprite_data[xga->sprite_pos_prefetch];
xga->sprite_pos_prefetch = (xga->sprite_pos_prefetch + 1) & 0x3ff;
break;
@@ -735,9 +768,15 @@ xga_ext_inb(uint16_t addr, void *p)
break;
}
break;
default:
break;
}
//pclog("[%04X:%08X]: EXT INB = %02x, ret = %02x\n", CS, cpu_state.pc, addr, ret);
#if 0
pclog("[%04X:%08X]: EXT INB = %02x, ret = %02x\n", CS, cpu_state.pc, addr, ret);
#endif
return ret;
}
@@ -839,7 +878,7 @@ xga_ext_inb(uint16_t addr, void *p)
static uint32_t
xga_accel_read_pattern_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int width)
{
xga_t *xga = &svga->xga;
const xga_t *xga = &svga->xga;
uint32_t addr = base;
int bits;
uint32_t byte;
@@ -875,7 +914,7 @@ xga_accel_read_pattern_map_pixel(svga_t *svga, int x, int y, int map, uint32_t b
}
static uint32_t
xga_accel_read_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int width, int usesrc)
xga_accel_read_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int width, UNUSED(int usesrc))
{
xga_t *xga = &svga->xga;
uint32_t addr = base;
@@ -938,6 +977,9 @@ xga_accel_read_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int
}
}
return byte;
default:
break;
}
return 0;
}
@@ -1016,6 +1058,9 @@ xga_accel_write_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, ui
mem_writew_phys(addr, pixel);
}
break;
default:
break;
}
}
@@ -1078,6 +1123,9 @@ xga_short_stroke(svga_t *svga, uint8_t ssv)
dirx = 1;
diry = 1;
break;
default:
break;
}
if (xga->accel.pat_src == 8) {
@@ -1169,18 +1217,18 @@ xga_line_draw_write(svga_t *svga)
int dx;
int dy;
dminor = ((int16_t) xga->accel.bres_k1);
dminor = (xga->accel.bres_k1);
if (xga->accel.bres_k1 & 0x2000)
dminor |= ~0x1fff;
dminor >>= 1;
destxtmp = ((int16_t) xga->accel.bres_k2);
destxtmp = (xga->accel.bres_k2);
if (xga->accel.bres_k2 & 0x2000)
destxtmp |= ~0x1fff;
dmajor = -(destxtmp - (dminor << 1)) >> 1;
err = ((int16_t) xga->accel.bres_err_term);
err = (xga->accel.bres_err_term);
if (xga->accel.bres_err_term & 0x2000)
destxtmp |= ~0x1fff;
@@ -1325,7 +1373,9 @@ xga_bitblt(svga_t *svga)
uint32_t srcwidth = xga->accel.px_map_width[xga->accel.src_map];
uint32_t patheight = xga->accel.px_map_height[xga->accel.pat_src];
uint32_t srcheight = xga->accel.px_map_height[xga->accel.src_map];
#if 0
uint32_t dstheight = xga->accel.px_map_height[xga->accel.dst_map];
#endif
uint32_t frgdcol = xga->accel.frgd_color;
uint32_t bkgdcol = xga->accel.bkgd_color;
int mix = 0;
@@ -1360,8 +1410,10 @@ xga_bitblt(svga_t *svga)
xga->accel.pattern = 0;
//pclog("XGA bitblt linear endian reverse=%d, access_mode=%x, octanty=%d, src command = %08x, pxsrcmap=%x, pxpatmap=%x, pxdstmap=%x, srcmap=%d, patmap=%d, dstmap=%d, usesrcvramfr=%d, usevrambk=%d.\n",
// xga->linear_endian_reverse, xga->access_mode & 0x0f, ydir, xga->accel.command, xga->accel.px_map_format[xga->accel.src_map] & 0x0f, xga->accel.px_map_format[xga->accel.pat_src] & 0x0f, xga->accel.px_map_format[xga->accel.dst_map] & 0x0f, xga->accel.src_map, xga->accel.pat_src, xga->accel.dst_map, ((xga->accel.command >> 28) & 3), ((xga->accel.command >> 30) & 3));
#if 0
pclog("XGA bitblt linear endian reverse=%d, access_mode=%x, octanty=%d, src command = %08x, pxsrcmap=%x, pxpatmap=%x, pxdstmap=%x, srcmap=%d, patmap=%d, dstmap=%d, usesrcvramfr=%d, usevrambk=%d.\n",
xga->linear_endian_reverse, xga->access_mode & 0x0f, ydir, xga->accel.command, xga->accel.px_map_format[xga->accel.src_map] & 0x0f, xga->accel.px_map_format[xga->accel.pat_src] & 0x0f, xga->accel.px_map_format[xga->accel.dst_map] & 0x0f, xga->accel.src_map, xga->accel.pat_src, xga->accel.dst_map, ((xga->accel.command >> 28) & 3), ((xga->accel.command >> 30) & 3));
#endif
if (xga->accel.pat_src == 8) {
if (srcheight == 7)
@@ -1375,8 +1427,10 @@ xga_bitblt(svga_t *svga)
}
}
}
// pclog("Pattern Map = 8: CMD = %08x: SRCBase = %08x, DSTBase = %08x, from/to vram dir = %d, cmd dir = %06x\n", xga->accel.command, srcbase, dstbase, xga->from_to_vram, xga->accel.dir_cmd);
// pclog("CMD = %08x: Y = %d, X = %d, patsrc = %02x, srcmap = %d, dstmap = %d, py = %d, sy = %d, dy = %d, width0 = %d, width1 = %d, width2 = %d, width3 = %d\n", xga->accel.command, xga->accel.y, xga->accel.x, xga->accel.pat_src, xga->accel.src_map, xga->accel.dst_map, xga->accel.py, xga->accel.sy, xga->accel.dy, xga->accel.px_map_width[0], xga->accel.px_map_width[1], xga->accel.px_map_width[2], xga->accel.px_map_width[3]);
#if 0
pclog("Pattern Map = 8: CMD = %08x: SRCBase = %08x, DSTBase = %08x, from/to vram dir = %d, cmd dir = %06x\n", xga->accel.command, srcbase, dstbase, xga->from_to_vram, xga->accel.dir_cmd);
pclog("CMD = %08x: Y = %d, X = %d, patsrc = %02x, srcmap = %d, dstmap = %d, py = %d, sy = %d, dy = %d, width0 = %d, width1 = %d, width2 = %d, width3 = %d\n", xga->accel.command, xga->accel.y, xga->accel.x, xga->accel.pat_src, xga->accel.src_map, xga->accel.dst_map, xga->accel.py, xga->accel.sy, xga->accel.dy, xga->accel.px_map_width[0], xga->accel.px_map_width[1], xga->accel.px_map_width[2], xga->accel.px_map_width[3]);
#endif
while (xga->accel.y >= 0) {
if (xga->accel.command & 0xc0) {
if ((xga->accel.dx >= xga->accel.mask_map_origin_x_off) && (xga->accel.dx <= ((xga->accel.px_map_width[0] & 0xfff) + xga->accel.mask_map_origin_x_off)) && (xga->accel.dy >= xga->accel.mask_map_origin_y_off) && (xga->accel.dy <= ((xga->accel.px_map_height[0] & 0xfff) + xga->accel.mask_map_origin_y_off))) {
@@ -1453,9 +1507,11 @@ xga_bitblt(svga_t *svga)
}
}
// pclog("XGA bitblt linear endian reverse=%d, octanty=%d, src command = %08x, pxsrcmap=%x, pxdstmap=%x, srcmap=%d, patmap=%d, dstmap=%d, dstwidth=%d, dstheight=%d, srcwidth=%d, srcheight=%d, dstbase=%08x, srcbase=%08x.\n", xga->linear_endian_reverse, ydir, xga->accel.command, xga->accel.px_map_format[xga->accel.src_map] & 0x0f, xga->accel.px_map_format[xga->accel.dst_map] & 0x0f, xga->accel.src_map, xga->accel.pat_src, xga->accel.dst_map, dstwidth, dstheight, srcwidth, srcheight, dstbase, srcbase);
// pclog("Pattern Map = %d: CMD = %08x: PATBase = %08x, SRCBase = %08x, DSTBase = %08x\n", xga->accel.pat_src, xga->accel.command, patbase, srcbase, dstbase);
// pclog("CMD = %08x: Y = %d, X = %d, patsrc = %02x, srcmap = %d, dstmap = %d, py = %d, sy = %d, dy = %d, width0 = %d, width1 = %d, width2 = %d, width3 = %d\n", xga->accel.command, xga->accel.y, xga->accel.x, xga->accel.pat_src, xga->accel.src_map, xga->accel.dst_map, xga->accel.py, xga->accel.sy, xga->accel.dy, xga->accel.px_map_width[0], xga->accel.px_map_width[1], xga->accel.px_map_width[2], xga->accel.px_map_width[3]);
#if 0
pclog("XGA bitblt linear endian reverse=%d, octanty=%d, src command = %08x, pxsrcmap=%x, pxdstmap=%x, srcmap=%d, patmap=%d, dstmap=%d, dstwidth=%d, dstheight=%d, srcwidth=%d, srcheight=%d, dstbase=%08x, srcbase=%08x.\n", xga->linear_endian_reverse, ydir, xga->accel.command, xga->accel.px_map_format[xga->accel.src_map] & 0x0f, xga->accel.px_map_format[xga->accel.dst_map] & 0x0f, xga->accel.src_map, xga->accel.pat_src, xga->accel.dst_map, dstwidth, dstheight, srcwidth, srcheight, dstbase, srcbase);
pclog("Pattern Map = %d: CMD = %08x: PATBase = %08x, SRCBase = %08x, DSTBase = %08x\n", xga->accel.pat_src, xga->accel.command, patbase, srcbase, dstbase);
pclog("CMD = %08x: Y = %d, X = %d, patsrc = %02x, srcmap = %d, dstmap = %d, py = %d, sy = %d, dy = %d, width0 = %d, width1 = %d, width2 = %d, width3 = %d\n", xga->accel.command, xga->accel.y, xga->accel.x, xga->accel.pat_src, xga->accel.src_map, xga->accel.dst_map, xga->accel.py, xga->accel.sy, xga->accel.dy, xga->accel.px_map_width[0], xga->accel.px_map_width[1], xga->accel.px_map_width[2], xga->accel.px_map_width[3]);
#endif
while (xga->accel.y >= 0) {
mix = xga_accel_read_pattern_map_pixel(svga, xga->accel.px, xga->accel.py, xga->accel.pat_src, patbase, patwidth + 1);
@@ -1646,7 +1702,9 @@ xga_mem_write(uint32_t addr, uint32_t val, xga_t *xga, svga_t *svga, int len)
xga->accel.short_stroke_vector3 = (xga->accel.short_stroke >> 16) & 0xff;
xga->accel.short_stroke_vector4 = (xga->accel.short_stroke >> 24) & 0xff;
// pclog("1Vector = %02x, 2Vector = %02x, 3Vector = %02x, 4Vector = %02x\n", xga->accel.short_stroke_vector1, xga->accel.short_stroke_vector2, xga->accel.short_stroke_vector3, xga->accel.short_stroke_vector4);
#if 0
pclog("1Vector = %02x, 2Vector = %02x, 3Vector = %02x, 4Vector = %02x\n", xga->accel.short_stroke_vector1, xga->accel.short_stroke_vector2, xga->accel.short_stroke_vector3, xga->accel.short_stroke_vector4);
#endif
xga_short_stroke(svga, xga->accel.short_stroke_vector1);
xga_short_stroke(svga, xga->accel.short_stroke_vector2);
xga_short_stroke(svga, xga->accel.short_stroke_vector3);
@@ -1917,39 +1975,54 @@ exec_command:
xga->accel.dst_map = ((xga->accel.command >> 16) & 0x0f);
xga->accel.src_map = ((xga->accel.command >> 20) & 0x0f);
// if (xga->accel.pat_src) {
// pclog("[%04X:%08X]: Accel Command = %02x, full = %08x, patwidth = %d, dstwidth = %d, srcwidth = %d, patheight = %d, dstheight = %d, srcheight = %d, px = %d, py = %d, dx = %d, dy = %d, sx = %d, sy = %d, patsrc = %d, dstmap = %d, srcmap = %d, dstbase = %08x, srcbase = %08x, patbase = %08x, dstformat = %x, srcformat = %x, planemask = %08x\n",
// CS, cpu_state.pc, ((xga->accel.command >> 24) & 0x0f), xga->accel.command, xga->accel.px_map_width[xga->accel.pat_src],
// xga->accel.px_map_width[xga->accel.dst_map], xga->accel.px_map_width[xga->accel.src_map],
// xga->accel.px_map_height[xga->accel.pat_src], xga->accel.px_map_height[xga->accel.dst_map],
// xga->accel.px_map_height[xga->accel.src_map],
// xga->accel.pat_map_x, xga->accel.pat_map_y,
// xga->accel.dst_map_x, xga->accel.dst_map_y,
// xga->accel.src_map_x, xga->accel.src_map_y,
// xga->accel.pat_src, xga->accel.dst_map, xga->accel.src_map,
// xga->accel.px_map_base[xga->accel.dst_map], xga->accel.px_map_base[xga->accel.src_map], xga->accel.px_map_base[xga->accel.pat_src],
// xga->accel.px_map_format[xga->accel.dst_map] & 0x0f, xga->accel.px_map_format[xga->accel.src_map] & 0x0f, xga->accel.plane_mask);
// //pclog("\n");
// }
#if 0
if (xga->accel.pat_src) {
pclog("[%04X:%08X]: Accel Command = %02x, full = %08x, patwidth = %d, dstwidth = %d, srcwidth = %d, patheight = %d, dstheight = %d, srcheight = %d, px = %d, py = %d, dx = %d, dy = %d, sx = %d, sy = %d, patsrc = %d, dstmap = %d, srcmap = %d, dstbase = %08x, srcbase = %08x, patbase = %08x, dstformat = %x, srcformat = %x, planemask = %08x\n",
CS, cpu_state.pc, ((xga->accel.command >> 24) & 0x0f), xga->accel.command, xga->accel.px_map_width[xga->accel.pat_src],
xga->accel.px_map_width[xga->accel.dst_map], xga->accel.px_map_width[xga->accel.src_map],
xga->accel.px_map_height[xga->accel.pat_src], xga->accel.px_map_height[xga->accel.dst_map],
xga->accel.px_map_height[xga->accel.src_map],
xga->accel.pat_map_x, xga->accel.pat_map_y,
xga->accel.dst_map_x, xga->accel.dst_map_y,
xga->accel.src_map_x, xga->accel.src_map_y,
xga->accel.pat_src, xga->accel.dst_map, xga->accel.src_map,
xga->accel.px_map_base[xga->accel.dst_map], xga->accel.px_map_base[xga->accel.src_map], xga->accel.px_map_base[xga->accel.pat_src],
xga->accel.px_map_format[xga->accel.dst_map] & 0x0f, xga->accel.px_map_format[xga->accel.src_map] & 0x0f, xga->accel.plane_mask);
pclog("\n");
}
#endif
switch ((xga->accel.command >> 24) & 0x0f) {
case 3: /*Bresenham Line Draw Read*/
//pclog("Line Draw Read\n");
#if 0
pclog("Line Draw Read\n");
#endif
break;
case 4: /*Short Stroke Vectors*/
//pclog("Short Stroke Vectors.\n");
#if 0
pclog("Short Stroke Vectors.\n");
#endif
break;
case 5: /*Bresenham Line Draw Write*/
//pclog("Line Draw Write.\n");
#if 0
pclog("Line Draw Write.\n");
#endif
xga_line_draw_write(svga);
break;
case 8: /*BitBLT*/
xga_bitblt(svga);
break;
case 9: /*Inverting BitBLT*/
//pclog("Inverting BitBLT\n");
#if 0
pclog("Inverting BitBLT\n");
#endif
break;
case 0x0a: /*Area Fill*/
//pclog("Area Fill.\n");
#if 0
pclog("Area Fill.\n");
#endif
break;
default:
break;
}
} else if (len == 2) {
@@ -1974,42 +2047,51 @@ exec_command:
goto exec_command;
}
break;
default:
break;
}
}
}
static void
xga_memio_writeb(uint32_t addr, uint8_t val, void *p)
xga_memio_writeb(uint32_t addr, uint8_t val, void *priv)
{
svga_t *svga = (svga_t *) p;
svga_t *svga = (svga_t *) priv;
xga_t *xga = &svga->xga;
xga_mem_write(addr, val, xga, svga, 1);
// pclog("Write MEMIOB = %04x, val = %02x\n", addr & 0x7f, val);
#if 0
pclog("Write MEMIOB = %04x, val = %02x\n", addr & 0x7f, val);
#endif
}
static void
xga_memio_writew(uint32_t addr, uint16_t val, void *p)
xga_memio_writew(uint32_t addr, uint16_t val, void *priv)
{
svga_t *svga = (svga_t *) p;
svga_t *svga = (svga_t *) priv;
xga_t *xga = &svga->xga;
xga_mem_write(addr, val, xga, svga, 2);
// pclog("Write MEMIOW = %04x, val = %04x\n", addr & 0x7f, val);
#if 0
pclog("Write MEMIOW = %04x, val = %04x\n", addr & 0x7f, val);
#endif
}
static void
xga_memio_writel(uint32_t addr, uint32_t val, void *p)
xga_memio_writel(uint32_t addr, uint32_t val, void *priv)
{
svga_t *svga = (svga_t *) p;
svga_t *svga = (svga_t *) priv;
xga_t *xga = &svga->xga;
xga_mem_write(addr, val, xga, svga, 4);
// pclog("Write MEMIOL = %04x, val = %08x\n", addr & 0x7f, val);
#if 0
pclog("Write MEMIOL = %04x, val = %08x\n", addr & 0x7f, val);
#endif
}
static uint8_t
xga_mem_read(uint32_t addr, xga_t *xga, svga_t *svga)
xga_mem_read(uint32_t addr, xga_t *xga, UNUSED(svga_t *svga))
{
uint8_t temp = 0;
@@ -2083,6 +2165,9 @@ xga_mem_read(uint32_t addr, xga_t *xga, svga_t *svga)
case 0x7b:
temp = xga->accel.dst_map_y >> 8;
break;
default:
break;
}
}
@@ -2090,36 +2175,41 @@ xga_mem_read(uint32_t addr, xga_t *xga, svga_t *svga)
}
static uint8_t
xga_memio_readb(uint32_t addr, void *p)
xga_memio_readb(uint32_t addr, void *priv)
{
svga_t *svga = (svga_t *) p;
svga_t *svga = (svga_t *) priv;
xga_t *xga = &svga->xga;
uint8_t temp;
temp = xga_mem_read(addr, xga, svga);
// pclog("[%04X:%08X]: Read MEMIOB = %04x, temp = %02x\n", CS, cpu_state.pc, addr, temp);
#if 0
pclog("[%04X:%08X]: Read MEMIOB = %04x, temp = %02x\n", CS, cpu_state.pc, addr, temp);
#endif
return temp;
}
static uint16_t
xga_memio_readw(uint32_t addr, void *p)
xga_memio_readw(uint32_t addr, void *priv)
{
svga_t *svga = (svga_t *) p;
svga_t *svga = (svga_t *) priv;
xga_t *xga = &svga->xga;
uint16_t temp;
temp = xga_mem_read(addr, xga, svga);
temp |= (xga_mem_read(addr + 1, xga, svga) << 8);
// pclog("[%04X:%08X]: Read MEMIOW = %04x, temp = %04x\n", CS, cpu_state.pc, addr, temp);
#if 0
pclog("[%04X:%08X]: Read MEMIOW = %04x, temp = %04x\n", CS, cpu_state.pc, addr, temp);
#endif
return temp;
}
static uint32_t
xga_memio_readl(uint32_t addr, void *p)
xga_memio_readl(uint32_t addr, void *priv)
{
svga_t *svga = (svga_t *) p;
svga_t *svga = (svga_t *) priv;
xga_t *xga = &svga->xga;
uint32_t temp;
@@ -2128,7 +2218,9 @@ xga_memio_readl(uint32_t addr, void *p)
temp |= (xga_mem_read(addr + 2, xga, svga) << 16);
temp |= (xga_mem_read(addr + 3, xga, svga) << 24);
// pclog("Read MEMIOL = %04x, temp = %08x\n", addr, temp);
#if 0
pclog("Read MEMIOL = %04x, temp = %08x\n", addr, temp);
#endif
return temp;
}
@@ -2173,6 +2265,9 @@ xga_hwcursor_draw(svga_t *svga, int displine)
/* Complement */
p[x_pos] ^= 0xffffff;
break;
default:
break;
}
}
@@ -2291,9 +2386,9 @@ xga_render_16bpp(xga_t *xga, svga_t *svga)
}
static void
xga_write(uint32_t addr, uint8_t val, void *p)
xga_write(uint32_t addr, uint8_t val, void *priv)
{
svga_t *svga = (svga_t *) p;
svga_t *svga = (svga_t *) priv;
xga_t *xga = &svga->xga;
if (!xga->on) {
@@ -2319,10 +2414,10 @@ xga_write(uint32_t addr, uint8_t val, void *p)
}
static void
xga_writew(uint32_t addr, uint16_t val, void *p)
xga_writew(uint32_t addr, uint16_t val, void *priv)
{
svga_t *svga = (svga_t *) p;
xga_t *xga = &svga->xga;
svga_t *svga = (svga_t *) priv;
const xga_t *xga = &svga->xga;
if (!xga->on) {
svga_writew(addr, val, svga);
@@ -2334,10 +2429,10 @@ xga_writew(uint32_t addr, uint16_t val, void *p)
}
static void
xga_writel(uint32_t addr, uint32_t val, void *p)
xga_writel(uint32_t addr, uint32_t val, void *priv)
{
svga_t *svga = (svga_t *) p;
xga_t *xga = &svga->xga;
svga_t *svga = (svga_t *) priv;
const xga_t *xga = &svga->xga;
if (!xga->on) {
svga_writel(addr, val, svga);
@@ -2350,12 +2445,11 @@ xga_writel(uint32_t addr, uint32_t val, void *p)
xga_write(addr + 3, (val >> 24) & 0xff, svga);
}
static uint8_t
xga_read(uint32_t addr, void *p)
xga_read(uint32_t addr, void *priv)
{
svga_t *svga = (svga_t *) p;
xga_t *xga = &svga->xga;
svga_t *svga = (svga_t *) priv;
const xga_t *xga = &svga->xga;
uint8_t ret = 0xff;
if (!xga->on)
@@ -2380,10 +2474,10 @@ xga_read(uint32_t addr, void *p)
}
static uint16_t
xga_readw(uint32_t addr, void *p)
xga_readw(uint32_t addr, void *priv)
{
svga_t *svga = (svga_t *) p;
xga_t *xga = &svga->xga;
svga_t *svga = (svga_t *) priv;
const xga_t *xga = &svga->xga;
uint16_t ret = 0xffff;
if (!xga->on)
@@ -2396,10 +2490,10 @@ xga_readw(uint32_t addr, void *p)
}
static uint32_t
xga_readl(uint32_t addr, void *p)
xga_readl(uint32_t addr, void *priv)
{
svga_t *svga = (svga_t *) p;
xga_t *xga = &svga->xga;
svga_t *svga = (svga_t *) priv;
const xga_t *xga = &svga->xga;
uint32_t ret = 0xffffffff;
if (!xga->on)
@@ -2414,9 +2508,9 @@ xga_readl(uint32_t addr, void *p)
}
static void
xga_write_linear(uint32_t addr, uint8_t val, void *p)
xga_write_linear(uint32_t addr, uint8_t val, void *priv)
{
svga_t *svga = (svga_t *) p;
svga_t *svga = (svga_t *) priv;
xga_t *xga = &svga->xga;
if (!xga->on) {
@@ -2446,42 +2540,42 @@ xga_write_linear(uint32_t addr, uint8_t val, void *p)
}
static void
xga_writew_linear(uint32_t addr, uint16_t val, void *p)
xga_writew_linear(uint32_t addr, uint16_t val, void *priv)
{
svga_t *svga = (svga_t *) p;
xga_t *xga = &svga->xga;
svga_t *svga = (svga_t *) priv;
const xga_t *xga = &svga->xga;
if (!xga->on) {
svga_writew_linear(addr, val, svga);
return;
}
xga_write_linear(addr, val, p);
xga_write_linear(addr + 1, val >> 8, p);
xga_write_linear(addr, val, priv);
xga_write_linear(addr + 1, val >> 8, priv);
}
static void
xga_writel_linear(uint32_t addr, uint32_t val, void *p)
xga_writel_linear(uint32_t addr, uint32_t val, void *priv)
{
svga_t *svga = (svga_t *) p;
xga_t *xga = &svga->xga;
svga_t *svga = (svga_t *) priv;
const xga_t *xga = &svga->xga;
if (!xga->on) {
svga_writel_linear(addr, val, svga);
return;
}
xga_write_linear(addr, val, p);
xga_write_linear(addr + 1, val >> 8, p);
xga_write_linear(addr + 2, val >> 16, p);
xga_write_linear(addr + 3, val >> 24, p);
xga_write_linear(addr, val, priv);
xga_write_linear(addr + 1, val >> 8, priv);
xga_write_linear(addr + 2, val >> 16, priv);
xga_write_linear(addr + 3, val >> 24, priv);
}
static uint8_t
xga_read_linear(uint32_t addr, void *p)
xga_read_linear(uint32_t addr, void *priv)
{
svga_t *svga = (svga_t *) p;
xga_t *xga = &svga->xga;
svga_t *svga = (svga_t *) priv;
const xga_t *xga = &svga->xga;
uint8_t ret = 0xff;
if (!xga->on)
@@ -2508,10 +2602,10 @@ xga_read_linear(uint32_t addr, void *p)
}
static uint16_t
xga_readw_linear(uint32_t addr, void *p)
xga_readw_linear(uint32_t addr, void *priv)
{
svga_t *svga = (svga_t *) p;
xga_t *xga = &svga->xga;
svga_t *svga = (svga_t *) priv;
const xga_t *xga = &svga->xga;
uint16_t ret;
if (!xga->on)
@@ -2524,10 +2618,10 @@ xga_readw_linear(uint32_t addr, void *p)
}
static uint32_t
xga_readl_linear(uint32_t addr, void *p)
xga_readl_linear(uint32_t addr, void *priv)
{
svga_t *svga = (svga_t *) p;
xga_t *xga = &svga->xga;
svga_t *svga = (svga_t *) priv;
const xga_t *xga = &svga->xga;
uint32_t ret;
if (!xga->on)
@@ -2553,6 +2647,9 @@ xga_do_render(svga_t *svga)
case 4:
xga_render_16bpp(xga, svga);
break;
default:
break;
}
svga->x_add = (overscan_x >> 1);
@@ -2713,14 +2810,17 @@ xga_poll(xga_t *xga, svga_t *svga)
static uint8_t
xga_mca_read(int port, void *priv)
{
svga_t *svga = (svga_t *) priv;
xga_t *xga = &svga->xga;
const svga_t *svga = (svga_t *) priv;
const xga_t *xga = &svga->xga;
uint8_t ret = xga->pos_regs[port & 7];
if (((port & 7) == 3) && !(ret & 1)) /*Always enable the mapping.*/
ret |= 1;
//pclog("[%04X:%08X]: POS Read Port = %x, val = %02x\n", CS, cpu_state.pc, port & 7, xga->pos_regs[port & 7]);
#if 0
pclog("[%04X:%08X]: POS Read Port = %x, val = %02x\n", CS, cpu_state.pc, port & 7, xga->pos_regs[port & 7]);
#endif
return ret;
}
@@ -2760,22 +2860,24 @@ xga_mca_write(int port, uint8_t val, void *priv)
else
mem_mapping_set_addr(&xga->memio_mapping, xga->rom_addr + 0x1c00 + (xga->instance * 0x80), 0x80);
}
//pclog("[%04X:%08X]: POS Write Port = %x, val = %02x, linear base = %08x, instance = %d, rom addr = %05x\n", CS, cpu_state.pc, port & 7, val, xga->linear_base, xga->instance, xga->rom_addr);
#if 0
pclog("[%04X:%08X]: POS Write Port = %x, val = %02x, linear base = %08x, instance = %d, rom addr = %05x\n", CS, cpu_state.pc, port & 7, val, xga->linear_base, xga->instance, xga->rom_addr);
#endif
}
static uint8_t
xga_mca_feedb(void *priv)
{
svga_t *svga = (svga_t *) priv;
xga_t *xga = &svga->xga;
const svga_t *svga = (svga_t *) priv;
const xga_t *xga = &svga->xga;
return xga->pos_regs[2] & 1;
}
static void
xga_mca_reset(void *p)
xga_mca_reset(void *priv)
{
svga_t *svga = (svga_t *) p;
svga_t *svga = (svga_t *) priv;
xga_t *xga = &svga->xga;
xga->on = 0;
@@ -2784,9 +2886,9 @@ xga_mca_reset(void *p)
}
static void
xga_reset(void *p)
xga_reset(void *priv)
{
svga_t *svga = (svga_t *) p;
svga_t *svga = (svga_t *) priv;
xga_t *xga = &svga->xga;
mem_mapping_disable(&xga->bios_rom.mapping);
@@ -2828,7 +2930,9 @@ xga_pos_in(uint16_t addr, void *priv)
ret = xga->pos_regs[3];
} else
ret = 0;
//pclog("POS IDX for 0103 = %d, ret = %02x.\n", xga->pos_idx & 3, ret);
#if 0
pclog("POS IDX for 0103 = %d, ret = %02x.\n", xga->pos_idx & 3, ret);
#endif
break;
case 0x0104:
switch (xga->pos_idx & 3) {
@@ -2844,8 +2948,13 @@ xga_pos_in(uint16_t addr, void *priv)
case 3:
ret = 0;
break;
default:
break;
}
//pclog("POS IDX for 0104 = %d, ret = %02x.\n", xga->pos_idx & 3, ret);
#if 0
pclog("POS IDX for 0104 = %d, ret = %02x.\n", xga->pos_idx & 3, ret);
#endif
break;
case 0x0108:
case 0x0109:
@@ -2863,6 +2972,9 @@ xga_pos_in(uint16_t addr, void *priv)
ret |= xga->isa_pos_enable;
break;
default:
break;
}
} else {
switch (addr) {
@@ -2897,6 +3009,9 @@ xga_pos_in(uint16_t addr, void *priv)
ret |= xga->isa_pos_enable;
break;
default:
break;
}
}
return ret;
@@ -2914,8 +3029,10 @@ xga_pos_out(uint16_t addr, uint8_t val, void *priv)
xga->pos_idx = (xga->pos_idx & 0x00ff) | (val << 8);
break;
case 0x0107:
xga->pos_idx = (xga->pos_idx & 0xff00) | (val);
//pclog("POS IDX Write = %04x.\n", xga->pos_idx);
xga->pos_idx = (xga->pos_idx & 0xff00) | val;
#if 0
pclog("POS IDX Write = %04x.\n", xga->pos_idx);
#endif
break;
case 0x0108:
case 0x0109:
@@ -2928,6 +3045,9 @@ xga_pos_out(uint16_t addr, uint8_t val, void *priv)
xga->instance_num = addr & 7;
xga->isa_pos_enable = val & 0x08;
break;
default:
break;
}
} else {
switch (addr) {
@@ -2942,12 +3062,14 @@ xga_pos_out(uint16_t addr, uint8_t val, void *priv)
xga->instance_num = addr & 7;
xga->isa_pos_enable = val & 0x08;
break;
default:
break;
}
}
}
static void
*
static void *
xga_init(const device_t *info)
{
if (svga_get_pri() == NULL)
@@ -3044,8 +3166,7 @@ static void
return svga;
}
static void
*
static void *
svga_xga_init(const device_t *info)
{
svga_t *svga = malloc(sizeof(svga_t));
@@ -3070,9 +3191,9 @@ static void
}
static void
xga_close(void *p)
xga_close(void *priv)
{
svga_t *svga = (svga_t *) p;
svga_t *svga = (svga_t *) priv;
xga_t *xga = &svga->xga;
if (svga) {
@@ -3094,17 +3215,17 @@ inmos_xga_available(void)
}
static void
xga_speed_changed(void *p)
xga_speed_changed(void *priv)
{
svga_t *svga = (svga_t *) p;
svga_t *svga = (svga_t *) priv;
svga_recalctimings(svga);
}
static void
xga_force_redraw(void *p)
xga_force_redraw(void *priv)
{
svga_t *svga = (svga_t *) p;
svga_t *svga = (svga_t *) priv;
svga->fullchange = svga->monitor->mon_changeframecount;
}