From: Toni Wilen Date: Wed, 23 Sep 2020 19:18:05 +0000 (+0300) Subject: Fix Cirrus Logic VRAM start if >2M board. Picaso IV 15-bit non-PC mode colors fixed... X-Git-Tag: 4900~307 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=124669bd5afcc1ccce27362dc734ec465a28c314;p=francis%2Fwinuae.git Fix Cirrus Logic VRAM start if >2M board. Picaso IV 15-bit non-PC mode colors fixed. Use total line count instead of visible count. --- diff --git a/gfxboard.cpp b/gfxboard.cpp index ed37af6e..967151ca 100644 --- a/gfxboard.cpp +++ b/gfxboard.cpp @@ -643,8 +643,9 @@ static void gfxboard_hsync_handler(void) gb->func->hsync(gb->userdata); } if (gb->pcemdev && !gb->pcem_vblank) { + extern int svga_get_vtotal(void); static int pollcnt; - int pollsize = gb->vga_height * 256 / 300; + int pollsize = svga_get_vtotal() * 256 / 300; if (pollsize < 256) pollsize = 256; pollcnt += pollsize; @@ -2453,9 +2454,9 @@ static void REGPARAM2 gfxboard_wput_mem_autoconfig (uaecptr addr, uae_u32 b) map_banks_z3(&gb->gfxboard_bank_special_pcem, start >> 16, PICASSOIV_REG >> 16); map_banks_z3(&gb->gfxboard_bank_io_swap_pcem, (start + PICASSOIV_REG) >> 16, 4); map_banks_z3(&gb->gfxboard_bank_vram_longswap_pcem, (start + PICASSOIV_VRAM1) >> 16, 0x400000 >> 16); - map_banks_z3(&gb->gfxboard_bank_vram_normal_pcem, (start + PICASSOIV_VRAM1 + 0x400000) >> 16, 0x400000 >> 16); -// map_banks_z3(&gb->gfxboard_bank_vram_normal_pcem, (start + PICASSOIV_VRAM2) >> 16, 0x400000 >> 16); -// map_banks_z3(&gb->gfxboard_bank_vram_wordswap_pcem, (start + PICASSOIV_VRAM2 + 0x400000) >> 16, 0x400000 >> 16); + map_banks_z3(&gb->gfxboard_bank_vram_wordswap_pcem, (start + PICASSOIV_VRAM1 + 0x400000) >> 16, 0x400000 >> 16); + map_banks_z3(&gb->gfxboard_bank_vram_longswap_pcem, (start + PICASSOIV_VRAM2) >> 16, 0x400000 >> 16); + map_banks_z3(&gb->gfxboard_bank_vram_wordswap_pcem, (start + PICASSOIV_VRAM2 + 0x400000) >> 16, 0x400000 >> 16); gb->pcem_mmio_offset = 0xb8000; gb->pcem_mmio_mask = 0xffff; gb->pcem_io_mask = 0x3fff; @@ -3883,7 +3884,6 @@ static uae_u32 REGPARAM2 gfxboard_bget_vram_wordswap_pcem(uaecptr addr) struct rtggfxboard *gb = getgfxboard(addr); addr = (addr - gb->gfxboardmem_start) & gb->banksize_mask; addr += gb->pcem_vram_offset; - addr ^= 1; uae_u8 v = pcem_linear_read_b(addr + pcem_mapping_linear_offset, pcem_mapping_linear_priv); return v; } @@ -3894,7 +3894,6 @@ static uae_u32 REGPARAM2 gfxboard_wget_vram_wordswap_pcem(uaecptr addr) addr = (addr - gb->gfxboardmem_start) & gb->banksize_mask; addr += gb->pcem_vram_offset; v = pcem_linear_read_w(addr + pcem_mapping_linear_offset, pcem_mapping_linear_priv); - v = do_byteswap_16(v); return v; } static uae_u32 REGPARAM2 gfxboard_lget_vram_wordswap_pcem(uaecptr addr) @@ -3904,7 +3903,7 @@ static uae_u32 REGPARAM2 gfxboard_lget_vram_wordswap_pcem(uaecptr addr) addr = (addr - gb->gfxboardmem_start) & gb->banksize_mask; addr += gb->pcem_vram_offset; v = pcem_linear_read_l(addr + pcem_mapping_linear_offset, pcem_mapping_linear_priv); - v = (do_byteswap_16(v >> 16) << 16) | do_byteswap_16(v); + v = (v >> 16) | (v << 16); return v; } static void REGPARAM2 gfxboard_bput_vram_wordswap_pcem(uaecptr addr, uae_u32 b) @@ -3913,7 +3912,6 @@ static void REGPARAM2 gfxboard_bput_vram_wordswap_pcem(uaecptr addr, uae_u32 b) addr = (addr - gb->gfxboardmem_start) & gb->banksize_mask; addr += gb->pcem_vram_offset; addr &= gb->pcem_vram_mask; - addr ^= 1; pcem_linear_write_b(addr + pcem_mapping_linear_offset, b, pcem_mapping_linear_priv); } static void REGPARAM2 gfxboard_wput_vram_wordswap_pcem(uaecptr addr, uae_u32 w) @@ -3921,7 +3919,6 @@ static void REGPARAM2 gfxboard_wput_vram_wordswap_pcem(uaecptr addr, uae_u32 w) struct rtggfxboard *gb = getgfxboard(addr); addr = (addr - gb->gfxboardmem_start) & gb->banksize_mask; addr += gb->pcem_vram_offset; - w = do_byteswap_16(w); addr &= gb->pcem_vram_mask; pcem_linear_write_w(addr + pcem_mapping_linear_offset, w, pcem_mapping_linear_priv); } @@ -3930,7 +3927,7 @@ static void REGPARAM2 gfxboard_lput_vram_wordswap_pcem(uaecptr addr, uae_u32 l) struct rtggfxboard *gb = getgfxboard(addr); addr = (addr - gb->gfxboardmem_start) & gb->banksize_mask; addr += gb->pcem_vram_offset; - l = (do_byteswap_16(l >> 16) << 16) | do_byteswap_16(l); + l = (l >> 16) | (l << 16); addr &= gb->pcem_vram_mask; pcem_linear_write_l(addr + pcem_mapping_linear_offset, l, pcem_mapping_linear_priv); } diff --git a/pcem/vid_cl5429.cpp b/pcem/vid_cl5429.cpp index 3040a80e..849ed71e 100644 --- a/pcem/vid_cl5429.cpp +++ b/pcem/vid_cl5429.cpp @@ -1156,8 +1156,11 @@ void gd5429_recalctimings(svga_t *svga) if (svga->seqregs[7] & 0x01) svga->render = svga_render_8bpp_highres; - svga->ma_latch |= ((svga->crtc[0x1b] & 0x01) << 16) | ((svga->crtc[0x1b] & 0xc) << 15); -// pclog("MA now %05X %02X\n", svga->ma_latch, svga->crtc[0x1b]); + svga->ma_latch |= ((svga->crtc[0x1b] & 0x01) << 16) | (((svga->crtc[0x1b] >> 2) & 3) << 17); + if (gd5429->type >= CL_TYPE_GD5436) { + svga->ma_latch |= (((svga->crtc[0x1d] >> 7) & 1) << 19); + } +// pclog("MA now %05X %02X\n", svga->ma_latch, svga->crtc[0x1b]); svga->bpp = 8; if (gd5429->hidden_dac_reg & 0x80) diff --git a/pcem/vid_svga.cpp b/pcem/vid_svga.cpp index 6b31e3f6..8cef1b55 100644 --- a/pcem/vid_svga.cpp +++ b/pcem/vid_svga.cpp @@ -21,6 +21,11 @@ uint8_t svga_rotate[8][256]; only SVGA device.*/ static svga_t *svga_pri; +int svga_get_vtotal(void) +{ + return svga_pri->vtotal; +} + void *svga_get_object(void) { return svga_pri; @@ -713,6 +718,7 @@ int svga_poll(void *p) if (svga->vsync_callback) svga->vsync_callback(svga); + eod = 1; } if (svga->vc == svga->vtotal) { @@ -735,7 +741,6 @@ int svga_poll(void *p) // pclog("Latch HWcursor addr %08X\n", svga_hwcursor_latch.addr); // pclog("ADDR %08X\n",hwcursor_addr); - eod = 1; } if (svga->sc == (svga->crtc[10] & 31)) svga->con = 1;