]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Fix Cirrus Logic VRAM start if >2M board. Picaso IV 15-bit non-PC mode colors fixed...
authorToni Wilen <twilen@winuae.net>
Wed, 23 Sep 2020 19:18:05 +0000 (22:18 +0300)
committerToni Wilen <twilen@winuae.net>
Wed, 23 Sep 2020 19:18:05 +0000 (22:18 +0300)
gfxboard.cpp
pcem/vid_cl5429.cpp
pcem/vid_svga.cpp

index ed37af6edfd900caa9d50b05f383f59ce7426e77..967151ca67c4361ad5e004c120b432e8b47977a5 100644 (file)
@@ -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);
 }
index 3040a80e1c7e898f304aa35683358fb4011aa606..849ed71ea3b049f0f29522c0b423d204759a70d6 100644 (file)
@@ -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)
index 6b31e3f6e04a9b376025e54313d47b2f9880b30b..8cef1b55a507b48f4a232bb92e670a62e9925853 100644 (file)
@@ -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;