From: Toni Wilen Date: Sat, 23 Oct 2021 17:04:40 +0000 (+0300) Subject: Custom chipset WIP updates. X-Git-Tag: 4900~35 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=19b834f331dd187f41dc9e1310468315604cf9fc;p=francis%2Fwinuae.git Custom chipset WIP updates. --- diff --git a/blitter.cpp b/blitter.cpp index f5a2c5bf..b0f5d804 100644 --- a/blitter.cpp +++ b/blitter.cpp @@ -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) diff --git a/custom.cpp b/custom.cpp index be71a949..cb868bed 100644 --- a/custom.cpp +++ b/custom.cpp @@ -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(); } diff --git a/debug.cpp b/debug.cpp index 6ce6fc01..92344c8f 100644 --- 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; diff --git a/inputdevice.cpp b/inputdevice.cpp index b149943a..56ce79da 100644 --- a/inputdevice.cpp +++ b/inputdevice.cpp @@ -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;