From 63b4209414d53d9ed831e88229ccb074a1ea5528 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Mon, 27 Jun 2022 17:01:02 +0200 Subject: [PATCH] And finally, more fixes to the XGA implementation including: Cursor and mapping on Windows 2.x' 286/808x XGA driver. Pattern and DMA bus master fixes to OS/2 2.x/Warp's XGA driver. Software reset no longer causes glitches to the screen using XGA (x86.c) --- src/cpu/x86.c | 2 +- src/include/86box/vid_xga.h | 5 +- src/video/vid_xga.c | 547 ++++++++---------------------------- 3 files changed, 122 insertions(+), 432 deletions(-) diff --git a/src/cpu/x86.c b/src/cpu/x86.c index 77dd3b139..e8370a5b5 100644 --- a/src/cpu/x86.c +++ b/src/cpu/x86.c @@ -343,7 +343,7 @@ softresetx86(void) if (soft_reset_mask) return; - if (ibm8514_enabled) + if (ibm8514_enabled || xga_enabled) vga_on = 1; reset_common(0); diff --git a/src/include/86box/vid_xga.h b/src/include/86box/vid_xga.h index f3bdd0a1c..aef837fba 100644 --- a/src/include/86box/vid_xga.h +++ b/src/include/86box/vid_xga.h @@ -63,6 +63,7 @@ typedef struct xga_t uint8_t pal_g, pal_g_prefetch; uint8_t pal_b, pal_b_prefetch; uint8_t sprite_data[1024]; + uint8_t scrollcache; uint8_t *vram, *changedvram; int16_t hwc_pos_x; @@ -88,11 +89,9 @@ typedef struct xga_t char_width, hwcursor_on; int pal_pos, pal_pos_prefetch; int on; - int op_mode_reset; + int op_mode_reset, linear_endian_reverse; int sprite_pos, sprite_pos_prefetch, cursor_data_on; int pal_test; - int dma_channel; - int from_to_vram; uint32_t linear_base, linear_size, banked_mask; uint32_t base_addr_1mb; diff --git a/src/video/vid_xga.c b/src/video/vid_xga.c index 1560debfd..ff0cd081f 100644 --- a/src/video/vid_xga.c +++ b/src/video/vid_xga.c @@ -44,15 +44,15 @@ xga_updatemapping(svga_t *svga) { xga_t *xga = &svga->xga; - //pclog("OpMode = %x, linear base = %08x, aperture cntl = %d\n", xga->op_mode, xga->linear_base, xga->aperture_cntl); - if ((xga->op_mode & 7) == 4) { + //pclog("OpMode = %x, linear base = %08x, aperture cntl = %d, opmodereset1 = %d, access mode = %x\n", xga->op_mode, xga->linear_base, xga->aperture_cntl, xga->op_mode_reset, xga->access_mode); + if ((xga->op_mode & 7) >= 4) { if (xga->aperture_cntl == 1) { - xga->op_mode_reset = 0; mem_mapping_disable(&svga->mapping); mem_mapping_set_addr(&xga->video_mapping, 0xa0000, 0x10000); mem_mapping_enable(&xga->video_mapping); xga->banked_mask = 0xffff; - mem_mapping_disable(&xga->linear_mapping); + if (!xga->linear_endian_reverse) + mem_mapping_disable(&xga->linear_mapping); } else if (xga->aperture_cntl == 0) { linear: mem_mapping_disable(&svga->mapping); @@ -72,7 +72,6 @@ linear: xga->on = 0; vga_on = 1; } else { - xga->op_mode_reset = 0; mem_mapping_disable(&svga->mapping); mem_mapping_set_addr(&xga->video_mapping, 0xb0000, 0x10000); mem_mapping_enable(&xga->video_mapping); @@ -81,10 +80,8 @@ linear: } } else { if (!(xga->op_mode & 7)) { - xga->op_mode_reset = 1; goto linear; } - xga->op_mode_reset = 0; if (xga->aperture_cntl == 2) { mem_mapping_disable(&svga->mapping); mem_mapping_set_addr(&xga->video_mapping, 0xb0000, 0x10000); @@ -309,8 +306,14 @@ xga_ext_out_reg(xga_t *xga, svga_t *svga, uint8_t idx, uint8_t val) case 0x61: xga->sprite_pal_addr_idx = (xga->sprite_pal_addr_idx & 0xff) | ((val & 0x3f) << 8); xga->sprite_pos = xga->sprite_pal_addr_idx & 0x1ff; - if ((xga->sprite_pos >= 1) && (xga->sprite_pos <= 16)) - xga->cursor_data_on = 1; + if ((xga->sprite_pos >= 0) && (xga->sprite_pos <= 16)) { + if ((xga->op_mode & 7) >= 5) + xga->cursor_data_on = 1; + else if (xga->sprite_pos >= 1) + xga->cursor_data_on = 1; + else if (xga->aperture_cntl == 0) + xga->cursor_data_on = 0; + } if ((xga->sprite_pos > 16) && (xga->sprite_pos <= 0x1ff)) xga->cursor_data_on = 0; break; @@ -394,6 +397,9 @@ xga_ext_outb(uint16_t addr, uint8_t val, void *p) xga->aperture_cntl = val; xga_updatemapping(svga); break; + case 4: + xga->access_mode &= ~8; + break; case 6: vga_on = 0; xga->on = 1; @@ -401,13 +407,11 @@ xga_ext_outb(uint16_t addr, uint8_t val, void *p) case 8: xga->ap_idx = val; //pclog("Aperture CNTL = %d, val = %02x, up to bit6 = %02x\n", xga->aperture_cntl, val, val & 0x3f); - if (xga->aperture_cntl == 1) { - if ((xga->op_mode & 7) < 4) { - xga->write_bank = xga->read_bank = 0; - } else { - xga->write_bank = (xga->ap_idx & 0x3f) << 16; - xga->read_bank = xga->write_bank; - } + if ((xga->op_mode & 7) < 4) { + xga->write_bank = xga->read_bank = 0; + } else { + xga->write_bank = (xga->ap_idx & 0x3f) << 16; + xga->read_bank = xga->write_bank; } break; case 9: @@ -722,15 +726,10 @@ xga_accel_read_pattern_map_pixel(svga_t *svga, int x, int y, int map, uint32_t b int skip = 0; if (xga->base_addr_1mb) { - if (!xga->linear_base) { - if (addr < xga->linear_base) - skip = 1; - } else { - if (addr < xga->base_addr_1mb) - skip = 1; - } + if (addr < xga->base_addr_1mb || (addr > (xga->base_addr_1mb + 0xfffff))) + skip = 1; } else { - if (addr < xga->linear_base) + if (addr < xga->linear_base || (addr > (xga->linear_base + 0xfffff))) skip = 1; } @@ -742,17 +741,14 @@ xga_accel_read_pattern_map_pixel(svga_t *svga, int x, int y, int map, uint32_t b byte = mem_readb_phys(addr); } byte2 = byte; - if ((xga->aperture_cntl == 1) || !xga->op_mode_reset) - byte = mem_readb_phys(addr); - else if (xga->op_mode_reset) { - byte2 = mem_readb_phys(addr); - } else { - byte = mem_readb_phys(addr); - } - if ((xga->accel.px_map_format[map] & 8) && !(xga->access_mode & 8) && !xga->op_mode_reset) - bits = (x & 7); - else + if ((xga->accel.px_map_format[map] & 8) && !(xga->access_mode & 8)) + if (xga->linear_endian_reverse) + bits = 7 - (x & 7); + else + bits = (x & 7); + else { bits = 7 - (x & 7); + } px = (byte2 >> bits) & 1; return px; } @@ -769,15 +765,10 @@ xga_accel_read_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int int skip = 0; if (xga->base_addr_1mb) { - if (!xga->linear_base) { - if (addr < xga->linear_base) - skip = 1; - } else { - if (addr < xga->base_addr_1mb) - skip = 1; - } + if (addr < xga->base_addr_1mb || (addr > (xga->base_addr_1mb + 0xfffff))) + skip = 1; } else { - if (addr < xga->linear_base) + if (addr < xga->linear_base || (addr > (xga->linear_base + 0xfffff))) skip = 1; } @@ -791,38 +782,16 @@ xga_accel_read_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int byte = mem_readb_phys(addr); } byte2 = byte; - if ((xga->aperture_cntl == 1) || !xga->op_mode_reset) - byte = mem_readb_phys(addr); - else if (xga->op_mode_reset) { - byte2 = mem_readb_phys(addr); - } else { - byte = mem_readb_phys(addr); - } - if ((xga->accel.px_map_format[map] & 8) && !(xga->access_mode & 8) && !xga->op_mode_reset) - bits = (x & 7); - else + if ((xga->accel.px_map_format[map] & 8) && !(xga->access_mode & 8)) + if (xga->linear_endian_reverse) + bits = 7 - (x & 7); + else + bits = (x & 7); + else { bits = 7 - (x & 7); + } px = (byte2 >> bits) & 1; return px; - case 1: /*2-bit*/ - addr += (y * (width) >> 2); - addr += (x >> 2); - READ(addr, byte); - byte2 = byte; - if ((xga->accel.px_map_format[map] & 8) && !(xga->access_mode & 8)) - bits = (x & 3); - else - bits = 3 - (x & 3); - return (byte2 >> (bits << 1)) & 3; - case 2: /*4-bit*/ - addr += (y * (width) >> 1); - addr += (x >> 1); - READ(addr, byte); - if ((xga->accel.px_map_format[map] & 8) && !(xga->access_mode & 8)) - bits = (x & 1); - else - bits = 1 - (x & 1); - return (byte >> (bits << 2)) & 0x0f; case 3: /*8-bit*/ addr += (y * width); addr += x; @@ -832,18 +801,16 @@ xga_accel_read_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int byte = mem_readb_phys(addr); } byte2 = byte; - if ((xga->aperture_cntl == 1) || !xga->op_mode_reset) { - byte = mem_readb_phys(addr); - } else if (xga->op_mode_reset) { - byte2 = mem_readb_phys(addr); - } else { - byte = mem_readb_phys(addr); - } return byte2; case 4: /*16-bit*/ + width >>= 1; addr += (y * (width) << 1); addr += (x << 1); - READW(addr, byte); + if (!skip) { + READW(addr, byte); + } else { + byte = mem_readw_phys(addr); + } return byte; } @@ -860,15 +827,10 @@ xga_accel_write_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, ui int skip = 0; if (xga->base_addr_1mb) { - if (!xga->linear_base) { - if (addr < xga->linear_base) - skip = 1; - } else { - if (addr < xga->base_addr_1mb) - skip = 1; - } + if (addr < xga->base_addr_1mb || (addr > (xga->base_addr_1mb + 0xfffff))) + skip = 1; } else { - if (addr < xga->linear_base) + if (addr < xga->linear_base || (addr > (xga->linear_base + 0xfffff))) skip = 1; } @@ -882,45 +844,20 @@ xga_accel_write_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, ui byte = mem_readb_phys(addr); } byte2 = byte; - if ((xga->aperture_cntl == 1) || !xga->op_mode_reset) { - byte = mem_readb_phys(addr); - } else if (xga->op_mode_reset) { - byte2 = mem_readb_phys(addr); + if ((xga->accel.px_map_format[map] & 8) && !(xga->access_mode & 8)) { + if (xga->linear_endian_reverse) + mask = 1 << (7 - (x & 7)); + else + mask = 1 << (x & 7); } else { - byte = mem_readb_phys(addr); - } - if ((xga->accel.px_map_format[map] & 8) && !(xga->access_mode & 8) && !xga->op_mode_reset) - mask = 1 << (x & 7); - else mask = 1 << (7 - (x & 7)); + } byte2 = (byte2 & ~mask) | ((pixel ? 0xff : 0) & mask); if (!skip) { WRITE(addr, byte2); } mem_writeb_phys(addr, byte2); break; - case 1: /*2-bit*/ - addr += (y * (width) >> 2); - addr += (x >> 2); - READ(addr, byte); - if ((xga->accel.px_map_format[map] & 8) && !(xga->access_mode & 8)) - mask = 3 << ((x & 3) << 1); - else - mask = 3 << ((3 - (x & 3)) << 1); - byte = (byte & ~mask) | ((pixel ? 0xff : 0) & mask); - WRITE(addr, byte); - break; - case 2: /*4-bit*/ - addr += (y * (width) >> 1); - addr += (x >> 1); - READ(addr, byte); - if ((xga->accel.px_map_format[map] & 8) && !(xga->access_mode & 8)) - mask = 0x0f << ((x & 1) << 2); - else - mask = 0x0f << ((1 - (x & 1)) << 2); - byte = (byte & ~mask) | ((pixel ? 0xff : 0) & mask); - WRITE(addr, byte); - break; case 3: /*8-bit*/ addr += (y * width); addr += x; @@ -930,9 +867,13 @@ xga_accel_write_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, ui mem_writeb_phys(addr, pixel & 0xff); break; case 4: /*16-bit*/ + width >>= 1; addr += (y * (width) << 1); addr += (x << 1); - WRITEW(addr, pixel); + if (!skip) { + WRITEW(addr, pixel); + } + mem_writew_phys(addr, pixel); break; } } @@ -1241,176 +1182,6 @@ xga_line_draw_write(svga_t *svga) } } -#if 0 -static void -xga_line_draw_read(xga_t *xga) -{ - uint32_t src_dat = 0, dest_dat, old_dest_dat; - uint32_t out = 0; - int clip_t = xga->accel.mask_map_origin_y_off & 0xfff; - int clip_l = xga->accel.mask_map_origin_x_off & 0xfff; - int clip_b = xga->accel.px_map[0].height & 0xfff; - int clip_r = xga->accel.px_map[0].width & 0xfff; - int pixcnt = xga->accel.blt_width; - int count = -1; - int16_t dminor, dmajor, destxtmp, tmpswap; - int16_t cx, cy, dx, dy, err; - int16_t sx, sy, px, py; - int xdir = (xga->accel.octant & 0x04) ? -1 : 1; - int ydir = (xga->accel.octant & 0x02) ? -1 : 1; - int steep = 1; - int mix = 0; - uint8_t color_cmp = xga->accel.color_cmp & 0xff; - - - - dminor = xga->accel.bres_k1; - if (xga->accel.bres_k1 & 0x1000) - dminor |= ~0xfff; - dminor >>= 1; - - destxtmp = xga->accel.bres_k2; - if (xga->accel.bres_k2 & 0x1000) - destxtmp |= ~0xfff; - - dmajor = -(destxtmp - (dminor << 1)) >> 1; - - cx = dmajor; - cy = dminor; - - sx = xga->accel.dst_map_x & 0xfff; - sy = xga->accel.dst_map_y & 0xfff; - - dx = xga->accel.src_map_x & 0xfff; - dy = xga->accel.src_map_y & 0xfff; - - px = xga->accel.pat_map_x & 0xfff; - py = xga->accel.pat_map_y & 0xfff; - - err = xga->accel.bres_err_term; - if (xga->accel.bres_err_term & 0x1000) - err |= ~0xfff; - - if (xga->accel.octant & 0x01) { - steep = 0; - SWAP(sx, sy); - SWAP(dx, dy); - SWAP(px, py); - SWAP(xdir, ydir); - } - - xga->force_busy = 1; - - while (count--) { - if (steep) { - if (((dx >= clip_l) && (dx <= clip_r) && - (dy >= clip_t) && (dy <= clip_b)) || (xga->accel.mask_mode == 0)){ - if (xga->accel.pat_src == 8) - mix = xga_accel_read_map_pixel(xga, sx, sy, xga->accel.src_map + 1) & 0xff; - else if (xga->accel.pat_src == 7) { - mix = 1; - } else if (xga->accel.pat_src <= 2) { - mix = xga_accel_read_map_pixel(xga, px, py, xga->accel.pat_src + 1) & 0xff; - } - - if (mix) { - if (xga->accel.fore_src) - src_dat = xga_accel_read_map_pixel(xga, sx, sy, xga->accel.src_map + 1) & 0xff; - else - src_dat = xga->accel.frgd_color & 0xff; - } else { - if (xga->accel.bkgd_src) - src_dat = xga_accel_read_map_pixel(xga, sx, sy, xga->accel.src_map + 1) & 0xff; - else - src_dat = xga->accel.bkgd_color & 0xff; - } - - dest_dat = xga_accel_read_map_pixel(xga, dx, dy, xga->accel.dst_map + 1) & 0xff; - - if ((xga->accel.cc_cond == 4) || - ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || - ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || - ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || - ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || - ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || - ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) { - old_dest_dat = dest_dat; - MIX(mix, dest_dat, src_dat); - if (xga->accel.mask_mode) - dest_dat = (dest_dat & xga->accel.plane_mask) | (old_dest_dat & ~xga->accel.plane_mask); - if ((xga->accel.draw_mode == 0x20) && (pixcnt < xga->accel.blt_width)) - xga_accel_write_map_pixel(xga, dx, dy, xga->accel.dst_map + 1, dest_dat); - else if ((xga->accel.draw_mode == 0x10) && (pixcnt > 0)) - xga_accel_write_map_pixel(xga, dx, dy, xga->accel.dst_map + 1, dest_dat); - else - xga_accel_write_map_pixel(xga, dx, dy, xga->accel.dst_map + 1, dest_dat); - } - } - } else { - if (((dy >= clip_l) && (dy <= clip_r) && - (dx >= clip_t) && (dx <= clip_b)) || (xga->accel.mask_mode == 0)) { - if (xga->accel.pat_src == 8) - mix = xga_accel_read_map_pixel(xga, sy, sx, xga->accel.src_map + 1) & 0xff; - else if (xga->accel.pat_src == 7) { - mix = 1; - } else if (xga->accel.pat_src <= 2) { - mix = xga_accel_read_map_pixel(xga, py, px, xga->accel.pat_src + 1) & 0xff; - } - - if (mix) { - if (xga->accel.fore_src) - src_dat = xga_accel_read_map_pixel(xga, sy, sx, xga->accel.src_map + 1) & 0xff; - else - src_dat = xga->accel.frgd_color & 0xff; - } else { - if (xga->accel.bkgd_src) - src_dat = xga_accel_read_map_pixel(xga, sy, sx, xga->accel.src_map + 1) & 0xff; - else - src_dat = xga->accel.bkgd_color & 0xff; - } - - dest_dat = xga_accel_read_map_pixel(xga, dy, dx, xga->accel.dst_map + 1) & 0xff; - - if ((xga->accel.cc_cond == 4) || - ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || - ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || - ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || - ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || - ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || - ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) { - old_dest_dat = dest_dat; - MIX(mix, dest_dat, src_dat); - if (xga->accel.mask_mode) - dest_dat = (dest_dat & xga->accel.plane_mask) | (old_dest_dat & ~xga->accel.plane_mask); - if ((xga->accel.draw_mode == 0x20) && (pixcnt < xga->accel.blt_width)) - xga_accel_write_map_pixel(xga, dy, dx, xga->accel.dst_map + 1, dest_dat); - else if ((xga->accel.draw_mode == 0x10) && (pixcnt > 0)) - xga_accel_write_map_pixel(xga, dy, dx, xga->accel.dst_map + 1, dest_dat); - else - xga_accel_write_map_pixel(xga, dy, dx, xga->accel.dst_map + 1, dest_dat); - } - } - } - - if (pixcnt == xga->accel.blt_width) { - break; - } - - while (err > 0) { - sy += ydir; - dy += ydir; - py += ydir; - err -= (cx << 1); - } - sx += xdir; - dx += xdir; - px += xdir; - err += (cy << 1); - - pixcnt++; - } -} -#endif static int16_t xga_dst_wrap(int16_t addr) @@ -1466,11 +1237,20 @@ xga_bitblt(svga_t *svga) xga->accel.pattern = 1; else { if ((dstwidth == (xga->h_disp - 1)) && (srcwidth == 1)) { - if ((xga->accel.dst_map == 1) && (xga->accel.src_map == 2) && xga->op_mode_reset) { - if ((xga->accel.px_map_format[xga->accel.dst_map] == 0x0b) && (xga->accel.px_map_format[xga->accel.src_map] == 0x0b)) { + if ((xga->accel.dst_map == 1) && (xga->accel.src_map == 2) && xga->linear_endian_reverse) { + if ((xga->accel.px_map_format[xga->accel.dst_map] >= 0x0b) && (xga->accel.px_map_format[xga->accel.src_map] >= 0x0b)) { xga->accel.pattern = 1; } } + } else if ((dstwidth == (xga->h_disp - 1)) && (srcwidth == (xga->h_disp - 1))) { + if ((xga->accel.dst_map == 1) && (xga->accel.src_map == 1) && xga->linear_endian_reverse) { + if ((xga->accel.px_map_format[xga->accel.dst_map] >= 0x0b) && (xga->accel.px_map_format[xga->accel.src_map] >= 0x0b)) { + if ((xga->accel.command & 0xc0) == 0x40) + xga->accel.pattern = 0; + else + xga->accel.pattern = 1; + } + } } } @@ -1542,9 +1322,20 @@ xga_bitblt(svga_t *svga) xga->accel.pattern = 1; else { if (dstwidth == (xga->h_disp - 1)) { - if (!xga->accel.src_map && (xga->accel.dst_map == 1) && (xga->accel.pat_src == 2) && xga->op_mode_reset) { - if ((xga->accel.px_map_format[xga->accel.dst_map] == 0x0b) && (xga->accel.px <= 7) && (xga->accel.py <= 3)) { - xga->accel.pattern = 1; + if (srcwidth == (xga->h_disp - 1)) { + if ((xga->accel.src_map == 1) && (xga->accel.dst_map == 1) && (xga->accel.pat_src == 2) && xga->linear_endian_reverse) { + if ((xga->accel.px_map_format[xga->accel.dst_map] >= 0x0b) && (xga->accel.px <= 7) && (xga->accel.py <= 3)) { + xga->accel.pattern = 1; + } + } + } else { + if (!xga->accel.src_map && (xga->accel.dst_map == 1) && (xga->accel.pat_src == 2) && xga->linear_endian_reverse) { + if ((xga->accel.px_map_format[xga->accel.dst_map] >= 0x0b) && (xga->accel.px <= 7) && (xga->accel.py <= 3)) { + if ((patwidth >= 7) && ((xga->accel.command & 0xc0) == 0x40)) + xga->accel.pattern = 0; + else + xga->accel.pattern = 1; + } } } } @@ -1629,101 +1420,6 @@ xga_bitblt(svga_t *svga) } } -#if 0 -static void -xga_inverting_bitblt(xga_t *xga) -{ - uint32_t src_dat = 0, dest_dat, old_dest_dat; - uint32_t out = 0; - int clip_t = xga->accel.mask_map_origin_y_off & 0xfff; - int clip_l = xga->accel.mask_map_origin_x_off & 0xfff; - int clip_b = xga->accel.px_map[0].height & 0xfff; - int clip_r = xga->accel.px_map[0].width & 0xfff; - int count = -1; - int xdir = (xga->accel.octant & 0x04) ? 1 : -1; - int ydir = (xga->accel.octant & 0x02) ? 1 : -1; - int mix = 0; - int x = 0, y = 0; - int sx, sy, dx, dy, px, py; - uint8_t color_cmp = xga->accel.color_cmp & 0xff; - - sx = xga->accel.src_map_x & 0xfff; - sy = xga->accel.src_map_y & 0xfff; - - dx = xga->accel.dst_map_x & 0xfff; - dy = xga->accel.dst_map_y & 0xfff; - - px = xga->accel.pat_map_x & 0xfff; - py = xga->accel.pat_map_y & 0xfff; - - xga->force_busy = 1; - - while (count--) { - if (((dx <= clip_l) && (dx >= clip_r) && - (dy <= clip_t) && (dy >= clip_b)) || (xga->accel.mask_mode == 0)) { - if (xga->accel.pat_src == 8) - mix = xga_accel_read_map_pixel(xga, sx, sy, xga->accel.src_map + 1) & 0xff; - else if (xga->accel.pat_src == 7) { - mix = 1; - } else if (xga->accel.pat_src <= 2) { - mix = xga_accel_read_map_pixel(xga, px, py, xga->accel.pat_src + 1) & 0xff; - } - - if (mix) { - if (xga->accel.fore_src) - src_dat = xga_accel_read_map_pixel(xga, sx, sy, xga->accel.src_map + 1) & 0xff; - else - src_dat = xga->accel.frgd_color & 0xff; - } else { - if (xga->accel.bkgd_src) - src_dat = xga_accel_read_map_pixel(xga, sx, sy, xga->accel.src_map + 1) & 0xff; - else - src_dat = xga->accel.bkgd_color & 0xff; - } - - dest_dat = xga_accel_read_map_pixel(xga, dx, dy, xga->accel.dst_map + 1) & 0xff; - - if ((xga->accel.cc_cond == 4) || - ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || - ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || - ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || - ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || - ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || - ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) { - old_dest_dat = dest_dat; - MIX(mix, dest_dat, src_dat); - if (xga->accel.mask_mode) - dest_dat = (dest_dat & xga->accel.plane_mask) | (old_dest_dat & ~xga->accel.plane_mask); - xga_accel_write_map_pixel(xga, dx, dy, xga->accel.dst_map + 1, dest_dat); - } - } - - sx += xdir; - dx = xga_dstwrap(xga, dx + xdir); - px += xdir; - x++; - - if (x > xga->accel.blt_width) { - x = 0; - - px = xga->accel.pat_map_x & 0xfff; - py += ydir; - - dx = xga->accel.dst_map_x & 0xfff; - dy = xga_dstwrap(xga, dy + ydir); - - sx = xga->accel.src_map_x & 0xfff; - sy += ydir; - - y++; - - if (y > xga->accel.blt_height) - return; - } - } -} -#endif - static void xga_mem_write(uint32_t addr, uint32_t val, xga_t *xga, svga_t *svga, int len) { @@ -1761,27 +1457,27 @@ xga_mem_write(uint32_t addr, uint32_t val, xga_t *xga, svga_t *svga, int len) case 0x18: if (len == 4) { - xga->accel.px_map_width[xga->accel.px_map_idx] = val & 0xfff; - xga->accel.px_map_height[xga->accel.px_map_idx] = (val >> 16) & 0xfff; + xga->accel.px_map_width[xga->accel.px_map_idx] = val & 0xffff; + xga->accel.px_map_height[xga->accel.px_map_idx] = (val >> 16) & 0xffff; } else if (len == 2) { - xga->accel.px_map_width[xga->accel.px_map_idx] = val & 0xfff; + xga->accel.px_map_width[xga->accel.px_map_idx] = val & 0xffff; } else - xga->accel.px_map_width[xga->accel.px_map_idx] = (xga->accel.px_map_width[xga->accel.px_map_idx] & 0xf00) | val; + xga->accel.px_map_width[xga->accel.px_map_idx] = (xga->accel.px_map_width[xga->accel.px_map_idx] & 0xff00) | val; break; case 0x19: if (len == 1) - xga->accel.px_map_width[xga->accel.px_map_idx] = (xga->accel.px_map_width[xga->accel.px_map_idx] & 0xff) | ((val & 0x0f) << 8); + xga->accel.px_map_width[xga->accel.px_map_idx] = (xga->accel.px_map_width[xga->accel.px_map_idx] & 0xff) | (val << 8); break; case 0x1a: if (len == 2) - xga->accel.px_map_height[xga->accel.px_map_idx] = val & 0xfff; + xga->accel.px_map_height[xga->accel.px_map_idx] = val & 0xffff; else - xga->accel.px_map_height[xga->accel.px_map_idx] = (xga->accel.px_map_height[xga->accel.px_map_idx] & 0xf00) | val; + xga->accel.px_map_height[xga->accel.px_map_idx] = (xga->accel.px_map_height[xga->accel.px_map_idx] & 0xff00) | val; break; case 0x1b: if (len == 1) - xga->accel.px_map_height[xga->accel.px_map_idx] = (xga->accel.px_map_height[xga->accel.px_map_idx] & 0xff) | ((val & 0x0f) << 8); + xga->accel.px_map_height[xga->accel.px_map_idx] = (xga->accel.px_map_height[xga->accel.px_map_idx] & 0xff) | (val << 8); break; case 0x1c: @@ -2116,31 +1812,22 @@ exec_command: xga->accel.dst_map = ((xga->accel.command >> 16) & 0x0f); xga->accel.src_map = ((xga->accel.command >> 20) & 0x0f); - xga->accel.dir_cmd = xga->accel.command & 0x30000; - xga->from_to_vram = 0; - - if (xga->accel.dir_cmd == 0x20000) { - xga->from_to_vram = 2; - } else if (xga->accel.dir_cmd == 0x10000) { - xga->from_to_vram = 1; - } - - //if (xga->accel.pat_src || ((xga->accel.pat_src == 8) && (((xga->accel.command >> 28) & 3) == 2) && (((xga->accel.command >> 30) & 3) == 2))) { - //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\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); + //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\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); + // pclog("\n"); //} switch ((xga->accel.command >> 24) & 0x0f) { case 3: /*Bresenham Line Draw Read*/ - //xga_line_draw_read(xga); break; case 4: /*Short Stroke Vectors*/ break; @@ -2151,7 +1838,6 @@ exec_command: xga_bitblt(svga); break; case 9: /*Inverting BitBLT*/ - //xga_inverting_bitblt(xga); break; } } else if (len == 2) { @@ -2334,7 +2020,7 @@ xga_hwcursor_draw(svga_t *svga, int displine) int comb; uint32_t *p; uint8_t *cd; - int idx = ((xga->cursor_data_on && !xga->op_mode_reset) ? 32 : 0); + int idx = (xga->cursor_data_on) ? 32 : 0; if (xga->interlace && xga->hwcursor_oddeven) xga->hwcursor_latch.addr += 16; @@ -2457,7 +2143,7 @@ xga_render_16bpp(xga_t *xga, svga_t *svga) if ((xga->displine + svga->y_add) < 0) return; - if (xga->changedvram[svga->ma >> 12] || xga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange) { + if (xga->changedvram[xga->ma >> 12] || xga->changedvram[(xga->ma >> 12) + 1] || svga->fullchange) { p = &buffer32->line[xga->displine + svga->y_add][svga->x_add]; if (xga->firstline_draw == 2000) @@ -2956,7 +2642,6 @@ xga_mca_write(int port, uint8_t val, void *priv) mem_mapping_disable(&xga->memio_mapping); xga->on = 0; vga_on = 1; - xga->op_mode_reset = 0; /* Save the MCA register value. */ xga->pos_regs[port & 7] = val; @@ -3022,19 +2707,21 @@ static void xga->on = 0; xga->hwcursor.xsize = 64; xga->hwcursor.ysize = 64; + xga->bios_rom.sz = 0x2000; f = rom_fopen(XGA_BIOS_PATH, "rb"); (void)fseek(f, 0L, SEEK_END); temp = ftell(f); (void)fseek(f, 0L, SEEK_SET); - rom = malloc(0x2000); - (void)fread(rom, 0x2000, 1, f); - temp -= 0x2000; + rom = malloc(xga->bios_rom.sz); + memset(rom, 0xff, xga->bios_rom.sz); + (void)fread(rom, xga->bios_rom.sz, 1, f); + temp -= xga->bios_rom.sz; (void)fclose(f); xga->bios_rom.rom = rom; - xga->bios_rom.mask = 0x1fff; + xga->bios_rom.mask = xga->bios_rom.sz - 1; if (f != NULL) { free(rom); } @@ -3044,7 +2731,11 @@ static void xga->linear_base = 0; xga->instance = 0; xga->rom_addr = 0; - rom_init(&xga->bios_rom, XGA_BIOS_PATH, 0xdc000, 0x2000, xga->bios_rom.mask, 0, MEM_MAPPING_EXTERNAL); + mem_mapping_add(&xga->bios_rom.mapping, + 0xdc000, xga->bios_rom.sz, + rom_read, rom_readw, rom_readl, + NULL, NULL, NULL, + xga->bios_rom.rom, MEM_MAPPING_EXTERNAL, &xga->bios_rom); } else { xga->pos_regs[2] = 1 | 0x0c | 0xf0; xga->instance = (xga->pos_regs[2] & 0x0e) >> 1;