]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Custom chipset WIP updates.
authorToni Wilen <twilen@winuae.net>
Sat, 23 Oct 2021 17:04:40 +0000 (20:04 +0300)
committerToni Wilen <twilen@winuae.net>
Sat, 23 Oct 2021 17:04:40 +0000 (20:04 +0300)
blitter.cpp
custom.cpp
debug.cpp
inputdevice.cpp

index f5a2c5bf93b24236508fc56b399b0b0e8a9f76f5..b0f5d8049258d2008000e0c7110f9d97cee1ca48 100644 (file)
@@ -1311,7 +1311,7 @@ static bool decide_blitter_maybe_write2(int until_hpos, uaecptr addr, uae_u32 va
 {
        bool written = false;
        int hsync = until_hpos < 0;
-       
+
        if (hsync && blt_delayed_irq) {
                if (blt_delayed_irq > 0)
                        blt_delayed_irq--;
@@ -1325,11 +1325,7 @@ static bool decide_blitter_maybe_write2(int until_hpos, uaecptr addr, uae_u32 va
                until_hpos = maxhpos;
        }
 
-       if (last_blitter_hpos > until_hpos) {
-               goto end;
-       }
-
-       if (last_blitter_hpos == until_hpos) {
+       if (last_blitter_hpos >= until_hpos) {
                goto end;
        }
 
@@ -1967,7 +1963,6 @@ int blitnasty (void)
        if (!dmaen(DMA_BLITTER))
                return 0;
        if (blitter_cycle_exact) {
-               blitter_force_finish(false);
                return -1;
        }
        if (blit_last_cycle >= blit_cyclecount && blit_dmacount == blit_cyclecount)
index be71a949a41b8099a487a58e34b3c9d917898247..cb868bed10570c3670e5f4c3577ef43eea1be0db 100644 (file)
@@ -3776,14 +3776,18 @@ static void decide_line_decision_fetches(int endhpos)
 
 static void decide_fetch_safe(int endhpos)
 {
-       if (copper_enabled_thisline) {
-               update_copper(endhpos);
-               decide_blitter(endhpos);
-       } else if (!blt_info.blitter_dangerous_bpl) {
+       int hpos = last_fetch_hpos;
+       if (!blt_info.blitter_dangerous_bpl && !copper_enabled_thisline) {
                decide_line_decision_fetches(endhpos);
                decide_blitter(endhpos);
+       } else if (copper_enabled_thisline && blt_info.blitter_dangerous_bpl) {
+               while (hpos <= endhpos) {
+                       decide_line_decision_fetches(hpos);
+                       update_copper(hpos);
+                       decide_blitter(hpos);
+                       hpos++;
+               }
        } else {
-               int hpos = last_fetch_hpos;
                while (hpos <= endhpos) {
                        decide_line_decision_fetches(hpos);
                        decide_blitter(hpos);
@@ -8113,6 +8117,9 @@ static const int customdelay[]= {
 
 static void do_copper_fetch(int hpos, uae_u8 id)
 {
+       if (scandoubled_line) {
+               return;
+       }
        if (id == COPPER_CYCLE_IDLE) {
                // copper allocated cycle without DMA request
                alloc_cycle(hpos, CYCLE_COPPER);
@@ -9727,8 +9734,8 @@ static void reset_scandoubler_sync(int hpos)
        last_decide_sprite_hpos = hpos;
        last_fetch_hpos = hpos;
        last_copper_hpos = hpos;
-       last_diw_hpos = 0;
-       last_diw_hpos2 = 0;
+       last_diw_hpos = hpos;
+       last_diw_hpos2 = hpos;
        sprites_enabled_this_line = false;
        plfstrt_sprite = 0x100;
 }
@@ -9755,6 +9762,7 @@ static void reset_scandoubler_sync(int hpos)
 static void hsync_scandoubler(int hpos)
 {
        uae_u16 odmacon = dmacon;
+       int ocop = copper_enabled_thisline;
        uaecptr bpltmp[MAX_PLANES], bpltmpx[MAX_PLANES];
 
        if (vb_start_line > 1) {
@@ -9765,9 +9773,6 @@ static void hsync_scandoubler(int hpos)
        next_lineno++;
        scandoubled_line = 1;
        last_hdiw = 0 - 1;
-#ifdef DEBUGGER
-       debug_dma = 0;
-#endif
 
        for (int i = 0; i < MAX_PLANES; i++) {
                int diff;
@@ -9792,17 +9797,18 @@ static void hsync_scandoubler(int hpos)
                }
        }
 
+       reset_decisions_scanline_start();
+       reset_scandoubler_sync(hpos);
+       reset_decisions_hsync_start();
+
        // Bitplane only
        dmacon = odmacon & (DMA_MASTER | DMA_BITPLANE);
        // Blank last line
        if (vpos >= maxvpos - 1) {
                dmacon = 0;
        }
-       copper_enabled_thisline = 0;
 
-       reset_decisions_scanline_start();
-       reset_scandoubler_sync(hpos);
-       reset_decisions_hsync_start();
+       copper_enabled_thisline = 0;
 
        // copy color changes
        struct draw_info *dip1 = curr_drawinfo + next_lineno - 1;
@@ -9822,13 +9828,14 @@ static void hsync_scandoubler(int hpos)
        scandoubled_line = 0;
 
        dmacon = odmacon;
-       compute_spcflag_copper();
+       copper_enabled_thisline = ocop;
 
        for (int i = 0; i < MAX_PLANES; i++) {
                bplpt[i] = bpltmp[i];
                bplptx[i] = bpltmpx[i];
        }
 
+       reset_decisions_scanline_start();
        reset_scandoubler_sync(hpos);
 }
 
@@ -10955,7 +10962,7 @@ void vsync_event_done(void)
 // this prepares for new line
 static void hsync_handler_post(bool onvsync)
 {
-       memset(cycle_line_slot, 0, maxhpos);
+       memset(cycle_line_slot, 0, maxhpos + 1);
 
        // genlock active:
        // vertical: interlaced = toggles every other field, non-interlaced = both fields (normal)
@@ -11432,8 +11439,10 @@ static void audio_evhandler2(void)
 {
        // update copper first
        // if copper had written to audio registers
-       int hpos = current_hpos();
-       sync_copper(hpos);
+       if (copper_enabled_thisline) {
+               int hpos = current_hpos();
+               sync_copper(hpos);
+       }
        audio_evhandler();
 }
 
index 6ce6fc0189fbfae7c2b886044d013205b04db0ad..92344c8f3eb184754be753e5d90f4b89411c313c 100644 (file)
--- a/debug.cpp
+++ b/debug.cpp
@@ -1912,9 +1912,11 @@ void record_dma_read(uae_u16 reg, uae_u32 addr, int hpos, int vpos, int type, in
        dr = &dma_record[dma_record_toggle][vpos * NR_DMA_REC_HPOS + hpos];
        dma_record_frame[dma_record_toggle] = timeframes;
        if (dr->reg != 0xffff) {
-               dma_conflict(vpos, hpos, dr, reg, false);
-               dr->cf_reg = reg;
-               dr->cf_addr = addr;
+               if (dr->reg != reg) {
+                       dma_conflict(vpos, hpos, dr, reg, false);
+                       dr->cf_reg = reg;
+                       dr->cf_addr = addr;
+               }
                return;
        }
        dr->reg = reg;
index b149943ab485c5642665b13adc0477eb0b5c5433..56ce79daa9962daa5fbfbe01839d42376c512ea5 100644 (file)
@@ -2180,7 +2180,7 @@ static void mousehack_reset (void)
        tablet_data = 0;
        if (rtarea_bank.baseaddr) {
                put_long_host(rtarea_bank.baseaddr + RTAREA_INTXY, 0xffffffff);
-               if (mousehack_address)
+               if (mousehack_address && mousehack_address >= rtarea_bank.baseaddr && mousehack_address < rtarea_bank.baseaddr + 0x10000)
                        put_byte_host(mousehack_address + MH_E, 0);
        }
        mousehack_address = 0;