sonarlint vid_xga.c
This commit is contained in:
@@ -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;
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user