From af676e6f3000ba5ee21c01f72f9bfdd47823a721 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Fri, 25 Apr 2025 18:56:10 +0300 Subject: [PATCH] Drawing updates (NTSC fast mode glitch fix, fast RGA pipeline fix, lol state when calculating width, ECS superhires filtered lores, genlock filtered lores) --- custom.cpp | 82 +++--- drawing.cpp | 433 +++++++++++++++++++---------- genlinetoscr.cpp | 173 +++++++----- include/drawing.h | 7 +- linetoscr_aga_fm0_genlock.cpp | 8 + linetoscr_aga_fm1_genlock.cpp | 36 +++ linetoscr_aga_fm2_genlock.cpp | 60 ++++ linetoscr_ecs_fast.cpp | 20 ++ linetoscr_ecs_genlock_fast.cpp | 40 +++ linetoscr_ecs_shres.cpp | 232 ++++++++++++++++ linetoscr_ocs_ecs_genlock.cpp | 8 + linetoscr_ocs_ecs_ntsc_genlock.cpp | 8 + newcpu.cpp | 1 + 13 files changed, 848 insertions(+), 260 deletions(-) diff --git a/custom.cpp b/custom.cpp index 92600b15..ebbd3669 100644 --- a/custom.cpp +++ b/custom.cpp @@ -120,7 +120,8 @@ static int rga_denise_cycle, rga_denise_cycle_start, rga_denise_cycle_count; static int rga_denise_cycle_line = 1; static struct pipeline_reg preg; static struct pipeline_func pfunc[MAX_PIPELINE_REG]; -static uae_u16 prev_strobe, strobe_fast; +static uae_u16 prev_strobe; +static bool vb_fast, vb_fast_prev; static uae_u32 custom_state_flags; static int not_safe_mode; static bool dmal_next; @@ -561,6 +562,7 @@ static bool agnus_equdis; int maxhpos = MAXHPOS_PAL; static int maxhpos_long; int maxhpos_short = MAXHPOS_PAL; +static bool maxhpos_lol; int maxvpos = MAXVPOS_PAL; int maxvpos_nom = MAXVPOS_PAL; // nominal value (same as maxvpos but "faked" maxvpos in fake 60hz modes) static int maxvpos_long; @@ -1136,28 +1138,28 @@ static void set_chipset_mode(bool imm) } } if (imm || bplcon0 != bplcon0_saved) { - denise_update_reg(0x100, bplcon0); + denise_update_reg_queue(0x100, bplcon0, rga_denise_cycle_line); } if (imm || bplcon1 != bplcon1_saved) { - denise_update_reg(0x102, bplcon1); + denise_update_reg_queue(0x102, bplcon1, rga_denise_cycle_line); } if (imm || bplcon2 != bplcon2_saved) { - denise_update_reg(0x104, bplcon2); + denise_update_reg_queue(0x104, bplcon2, rga_denise_cycle_line); } if (imm || bplcon3 != bplcon3_saved) { - denise_update_reg(0x106, bplcon3); + denise_update_reg_queue(0x106, bplcon3, rga_denise_cycle_line); } if (imm || bplcon4 != bplcon4_saved) { - denise_update_reg(0x10c, bplcon4); + denise_update_reg_queue(0x10c, bplcon4, rga_denise_cycle_line); } if (imm) { - denise_update_reg(0x8e, diwstrt); + denise_update_reg_queue(0x8e, diwstrt, rga_denise_cycle_line); if (diwhigh_written) { - denise_update_reg(0x1e4, diwhigh); + denise_update_reg_queue(0x1e4, diwhigh, rga_denise_cycle_line); } } if (imm || fmode != fmode_saved) { - denise_update_reg(0x1fc, fmode); + denise_update_reg_queue(0x1fc, fmode, rga_denise_cycle_line); setup_fmodes(bplcon0); } } @@ -1630,9 +1632,9 @@ void compute_framesync(void) } if (currprefs.gfx_overscanmode >= OVERSCANMODE_ULTRA) { - vb->inwidth = current_linear_hpos << (res2 + 1); + vb->inwidth = current_linear_hpos_short << (res2 + 1); } else { - vb->inwidth = (current_linear_hpos - (display_hstart_cyclewait_skip + display_hstart_cyclewait_skip2)) << (res2 + 1); + vb->inwidth = (current_linear_hpos_short - (display_hstart_cyclewait_skip + display_hstart_cyclewait_skip2)) << (res2 + 1); } vb->inwidth2 = vb->inwidth; vb->extrawidth = -2; @@ -1646,8 +1648,11 @@ void compute_framesync(void) if (currprefs.gfx_overscanmode >= OVERSCANMODE_EXTREME) { vb->extrawidth = -1; } - int mfl = minfirstline + 1; - int maxv = current_linear_vpos - (mfl > vsync_startline ? mfl - vsync_startline : 0); + int mfl = minfirstline_linear; + if (currprefs.gfx_overscanmode < OVERSCANMODE_ULTRA) { + mfl += 2; + } + int maxv = current_linear_vpos - mfl; vb->inheight = maxv << vres2; vb->inheight2 = vb->inheight; vb->inxoffset = 0; @@ -2362,6 +2367,7 @@ static int GETHPOS(void) static void setmaxhpos(void) { maxhpos = maxhpos_short + lol; + maxhpos_lol = lol; maxhpos_long = linetoggle ? maxhpos_short + 1 : -1; maxhposm0 = maxhpos; maxhposm1 = maxhpos - 1; @@ -5037,7 +5043,7 @@ static void vsync_check_vsyncmode(void) current_linear_vpos != current_linear_vpos_temp) { current_linear_hpos = current_linear_hpos_temp; current_linear_vpos = current_linear_vpos_temp; - current_linear_hpos_short = current_linear_hpos - lol; + current_linear_hpos_short = current_linear_hpos - maxhpos_lol; current_linear_vpos_nom = current_linear_vpos - lof_store; init_beamcon0(); compute_framesync(); @@ -6645,6 +6651,7 @@ void custom_reset(bool hardreset, bool keyboardreset) maxvpos = ntsc ? MAXVPOS_NTSC : MAXVPOS_PAL; maxvpos_nom = ntsc ? MAXVPOS_NTSC : MAXVPOS_PAL; maxvpos_display = ntsc ? MAXVPOS_NTSC : MAXVPOS_PAL; + maxhpos_lol = false; } if (!savestate_state) { @@ -6758,6 +6765,7 @@ void custom_reset(bool hardreset, bool keyboardreset) maxhpos = ntsc ? MAXHPOS_NTSC : MAXHPOS_PAL; maxhpos_short = maxhpos; + maxhpos_lol = lol; updateextblk(); bplcon0_saved = bplcon0; @@ -7551,7 +7559,7 @@ static int REGPARAM2 custom_wput_1(uaecptr addr, uae_u32 value, int noget) // fast CPU RGA pipeline, allow multiple register writes per CCK if (!denise_update_reg_queued(addr, v, rga_denise_cycle_line)) { // if full: direct write - denise_update_reg(addr, value); + denise_update_reg_queue(addr, value, rga_denise_cycle_line); } } else { write_drga(addr, NULL, v); @@ -7824,22 +7832,23 @@ uae_u8 *restore_custom(uae_u8 *src) bitplane_dma_change(dmacon); calcvdiw(); - denise_update_reg(0x100, bplcon0); - denise_update_reg(0x102, bplcon1); - denise_update_reg(0x104, bplcon2); - denise_update_reg(0x106, bplcon3); - denise_update_reg(0x10c, bplcon4); - denise_update_reg(0x1e4, diwhigh); - denise_update_reg(0x08e, diwstrt); - denise_update_reg(0x090, diwstop); + denise_update_reg_queue(0x100, bplcon0, rga_denise_cycle_line); + denise_update_reg_queue(0x102, bplcon1, rga_denise_cycle_line); + denise_update_reg_queue(0x104, bplcon2, rga_denise_cycle_line); + denise_update_reg_queue(0x106, bplcon3, rga_denise_cycle_line); + denise_update_reg_queue(0x10c, bplcon4, rga_denise_cycle_line); + denise_update_reg_queue(0x1e4, diwhigh, rga_denise_cycle_line); + denise_update_reg_queue(0x08e, diwstrt, rga_denise_cycle_line); + denise_update_reg_queue(0x090, diwstop, rga_denise_cycle_line); if (diwhigh_written) { - denise_update_reg(0x1e4, diwhigh); + denise_update_reg_queue(0x1e4, diwhigh, rga_denise_cycle_line); } - denise_update_reg(0x1fc, fmode); - denise_update_reg(0x098, clxcon); - denise_update_reg(0x10e, clxcon2); - denise_update_reg(0x1c4, hbstrt); - denise_update_reg(0x1c6, hbstop); + denise_update_reg_queue(0x1fc, fmode, rga_denise_cycle_line); + denise_update_reg_queue(0x098, clxcon, rga_denise_cycle_line); + denise_update_reg_queue(0x10e, clxcon2, rga_denise_cycle_line); + denise_update_reg_queue(0x1c4, hbstrt, rga_denise_cycle_line); + denise_update_reg_queue(0x1c6, hbstop, rga_denise_cycle_line); + draw_denise_line_queue_flush(); docols(&denise_colors); docols(&agnus_colors); @@ -10462,7 +10471,7 @@ static int getlinetype(void) { int type = 0; - if (strobe_fast != 0x3c) { + if (vb_fast) { type = LINETYPE_BLANK; } else if (vdiwstate == diw_states::DIW_waiting_start || GET_PLANES(bplcon0) == 0 || !dmaen(DMA_BITPLANE)) { type = LINETYPE_BORDER; @@ -10699,11 +10708,11 @@ static bool checkprevfieldlinestateequal(void) int type = getlinetype(); if (type && type == l->type && displayresetcnt == l->cnt) { - if (type == LINETYPE_BLANK && strobe_fast != 0x3c) { + if (type == LINETYPE_BLANK && vb_fast) { if (1) { ret = true; } - } else if (type == LINETYPE_BORDER && strobe_fast == 0x3c && !l->blankedline) { + } else if (type == LINETYPE_BORDER && !vb_fast && !l->blankedline) { if (1) { uae_u32 c = ((bplcon0 & 1) && (bplcon3 & 0x20)) ? 0 : (aga_mode ? agnus_colors.color_regs_aga[0] : agnus_colors.color_regs_ecs[0]); if (!always && c == l->color0) { @@ -10713,7 +10722,7 @@ static bool checkprevfieldlinestateequal(void) ret = draw_border_fast(l, linear_display_vpos + 1); } } - } else if (type == LINETYPE_BPL && strobe_fast == 0x3c && !l->blankedline) { + } else if (type == LINETYPE_BPL && !vb_fast && !l->blankedline) { if (1) { int r = checkprevfieldlinestateequalbpl(l); if ((r && always) || (r && currprefs.cs_optimizations == DISPLAY_OPTIMIZATIONS_FULL)) { @@ -11186,7 +11195,11 @@ static void custom_trigger_start(void) } } #endif - strobe_fast = get_strobe_reg(0); + if (new_beamcon0 & BEAMCON0_VARVBEN) { + vb_fast = get_strobe_reg(0) != 0x3c || vpos == vbstrt; + } else { + vb_fast = get_strobe_reg(0) != 0x3c; + } int canline = can_fast_custom(); if (canline) { calculate_linetype(linear_display_vpos + 1); @@ -12198,6 +12211,7 @@ static void sync_imm_evhandler(void) if (!custom_disabled) { eventtab[ev_sync].active = 0; write_log("Chipset emulation active\n"); + rga_denise_cycle_line++; return; } diff --git a/drawing.cpp b/drawing.cpp index 6e797073..2ef848e0 100644 --- a/drawing.cpp +++ b/drawing.cpp @@ -97,6 +97,7 @@ struct denise_rga_queue int strobe_pos; int erase; struct linestate *ls; + uae_u16 reg, val; }; static volatile uae_atomic rga_queue_read, rga_queue_write; @@ -106,6 +107,11 @@ static struct denise_rga_queue temp_line; static struct denise_rga_queue *this_line; static volatile bool thread_debug_lock; +static void denise_handle_quick_strobe(uae_u16 strobe, int offset, int vpos); +static void draw_denise_vsync(int); +static void denise_update_reg(uae_u16 reg, uae_u16 v, int linecnt); +static void draw_denise_line(int gfx_ypos, nln_how how, uae_u32 linecnt, int startpos, int total, int skip, int skip2, int dtotal, int calib_start, int calib_len, bool lol, int hdelay, struct linestate *ls); + static void quick_denise_rga(int linecnt, int startpos, int endpos) { int pos = startpos; @@ -114,16 +120,13 @@ static void quick_denise_rga(int linecnt, int startpos, int endpos) while (pos != endpos) { struct denise_rga *rd = &rga_denise[pos]; if (rd->line == linecnt && rd->rga != 0x1fe && (rd->rga < 0x38 || rd->rga >= 0x40)) { - denise_update_reg(rd->rga, rd->v); + denise_update_reg(rd->rga, rd->v, linecnt); } pos++; pos &= DENISE_RGA_SLOT_MASK; } } -static void denise_handle_quick_strobe(uae_u16 strobe, int offset, int vpos); -static void draw_denise_vsync(int); - static void update_overlapped_cycles(int endpos) { for (int i = 0; i <= MAX_RGA_OVERLAPPING_CYCLES; i++) { @@ -134,14 +137,12 @@ static void update_overlapped_cycles(int endpos) static void read_denise_line_queue(void) { + bool nolock = false; + while (rga_queue_read == rga_queue_write) { uae_sem_wait(&write_sem); } - if (!thread_debug_lock) { - write_log("read_denise_line_queue: queue processed without lock!\n"); - } - struct denise_rga_queue *q = &rga_queue[rga_queue_read & DENISE_RGA_SLOT_CHUNKS_MASK]; this_line = q; bool next = false; @@ -167,6 +168,15 @@ static void read_denise_line_queue(void) next = true; } else if (q->type == 5) { draw_denise_vsync(q->erase); + } else if (q->type == 6) { + denise_update_reg(q->reg, q->val, q->linecnt); + nolock = true; + } + + if (!nolock) { + if (!thread_debug_lock) { + write_log("read_denise_line_queue: queue processed without lock!\n"); + } } //evt_t t2 = read_processor_time(); @@ -177,8 +187,10 @@ static void read_denise_line_queue(void) update_overlapped_cycles(q->endpos); } - if (!thread_debug_lock) { - write_log("read_denise_line_queue: queue lock was released during draw!\n"); + if (!nolock) { + if (!thread_debug_lock) { + write_log("read_denise_line_queue: queue lock was released during draw!\n"); + } } #if 0 @@ -487,6 +499,8 @@ static int hstrt_offset, hstop_offset; static int bpl1dat_trigger_offset; static int internal_pixel_cnt, internal_pixel_start_cnt; static bool no_denise_lol, denise_strlong_seen; +#define STRLONG_SEEN_DELAY 2 +static int denise_strlong_seen_delay; void set_inhibit_frame(int monid, int bit) { @@ -558,7 +572,7 @@ bool isnativevidbuf(int monid) struct vidbuf_description *vidinfo = &adisplays[monid].gfxvidinfo; if (vidinfo->outbuffer == NULL) return false; - if (vidinfo->outbuffer == &vidinfo->drawbuffer) + if (vidinfo->outbuffer == vidinfo->inbuffer) return true; return !vidinfo->outbuffer->hardwiredpositioning; } @@ -581,9 +595,8 @@ static int stored_left_start, stored_top_start, stored_width, stored_height; void get_custom_topedge (int *xp, int *yp, bool max) { if (isnativevidbuf(0) && !max) { - int x, y; - x = visible_left_border; - y = minfirstline << currprefs.gfx_vresolution; + int x = visible_left_border; + int y = minfirstline << currprefs.gfx_vresolution; #if 0 int dbl1, dbl2; dbl2 = dbl1 = currprefs.gfx_vresolution; @@ -698,10 +711,11 @@ void check_custom_limits(void) denise_vblank_extra_top = -1; denise_vblank_extra_bottom = 30000; - // backwards compatibility, old 0x38 start is gone. (0x38-1 = adjustment for v6) if (left > 0) { - left += (0x37 * 4) >> (RES_MAX - currprefs.gfx_resolution); - right += (0x37 * 4) >> (RES_MAX - currprefs.gfx_resolution); + left += (0x38 * 4) >> (RES_MAX - currprefs.gfx_resolution); + } + if (right > 0) { + right += (0x38 * 4) >> (RES_MAX - currprefs.gfx_resolution); } if (left > visible_left_start) { @@ -1892,6 +1906,8 @@ static void finish_drawing_frame(bool drawlines) } vbout->last_drawn_line = 0; + vbout->hardwiredpositioning = false; + draw_frame_extras(vbin, -1, -1); #ifdef WITH_SPECIALMONITORS @@ -3128,7 +3144,7 @@ static void expand_bplcon0(uae_u16 v) update_fmode(); update_specials(); update_sprres(); - if ((old & 1) != (bplcon0_denise)) { + if ((old & 1) != (bplcon0_denise & 1)) { update_ecs_features(); update_genlock(); } @@ -3221,11 +3237,13 @@ static void expand_clxcon2(uae_u16 v) static void set_strlong(void) { denise_strlong_seen = true; + denise_strlong_seen_delay = STRLONG_SEEN_DELAY; if (no_denise_lol) { + int add = 1 << hresolution; denise_strlong = false; denise_strlong_fast = true; - denise_lol_shift_enable = false; - denise_lol_shift_prev = 0; + denise_lol_shift_enable = true; + denise_lol_shift_prev = add; return; } denise_strlong = true; @@ -3725,9 +3743,15 @@ static void expand_drga(struct denise_rga *rd) agnus_lol = (rd->flags & DENISE_RGA_FLAG_LOL_ON) != 0; if (no_denise_lol) { int add = 1 << hresolution; - agnus_lol = false; - denise_lol_shift_enable = true; - denise_lol_shift_prev = add; + if (denise_strlong_seen) { + agnus_lol = false; + denise_lol_shift_enable = true; + denise_lol_shift_prev = add; + } else { + agnus_lol = false; + denise_lol_shift_enable = false; + denise_lol_shift_prev = add; + } } else { if (!agnus_lol && (!denise_lol_shift_prev || denise_lol_shift_enable)) { int add = 1 << hresolution; @@ -3862,8 +3886,29 @@ static void expand_drga(struct denise_rga *rd) } } -void denise_update_reg(uae_u16 reg, uae_u16 v) +static void flush_fast_rga(int linecnt) +{ + // extract fast CPU RGA pipeline + while (rga_denise_fast_write != rga_denise_fast_read) { + struct denise_rga *rd = &rga_denise_fast[rga_denise_fast_read]; + if (linecnt < rd->line) { + break; + } + expand_drga(rd); + expand_drga_early(rd); + expand_drga_early2x(rd); + rga_denise_fast_read++; + rga_denise_fast_read &= DENISE_RGA_SLOT_FAST_TOTAL - 1; + } +} + +static void denise_update_reg(uae_u16 reg, uae_u16 v, int linecnt) { + // makes sure fast queue is flushed first + if (rga_denise_fast_write != rga_denise_fast_read) { + flush_fast_rga(linecnt); + } + struct denise_rga dr = { 0 }; dr.rga = reg; dr.v = v; @@ -4591,7 +4636,7 @@ static void denise_handle_quick_strobe(uae_u16 strobe, int offset, int vpos) } } -bool denise_update_reg_queued(uae_u16 reg, uae_u16 v, uae_u32 cycle) +bool denise_update_reg_queued(uae_u16 reg, uae_u16 v, uae_u32 linecnt) { if (((rga_denise_fast_write + 1) & (DENISE_RGA_SLOT_FAST_TOTAL - 1)) == rga_denise_fast_read) { return false; @@ -4599,13 +4644,12 @@ bool denise_update_reg_queued(uae_u16 reg, uae_u16 v, uae_u32 cycle) struct denise_rga *r = &rga_denise_fast[rga_denise_fast_write]; r->rga = reg; r->v = v; - r->line = cycle; + r->line = linecnt; rga_denise_fast_write++; rga_denise_fast_write &= DENISE_RGA_SLOT_FAST_TOTAL - 1; return true; } - static void do_denise_cck(int linecnt, int startpos, int i) { int idxp = (i + startpos + 1) & DENISE_RGA_SLOT_MASK; @@ -4618,18 +4662,7 @@ static void do_denise_cck(int linecnt, int startpos, int i) denise_hcounter_new &= 511; if (rga_denise_fast_write != rga_denise_fast_read) { - // extract fast CPU RGA pipeline - while (rga_denise_fast_write != rga_denise_fast_read) { - struct denise_rga *rd = &rga_denise_fast[rga_denise_fast_read]; - if (linecnt < rd->line) { - break; - } - expand_drga(rd); - expand_drga_early(rd); - expand_drga_early2x(rd); - rga_denise_fast_read++; - rga_denise_fast_read &= DENISE_RGA_SLOT_FAST_TOTAL - 1; - } + flush_fast_rga(linecnt); } struct denise_rga *rd; @@ -5107,6 +5140,11 @@ static void emulate_black_level_calibration(uae_u32 *b1, uae_u32 *b2, uae_u32 *d } } +static uae_u8 filter_pixel_genlock(uae_u8 p1, uae_u8 p2) +{ + return p1 | p2; +} + static uae_u32 filter_pixel(uae_u32 p1, uae_u32 p2) { uae_u32 v = 0; @@ -5308,14 +5346,19 @@ static void draw_denise_vsync(int erase) struct vidbuf_description *vidinfo = &adisplays[0].gfxvidinfo; struct vidbuffer *vb = vidinfo->inbuffer; - if (!denise_strlong_seen && strlong_emulation) { - strlong_emulation = false; - write_log("STRLONG strobe emulation deactivated.\n"); - select_lts(); - denise_lol_shift_enable = false; - denise_lol_shift_prev = 0; + if (denise_strlong_seen_delay <= 0) { + if (!denise_strlong_seen && strlong_emulation) { + int add = 1 << hresolution; + strlong_emulation = false; + write_log("STRLONG strobe emulation deactivated.\n"); + select_lts(); + denise_lol_shift_enable = false; + denise_lol_shift_prev = add; + } + denise_strlong_seen = false; + } else { + denise_strlong_seen_delay--; } - denise_strlong_seen = false; if (erase) { // clear lines if mode height changed @@ -5344,7 +5387,7 @@ static void denise_draw_update(void) denise_max_odd_even = denise_odd_even; } -void draw_denise_line(int gfx_ypos, enum nln_how how, uae_u32 linecnt, int startpos, int total, int skip, int skip2, int dtotal, int calib_start, int calib_len, bool lol, int hdelay, struct linestate *ls) +static void draw_denise_line(int gfx_ypos, enum nln_how how, uae_u32 linecnt, int startpos, int total, int skip, int skip2, int dtotal, int calib_start, int calib_len, bool lol, int hdelay, struct linestate *ls) { bool fullline = false; // currprefs.chipset_hr; @@ -5484,29 +5527,35 @@ void draw_denise_line(int gfx_ypos, enum nln_how how, uae_u32 linecnt, int start uae_u32 *hbstrt_ptr2 = buf2 && hbstrt_offset2 >= 0 ? buf2t + hbstrt_offset2 : NULL; uae_u32 *hbstop_ptr2 = buf2 && hbstop_offset2 >= 0 ? buf2t + hbstop_offset2 : NULL; // blank last pixel row if normal overscan mode, it might have NTSC artifacts - if (denise_strlong_seen && denise_pixtotal_max != -0x7fffffff && hbstrt_ptr1 && currprefs.gfx_overscanmode <= OVERSCANMODE_OVERSCAN && !ecs_denise) { + if (denise_strlong_seen && denise_pixtotal_max != -0x7fffffff && hbstrt_ptr1) { int add = 1 << hresolution; - uae_u32 *p1 = hbstrt_ptr1 - denise_lol_shift_prev; - uae_u32 *p2 = hbstrt_ptr2 - denise_lol_shift_prev; - for (int i = 0; i < add * 2; i++) { - if (hbstrt_ptr1) { - *p1++ = BLANK_COLOR; - } - if (hbstrt_ptr2) { - *p2++ = BLANK_COLOR; + uae_u32 *ptre1 = buf1; + uae_u32 *ptre2 = buf2; + if (no_denise_lol) { + int padd = lol ? 0 : 2; + uae_u32 *p1 = hbstrt_ptr1 - padd * add; + uae_u32 *p2 = hbstrt_ptr2 - padd * add; + for (int i = 0; i < add * 2; i++) { + if (hbstrt_ptr1 && p1 < ptre1) { + *p1++ = BLANK_COLOR; + } + if (hbstrt_ptr2 && p2 < ptre2) { + *p2++ = BLANK_COLOR; + } } - } - } - if (1 && no_denise_lol && denise_pixtotal_max != -0x7fffffff && hbstrt_ptr1 && !lol_fast && denise_strlong_seen) { - int add = 1 << hresolution; - uae_u32 *p1 = hbstrt_ptr1 - 2 * add; - uae_u32 *p2 = hbstrt_ptr2 - 2 * add; - for (int i = 0; i < add * 2; i++) { - if (hbstrt_ptr1) { - *p1++ = BLANK_COLOR; + if (!lol) { + hbstrt_offset -= (1 << RES_MAX) * 2; } - if (hbstrt_ptr2) { - *p2++ = BLANK_COLOR; + } else if (!ecs_denise && currprefs.gfx_overscanmode <= OVERSCANMODE_OVERSCAN) { + uae_u32 *p1 = hbstrt_ptr1 - denise_lol_shift_prev; + uae_u32 *p2 = hbstrt_ptr2 - denise_lol_shift_prev; + for (int i = 0; i < add * 2; i++) { + if (hbstrt_ptr1 && p1 < ptre1) { + *p1++ = BLANK_COLOR; + } + if (hbstrt_ptr2 && p2 < ptre2) { + *p2++ = BLANK_COLOR; + } } } } @@ -5525,53 +5574,73 @@ void draw_denise_line(int gfx_ypos, enum nln_how how, uae_u32 linecnt, int start ptr = hbstrt_ptr1; ptrs = buf1t; ptre = buf1; - lolshift = lol ? add : 0; + lolshift = no_denise_lol ? (lol ? add : -add) : (lol ? add : 0); w = ww2; break; case 1: ptr = hbstrt_ptr2; ptrs = buf2t; ptre = buf2; - lolshift = lol ? add : 0; + lolshift = no_denise_lol ? (lol ? add : -add) : (lol ? add : 0); w = ww2; break; case 2: ptr = hbstop_ptr1; ptrs = buf1t; ptre = buf1; - lolshift = lol ? 0 : add; + lolshift = lol || no_denise_lol ? 0 : add; w = ww1; break; case 3: ptr = hbstop_ptr2; ptrs = buf2t; ptre = buf2; - lolshift = lol ? 0 : add; + lolshift = lol || no_denise_lol ? 0 : add; w = ww1; break; } if (ptr && w) { - uae_u32 *p1 = ptr + (denise_strlong_seen ? lolshift : 0); - int ww = w; + int lolshift2 = denise_strlong_seen ? lolshift : 0; + uae_u32 *p1 = ptr + lolshift2; if (i >= 2) { - if (p1 + ww > ptrs && p1 + ww < ptre) { + if (p1 + w > ptrs && p1 < ptre) { + int wxadd = 0; if (p1 < ptrs) { - int wadd = addrdiff(p1, ptrs); - ww -= wadd; - p1 += add; + wxadd = addrdiff(p1, ptrs); + w -= wxadd; + p1 += wxadd; } - memset(p1, DEBUG_TVOVERSCAN_H_GRAYSCALE, ww * sizeof(uae_u32)); - if (bufg) { - uae_u8 *gp1 = (p1 - ptrs) + bufg; - memset(gp1, 0, ww); + if (p1 + w > ptre) { + int wadd = addrdiff(p1 + w, ptre); + w -= wadd; + } + if (w > 0) { + memset(p1, DEBUG_TVOVERSCAN_H_GRAYSCALE, w * sizeof(uae_u32)); + if (bufg) { + uae_u8 *gp1 = (p1 - ptrs) + bufg + wxadd; + memset(gp1, 0, w); + } } } } else { - if (p1 < ptre && p1 - w >= ptrs) { - memset(p1 - ww, DEBUG_TVOVERSCAN_H_GRAYSCALE, w * sizeof(uae_u32)); - if (bufg) { - uae_u8 *gp1 = (p1 - ptrs) + bufg; - memset(gp1 - ww, 0, w); + if (p1 - w < ptre && p1 >= ptrs) { + int wxadd = 0; + p1 -= w; + if (p1 < ptrs) { + wxadd = addrdiff(ptrs, p1); + p1 += wxadd; + w -= wxadd; + } + if (p1 + w > ptre) { + int wadd = addrdiff(p1 + w, ptre); + w -= wadd; + } + if (w > 0) { + memset(p1, DEBUG_TVOVERSCAN_H_GRAYSCALE, w * sizeof(uae_u32)); + if (bufg) { + uae_u8 *gp1 = (p1 - ptrs) + bufg + wxadd; + memset(gp1, 0, w); + } } } } @@ -5593,6 +5662,8 @@ void draw_denise_line(int gfx_ypos, enum nln_how how, uae_u32 linecnt, int start ls->internal_pixel_cnt = internal_pixel_cnt; ls->internal_pixel_start_cnt = internal_pixel_start_cnt; ls->blankedline = blankedline; + ls->strlong_seen = denise_strlong_seen; + ls->lol = lol; } resolution_count[denise_res]++; @@ -5696,11 +5767,19 @@ static void select_lts(void) if (hresolution == RES_LORES) { lts = lts_null; } else { - int idx = hresolution - 1; - if (need_genlock_data) { - lts = linetoscr_ecs_shres_genlock_funcs[idx]; + int idx = hresolution; + if (idx == RES_HIRES && currprefs.gfx_lores_mode) { + if (need_genlock_data) { + lts = lts_ecs_shres_dhires_genlock_filtered; + } else { + lts = lts_ecs_shres_dhires_filtered; + } } else { - lts = linetoscr_ecs_shres_funcs[idx]; + if (need_genlock_data) { + lts = linetoscr_ecs_shres_genlock_funcs[idx]; + } else { + lts = linetoscr_ecs_shres_funcs[idx]; + } } } @@ -6352,17 +6431,17 @@ static void pfield_doline_8(int planecnt, int wordcount, uae_u8 *datap, struct l } } -static void tvadjust(int *hbstrt_offset, int *hbstop_offset) +static void tvadjust(int *hbstrt_offset, int *hbstop_offset, struct linestate *ls) { if (!programmedmode && currprefs.gfx_overscanmode < OVERSCANMODE_EXTREME) { - int ww1 = visible_left_start > visible_left_border ? (visible_left_start - visible_left_border) << 0 : 0; - int ww2 = visible_right_border > visible_right_stop ? (visible_right_border - visible_right_stop) << 0 : 0; + int right = denise_strlong_seen ? denise_hblank_extra_right + (1 << currprefs.gfx_resolution) : denise_hblank_extra_right; + int ww1 = denise_hblank_extra_left > visible_left_border ? (denise_hblank_extra_left - visible_left_border) << 0 : 0; + int ww2 = visible_right_border > right ? (visible_right_border - right) << 0 : 0; - if (ww2 >= 0 && hbstrt_offset) { + if (hbstrt_offset && ww2 > 0) { *hbstrt_offset -= ww2; } - if (ww1 >= (1 << hresolution) && hbstop_offset) { - ww1 -= (1 << hresolution); + if (hbstop_offset && ww1 > 0) { *hbstop_offset += ww1; } } @@ -6385,9 +6464,61 @@ static int l_shift(int v, int shift) } } +static void fill_border(int total, uae_u32 bgcol) +{ + if (buf2) { + while (total >= 8) { + *buf1++ = bgcol; + *buf1++ = bgcol; + *buf1++ = bgcol; + *buf1++ = bgcol; + *buf1++ = bgcol; + *buf1++ = bgcol; + *buf1++ = bgcol; + *buf1++ = bgcol; + + *buf2++ = bgcol; + *buf2++ = bgcol; + *buf2++ = bgcol; + *buf2++ = bgcol; + *buf2++ = bgcol; + *buf2++ = bgcol; + *buf2++ = bgcol; + *buf2++ = bgcol; + + total -= 8; + } + while (total > 0) { + *buf1++ = bgcol; + *buf2++ = bgcol; + total--; + } + } else { + while (total >= 8) { + *buf1++ = bgcol; + *buf1++ = bgcol; + *buf1++ = bgcol; + *buf1++ = bgcol; + *buf1++ = bgcol; + *buf1++ = bgcol; + *buf1++ = bgcol; + *buf1++ = bgcol; + total -= 8; + } + while (total > 0) { + *buf1++ = bgcol; + total--; + } + } +} + // draw border from hb to hb void draw_denise_border_line_fast(int gfx_ypos, enum nln_how how, struct linestate *ls) { + if (ls->strlong_seen) { + set_strlong(); + } + get_line(gfx_ypos, how); if (!buf1) { @@ -6417,7 +6548,7 @@ void draw_denise_border_line_fast(int gfx_ypos, enum nln_how how, struct linesta int hbstrt_offset = ls->hbstrt_offset >> rshift; int hbstop_offset = ls->hbstop_offset >> rshift; - tvadjust(&hbstrt_offset, &hbstop_offset); + tvadjust(&hbstrt_offset, &hbstop_offset, ls); int draw_end = ls->internal_pixel_cnt >> rshift; int draw_startoffset = ls->internal_pixel_start_cnt >> rshift; @@ -6431,57 +6562,18 @@ void draw_denise_border_line_fast(int gfx_ypos, enum nln_how how, struct linesta if (start < hbstop_offset) { int diff = hbstop_offset - start; buf1 += diff; - buf2 += diff; - gbufp += diff; + if (buf2) { + buf2 += diff; + } + if (gbufp) { + gbufp += diff; + } start = hbstop_offset; } int end = draw_end > hbstrt_offset ? hbstrt_offset : draw_end; int total = end - start; - if (buf2p) { - while (total >= 8) { - *buf1++ = bgcol; - *buf1++ = bgcol; - *buf1++ = bgcol; - *buf1++ = bgcol; - *buf1++ = bgcol; - *buf1++ = bgcol; - *buf1++ = bgcol; - *buf1++ = bgcol; - - *buf2++ = bgcol; - *buf2++ = bgcol; - *buf2++ = bgcol; - *buf2++ = bgcol; - *buf2++ = bgcol; - *buf2++ = bgcol; - *buf2++ = bgcol; - *buf2++ = bgcol; - - total -= 8; - } - while (total > 0) { - *buf1++ = bgcol; - *buf2++ = bgcol; - total--; - } - } else { - while (total >= 8) { - *buf1++ = bgcol; - *buf1++ = bgcol; - *buf1++ = bgcol; - *buf1++ = bgcol; - *buf1++ = bgcol; - *buf1++ = bgcol; - *buf1++ = bgcol; - *buf1++ = bgcol; - total -= 8; - } - while (total > 0) { - *buf1++ = bgcol; - total--; - } - } + fill_border(total, bgcol); total = end - start; if (need_genlock_data && gbuf && total) { @@ -6497,6 +6589,10 @@ void draw_denise_border_line_fast(int gfx_ypos, enum nln_how how, struct linesta void draw_denise_bitplane_line_fast(int gfx_ypos, enum nln_how how, struct linestate *ls) { + if (ls->strlong_seen) { + set_strlong(); + } + get_line(gfx_ypos, how); if (!buf1) { @@ -6640,9 +6736,9 @@ void draw_denise_bitplane_line_fast(int gfx_ypos, enum nln_how how, struct lines int hbstrt_offset = ls->hbstrt_offset >> rshift; int hbstop_offset = ls->hbstop_offset >> rshift; - + // if HAM: need to clear left hblank after line has been drawn - tvadjust(&hbstrt_offset, ham ? NULL : &hbstop_offset); + tvadjust(&hbstrt_offset, ham ? NULL : &hbstop_offset, ls); // negative checks are needed to handle always-on HDIW int hstop_offset_adjusted = ls->hstop_offset; @@ -6653,7 +6749,7 @@ void draw_denise_bitplane_line_fast(int gfx_ypos, enum nln_how how, struct lines } } int hstrt_offset = ls->hstrt_offset < 0 || ls->hstop_offset < 0 || (ls->hstrt_offset >> rshift) >= hbstrt_offset ? hbstop_offset : ls->hstrt_offset >> rshift; - int hstop_offset = hstop_offset_adjusted < 0 ? hbstrt_offset : hstop_offset_adjusted >> rshift; + int hstop_offset = hstop_offset_adjusted < 0 || (hstop_offset_adjusted >> rshift) >= hbstrt_offset ? hbstrt_offset : hstop_offset_adjusted >> rshift; int bpl1dat_trigger_offset = (ls->bpl1dat_trigger_offset + (1 << RES_MAX)) >> rshift; int draw_start = 0; int draw_end = ls->internal_pixel_cnt >> rshift; @@ -6706,6 +6802,13 @@ void draw_denise_bitplane_line_fast(int gfx_ypos, enum nln_how how, struct lines ltsf(draw_start, draw_end, draw_startoffset, hbstrt_offset, hbstop_offset, hstrt_offset, hstop_offset, bpl1dat_trigger_offset, planecnt, bgcol, cp, cp2, cpadd, cpadds, bufadd, ls); +#if 0 + *buf1++ = 0; + *buf1++ = 0; + *buf2++ = 0; + *buf2++ = 0; +#endif + if (!programmedmode && ham) { int ww1 = visible_left_start > visible_left_border ? (visible_left_start - visible_left_border) << 0 : 0; if (ww1 > 0) { @@ -6901,17 +7004,20 @@ static void updatelinedata(void) this_line->linear_vpos = linear_vpos; } +static bool waitqueue_nolock(void) +{ + while (((rga_queue_write + 1) & DENISE_RGA_SLOT_CHUNKS_MASK) == (rga_queue_read & DENISE_RGA_SLOT_CHUNKS_MASK)) { + uae_sem_trywait_delay(&read_sem, 500); + } + return true; +} static bool waitqueue(void) { if (!thread_debug_lock) { write_log("Denise queue without lock!\n"); return false; } - - - while (((rga_queue_write + 1) & DENISE_RGA_SLOT_CHUNKS_MASK) == (rga_queue_read & DENISE_RGA_SLOT_CHUNKS_MASK)) { - uae_sem_trywait_delay(&read_sem, 500); - } + waitqueue_nolock(); return true; } static void addtowritequeue(void) @@ -7088,6 +7194,31 @@ void draw_denise_vsync_queue(int erase) } } +void denise_update_reg_queue(uae_u16 reg, uae_u16 v, uae_u32 linecnt) +{ + if (MULTITHREADED_DENISE) { + + if (!waitqueue_nolock()) { + return; + } + struct denise_rga_queue *q = &rga_queue[rga_queue_write & DENISE_RGA_SLOT_CHUNKS_MASK]; + q->type = 6; + q->vpos = vpos; + q->linear_vpos = linear_vpos; + q->reg = reg; + q->val = v; + q->linecnt = linecnt; + + addtowritequeue(); + + } else { + + updatelinedata(); + denise_update_reg(reg, v, linecnt); + + } +} + void draw_denise_line_queue_flush(void) { if (MULTITHREADED_DENISE) { diff --git a/genlinetoscr.cpp b/genlinetoscr.cpp index 94902b55..8074b6ad 100644 --- a/genlinetoscr.cpp +++ b/genlinetoscr.cpp @@ -615,6 +615,9 @@ static void gen_pix_aga(void) } if (filtered) { outf("dpix_val%d = filter_pixel(dpix_val%d, dpix_val%d);", off, off, off + 1); + if (genlock) { + outf("gpix%d = filter_pixel_genlock(gpix%d, gpix%d);", off, off, off + 1); + } } if (ntsc) { outf("dtbuf[h][%d] = dpix_val%d;", off, off); @@ -762,6 +765,9 @@ static void gen_pix(void) if (filtered) { outf("dpix_val%d = filter_pixel(dpix_val%d, dpix_val%d);", off, off, off + 1); + if (genlock) { + outf("gpix%d = filter_pixel_genlock(gpix%d, gpix%d);", off, off, off + 1); + } } if (sprt[i]) { @@ -1051,6 +1057,12 @@ static void gen_fastdraw_mode(int off, int total) } else { outf("get_shres_pix(c0, c1, &dpix_val0, &dpix_val1);"); } + if (doubling < 0) { + outf("dpix_val0 = filter_pixel(dpix_val0, dpix_val1);"); + if (genlock) { + outf("gpix0 = filter_pixel_genlock(gpix0, gpix1);"); + } + } outf("*buf1++ = dpix_val0;"); if (doubling == 0) { outf("*buf1++ = dpix_val1;"); @@ -1208,7 +1220,7 @@ static void gen_fastdraw(void) outf("uae_u8 c;"); outf("uae_u32 col;"); } - if (doubling <= 0 || (res == 2 && !aga)) { + if (doubling <= 0) { gen_fastdraw_mode(0, 1); } else if (doubling == 1) { gen_fastdraw_mode(0, 2); @@ -1692,86 +1704,103 @@ int main (int argc, char *argv[]) for (genlock = 0; genlock < 2; genlock++) { for (outres = 1; outres < 3; outres++) { - char funcname[200]; - sprintf(funcname, "lts_ecs_shres_d%s%s", - outres == 0 ? "lores" : (outres == 1 ? "hires" : "shres"), - genlock ? "_genlock" : ""); - strcpy(funcnamep, funcname); - funcnamep += strlen(funcnamep) + 1; - *funcnamep = 0; - outf("static void %s(void)", funcname); - outf("{"); - gen_start(); - gen_init(); - gen_prepix(0); - gen_prepix(1); - gen_prepix(2); - gen_prepix(3); - outf("bool shifted = false;"); - outf("checkhorizontal1_ecs(denise_hcounter, denise_hcounter_next, h);"); - outf("if (!denise_blank_active) {"); - outf(" dpix_val0 = bordercolor_ecs_shres;"); - outf(" dpix_val1 = bordercolor_ecs_shres;"); - outf(" dpix_val2 = bordercolor_ecs_shres;"); - outf(" dpix_val3 = bordercolor_ecs_shres;"); - outf(" if (denise_hdiw && bpl1dat_trigger) {"); - outf(" shifted = true;"); - outf("pix0 = getbpl2();"); - outf("shiftbpl2();"); - outf("pix1 = getbpl2();"); - outf("shiftbpl2();"); - outf("pix2 = getbpl2();"); - outf("shiftbpl2();"); - outf("pix3 = getbpl2();"); - outf("shiftbpl2();"); - if (genlock) { - outf("get_shres_pix_genlock(pix0, pix1, &dpix_val0, &dpix_val1, &gpix0, &gpix1);"); - outf("get_shres_pix_genlock(pix2, pix3, &dpix_val2, &dpix_val3, &gpix2, &gpix3);"); - } else { - outf("get_shres_pix(pix0, pix1, &dpix_val0, &dpix_val1);"); - outf("get_shres_pix(pix2, pix3, &dpix_val2, &dpix_val3);"); - } - outf("}"); - outf("}"); - if (outres == 1) { - gen_sprpix(0); - gen_matchspr(0); - gen_sprpix(1); - gen_matchspr(2); - gen_ecsshresspr(); - outf("if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) {"); - gen_storepix(0, 0); - gen_storepix(2, 2); + for(filtered = 0; filtered < 2;filtered++) { + if (filtered && outres != 1) { + continue; + } + char funcname[200]; + sprintf(funcname, "lts_ecs_shres_d%s%s", + outres == 0 ? "lores" : (outres == 1 ? "hires" : "shres"), + genlock ? "_genlock" : ""); + strcpy(funcnamep, funcname); + funcnamep += strlen(funcnamep) + 1; + *funcnamep = 0; + if (filtered) { + strcat(funcname, "_filtered"); + } + outf("static void %s(void)", funcname); + outf("{"); + gen_start(); + gen_init(); + gen_prepix(0); + gen_prepix(1); + gen_prepix(2); + gen_prepix(3); + outf("bool shifted = false;"); + outf("checkhorizontal1_ecs(denise_hcounter, denise_hcounter_next, h);"); + outf("if (!denise_blank_active) {"); + outf(" dpix_val0 = bordercolor_ecs_shres;"); + outf(" dpix_val1 = bordercolor_ecs_shres;"); + outf(" dpix_val2 = bordercolor_ecs_shres;"); + outf(" dpix_val3 = bordercolor_ecs_shres;"); + outf(" if (denise_hdiw && bpl1dat_trigger) {"); + outf(" shifted = true;"); + outf("pix0 = getbpl2();"); + outf("shiftbpl2();"); + outf("pix1 = getbpl2();"); + outf("shiftbpl2();"); + outf("pix2 = getbpl2();"); + outf("shiftbpl2();"); + outf("pix3 = getbpl2();"); + outf("shiftbpl2();"); + if (genlock) { + outf("get_shres_pix_genlock(pix0, pix1, &dpix_val0, &dpix_val1, &gpix0, &gpix1);"); + outf("get_shres_pix_genlock(pix2, pix3, &dpix_val2, &dpix_val3, &gpix2, &gpix3);"); + } else { + outf("get_shres_pix(pix0, pix1, &dpix_val0, &dpix_val1);"); + outf("get_shres_pix(pix2, pix3, &dpix_val2, &dpix_val3);"); + } outf("}"); - } else if (outres == 2) { - gen_sprpix(0); - gen_matchspr(0); - gen_sprpix(1); - gen_matchspr(2); - gen_ecsshresspr(); - outf("if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) {"); - gen_storepix(0, 0); - gen_storepix(1, 1); - gen_storepix(2, 2); - gen_storepix(3, 3); outf("}"); + if (outres == 1) { + gen_sprpix(0); + gen_matchspr(0); + gen_sprpix(1); + gen_matchspr(2); + gen_ecsshresspr(); + outf("if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) {"); + if (filtered) { + outf("dpix_val0 = filter_pixel(dpix_val0, dpix_val1);"); + outf("dpix_val2 = filter_pixel(dpix_val2, dpix_val3);"); + if (genlock) { + outf("gpix0 = filter_pixel_genlock(gpix0, gpix1);"); + outf("gpix2 = filter_pixel_genlock(gpix2, gpix3);"); + } + } + gen_storepix(0, 0); + gen_storepix(2, 2); + outf("}"); + } else if (outres == 2) { + gen_sprpix(0); + gen_matchspr(0); + gen_sprpix(1); + gen_matchspr(2); + gen_ecsshresspr(); + outf("if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) {"); + gen_storepix(0, 0); + gen_storepix(1, 1); + gen_storepix(2, 2); + gen_storepix(3, 3); + outf("}"); + } + outf("if (!shifted) {"); + outf("shiftbpl2();"); + outf("shiftbpl2();"); + outf("shiftbpl2();"); + outf("shiftbpl2();"); + outf("}"); + gen_copybpl(); + outf("internal_pixel_cnt += 4;"); + gen_end(); + gen_tail(); } - outf("if (!shifted) {"); - outf("shiftbpl2();"); - outf("shiftbpl2();"); - outf("shiftbpl2();"); - outf("shiftbpl2();"); - outf("}"); - gen_copybpl(); - outf("internal_pixel_cnt += 4;"); - gen_end(); - gen_tail(); } write_funcs(genlock ? "linetoscr_ecs_shres_genlock_funcs" : "linetoscr_ecs_shres_funcs"); } // fast drawing + filtered = 0; genlock = 0; set_outfile("../../linetoscr_ecs_fast.cpp"); diff --git a/include/drawing.h b/include/drawing.h index 16eea083..508b1c9c 100644 --- a/include/drawing.h +++ b/include/drawing.h @@ -170,14 +170,15 @@ struct linestate int bpl1dat_trigger_offset; int internal_pixel_cnt; int internal_pixel_start_cnt; + bool lol; bool blankedline; + bool strlong_seen; int fetchmode_size, fetchstart_mask; uae_u16 strobe; int strobe_pos; }; extern struct color_entry denise_colors; -void draw_denise_line(int gfx_ypos, nln_how how, uae_u32 linecnt, int startpos, int total, int skip, int skip2, int dtotal, int calib_start, int calib_len, bool lol, int hdelay, struct linestate *ls); void draw_denise_line_queue(int gfx_ypos, nln_how how, uae_u32 linecnt, int startpos, int endpos, int total, int skip, int skip2, int dtotal, int calib_start, int calib_len, bool lof, bool lol, int hdelay, struct linestate *ls); void draw_denise_bitplane_line_fast(int gfx_ypos, enum nln_how how, struct linestate *ls); void draw_denise_bitplane_line_fast_queue(int gfx_ypos, enum nln_how how, struct linestate *ls); @@ -186,9 +187,8 @@ void draw_denise_border_line_fast_queue(int gfx_ypos, enum nln_how how, struct l bool start_draw_denise(void); void end_draw_denise(void); bool has_draw_denise(void); -void denise_update_reg(uae_u16 reg, uae_u16 v); void denise_reset(bool); -bool denise_update_reg_queued(uae_u16 reg, uae_u16 v, uae_u32 cycle); +bool denise_update_reg_queued(uae_u16 reg, uae_u16 v, uae_u32 linecnt); void denise_store_registers(void); void denise_restore_registers(void); bool denise_is_vb(void); @@ -199,5 +199,6 @@ void denise_handle_quick_strobe_queue(uae_u16 strobe, int strobe_pos, int endpos bool drawing_can_lineoptimizations(void); void set_drawbuffer(void); int gethresolution(void); +void denise_update_reg_queue(uae_u16 reg, uae_u16 v, uae_u32 linecnt); #endif /* UAE_DRAWING_H */ diff --git a/linetoscr_aga_fm0_genlock.cpp b/linetoscr_aga_fm0_genlock.cpp index 80117f99..8c7fca9a 100644 --- a/linetoscr_aga_fm0_genlock.cpp +++ b/linetoscr_aga_fm0_genlock.cpp @@ -1863,6 +1863,7 @@ static void lts_aga_fm0_n0_p4_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -2020,6 +2021,7 @@ static void lts_aga_fm0_n1_p4_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -2183,6 +2185,7 @@ static void lts_aga_fm0_dpf0_p4_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -2355,6 +2358,7 @@ static void lts_aga_fm0_dpf1_p4_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -2666,6 +2670,7 @@ static void lts_aga_fm0_n0_p4_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -2858,6 +2863,7 @@ static void lts_aga_fm0_n1_p4_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -3056,6 +3062,7 @@ static void lts_aga_fm0_dpf0_p4_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -3263,6 +3270,7 @@ static void lts_aga_fm0_dpf1_p4_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; diff --git a/linetoscr_aga_fm1_genlock.cpp b/linetoscr_aga_fm1_genlock.cpp index 2af7991a..b7542f54 100644 --- a/linetoscr_aga_fm1_genlock.cpp +++ b/linetoscr_aga_fm1_genlock.cpp @@ -1863,6 +1863,7 @@ static void lts_aga_fm1_n0_p4_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -2020,6 +2021,7 @@ static void lts_aga_fm1_n1_p4_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -2183,6 +2185,7 @@ static void lts_aga_fm1_dpf0_p4_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -2355,6 +2358,7 @@ static void lts_aga_fm1_dpf1_p4_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -2551,6 +2555,7 @@ static void lts_aga_fm1_n0_p8_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -2708,6 +2713,7 @@ static void lts_aga_fm1_n1_p8_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -2871,6 +2877,7 @@ static void lts_aga_fm1_dpf0_p8_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -3043,6 +3050,7 @@ static void lts_aga_fm1_dpf1_p8_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -3223,6 +3231,7 @@ static void lts_aga_fm1_ham0_p8_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -3399,6 +3408,7 @@ static void lts_aga_fm1_ham1_p8_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -3598,6 +3608,7 @@ static void lts_aga_fm1_n0_p4_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -3790,6 +3801,7 @@ static void lts_aga_fm1_n1_p4_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -3988,6 +4000,7 @@ static void lts_aga_fm1_dpf0_p4_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -4195,6 +4208,7 @@ static void lts_aga_fm1_dpf1_p4_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -4426,6 +4440,7 @@ static void lts_aga_fm1_n0_p8_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -4618,6 +4633,7 @@ static void lts_aga_fm1_n1_p8_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -4816,6 +4832,7 @@ static void lts_aga_fm1_dpf0_p8_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -5023,6 +5040,7 @@ static void lts_aga_fm1_dpf1_p8_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -5238,6 +5256,7 @@ static void lts_aga_fm1_ham0_p8_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -5449,6 +5468,7 @@ static void lts_aga_fm1_ham1_p8_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -11647,9 +11667,11 @@ static void lts_aga_fm1_n0_p4_ishres_dhires_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -11899,9 +11921,11 @@ static void lts_aga_fm1_n1_p4_ishres_dhires_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -12163,9 +12187,11 @@ static void lts_aga_fm1_dpf0_p4_ishres_dhires_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -12445,9 +12471,11 @@ static void lts_aga_fm1_dpf1_p4_ishres_dhires_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -12868,6 +12896,7 @@ static void lts_aga_fm1_n0_p4_ishres_dhires_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; if (sv2) { @@ -12880,6 +12909,7 @@ static void lts_aga_fm1_n0_p4_ishres_dhires_spr_filtered_genlock(void) } } dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -13190,6 +13220,7 @@ static void lts_aga_fm1_n1_p4_ishres_dhires_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; if (sv2) { @@ -13202,6 +13233,7 @@ static void lts_aga_fm1_n1_p4_ishres_dhires_spr_filtered_genlock(void) } } dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -13524,6 +13556,7 @@ static void lts_aga_fm1_dpf0_p4_ishres_dhires_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; if (sv2) { @@ -13536,6 +13569,7 @@ static void lts_aga_fm1_dpf0_p4_ishres_dhires_spr_filtered_genlock(void) } } dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -13876,6 +13910,7 @@ static void lts_aga_fm1_dpf1_p4_ishres_dhires_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; if (sv2) { @@ -13888,6 +13923,7 @@ static void lts_aga_fm1_dpf1_p4_ishres_dhires_spr_filtered_genlock(void) } } dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; diff --git a/linetoscr_aga_fm2_genlock.cpp b/linetoscr_aga_fm2_genlock.cpp index a1a4dbbe..d5c2a1fc 100644 --- a/linetoscr_aga_fm2_genlock.cpp +++ b/linetoscr_aga_fm2_genlock.cpp @@ -1863,6 +1863,7 @@ static void lts_aga_fm2_n0_p4_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -2020,6 +2021,7 @@ static void lts_aga_fm2_n1_p4_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -2183,6 +2185,7 @@ static void lts_aga_fm2_dpf0_p4_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -2355,6 +2358,7 @@ static void lts_aga_fm2_dpf1_p4_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -2551,6 +2555,7 @@ static void lts_aga_fm2_n0_p8_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -2708,6 +2713,7 @@ static void lts_aga_fm2_n1_p8_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -2871,6 +2877,7 @@ static void lts_aga_fm2_dpf0_p8_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -3043,6 +3050,7 @@ static void lts_aga_fm2_dpf1_p8_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -3223,6 +3231,7 @@ static void lts_aga_fm2_ham0_p8_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -3399,6 +3408,7 @@ static void lts_aga_fm2_ham1_p8_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 4; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -3598,6 +3608,7 @@ static void lts_aga_fm2_n0_p4_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -3790,6 +3801,7 @@ static void lts_aga_fm2_n1_p4_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -3988,6 +4000,7 @@ static void lts_aga_fm2_dpf0_p4_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -4195,6 +4208,7 @@ static void lts_aga_fm2_dpf1_p4_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -4426,6 +4440,7 @@ static void lts_aga_fm2_n0_p8_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -4618,6 +4633,7 @@ static void lts_aga_fm2_n1_p8_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -4816,6 +4832,7 @@ static void lts_aga_fm2_dpf0_p8_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -5023,6 +5040,7 @@ static void lts_aga_fm2_dpf1_p8_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -5238,6 +5256,7 @@ static void lts_aga_fm2_ham0_p8_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -5449,6 +5468,7 @@ static void lts_aga_fm2_ham1_p8_ihires_dlores_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -11647,9 +11667,11 @@ static void lts_aga_fm2_n0_p4_ishres_dhires_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -11899,9 +11921,11 @@ static void lts_aga_fm2_n1_p4_ishres_dhires_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -12163,9 +12187,11 @@ static void lts_aga_fm2_dpf0_p4_ishres_dhires_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -12445,9 +12471,11 @@ static void lts_aga_fm2_dpf1_p4_ishres_dhires_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -12727,9 +12755,11 @@ static void lts_aga_fm2_n0_p8_ishres_dhires_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -12979,9 +13009,11 @@ static void lts_aga_fm2_n1_p8_ishres_dhires_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -13243,9 +13275,11 @@ static void lts_aga_fm2_dpf0_p8_ishres_dhires_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -13525,9 +13559,11 @@ static void lts_aga_fm2_dpf1_p8_ishres_dhires_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -13807,9 +13843,11 @@ static void lts_aga_fm2_ham0_p8_ishres_dhires_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -14097,9 +14135,11 @@ static void lts_aga_fm2_ham1_p8_ishres_dhires_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -14408,6 +14448,7 @@ static void lts_aga_fm2_n0_p4_ishres_dhires_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; if (sv2) { @@ -14420,6 +14461,7 @@ static void lts_aga_fm2_n0_p4_ishres_dhires_spr_filtered_genlock(void) } } dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -14730,6 +14772,7 @@ static void lts_aga_fm2_n1_p4_ishres_dhires_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; if (sv2) { @@ -14742,6 +14785,7 @@ static void lts_aga_fm2_n1_p4_ishres_dhires_spr_filtered_genlock(void) } } dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -15064,6 +15108,7 @@ static void lts_aga_fm2_dpf0_p4_ishres_dhires_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; if (sv2) { @@ -15076,6 +15121,7 @@ static void lts_aga_fm2_dpf0_p4_ishres_dhires_spr_filtered_genlock(void) } } dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -15416,6 +15462,7 @@ static void lts_aga_fm2_dpf1_p4_ishres_dhires_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; if (sv2) { @@ -15428,6 +15475,7 @@ static void lts_aga_fm2_dpf1_p4_ishres_dhires_spr_filtered_genlock(void) } } dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -15768,6 +15816,7 @@ static void lts_aga_fm2_n0_p8_ishres_dhires_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; if (sv2) { @@ -15780,6 +15829,7 @@ static void lts_aga_fm2_n0_p8_ishres_dhires_spr_filtered_genlock(void) } } dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -16090,6 +16140,7 @@ static void lts_aga_fm2_n1_p8_ishres_dhires_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; if (sv2) { @@ -16102,6 +16153,7 @@ static void lts_aga_fm2_n1_p8_ishres_dhires_spr_filtered_genlock(void) } } dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -16424,6 +16476,7 @@ static void lts_aga_fm2_dpf0_p8_ishres_dhires_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; if (sv2) { @@ -16436,6 +16489,7 @@ static void lts_aga_fm2_dpf0_p8_ishres_dhires_spr_filtered_genlock(void) } } dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -16776,6 +16830,7 @@ static void lts_aga_fm2_dpf1_p8_ishres_dhires_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; if (sv2) { @@ -16788,6 +16843,7 @@ static void lts_aga_fm2_dpf1_p8_ishres_dhires_spr_filtered_genlock(void) } } dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -17128,6 +17184,7 @@ static void lts_aga_fm2_ham0_p8_ishres_dhires_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; if (sv2) { @@ -17140,6 +17197,7 @@ static void lts_aga_fm2_ham0_p8_ishres_dhires_spr_filtered_genlock(void) } } dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; @@ -17488,6 +17546,7 @@ static void lts_aga_fm2_ham1_p8_ishres_dhires_spr_filtered_genlock(void) } } dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; if (sv2) { @@ -17500,6 +17559,7 @@ static void lts_aga_fm2_ham1_p8_ishres_dhires_spr_filtered_genlock(void) } } dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix2 = filter_pixel_genlock(gpix2, gpix3); dtbuf[h][2] = dpix_val2; dtgbuf[h][2] = gpix2; uae_u32 t0 = dtbuf[h ^ lol][0]; diff --git a/linetoscr_ecs_fast.cpp b/linetoscr_ecs_fast.cpp index efd44960..f228cb29 100644 --- a/linetoscr_ecs_fast.cpp +++ b/linetoscr_ecs_fast.cpp @@ -1380,6 +1380,7 @@ static void lts_ecs_n_ishres_dhires_b1(int draw_start, int draw_end, int draw_st uae_u8 c1 = *cp++; uae_u32 dpix_val0, dpix_val1; get_shres_pix(c0, c1, &dpix_val0, &dpix_val1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); *buf1++ = dpix_val0; } if (cnt >= bpl1dat_trigger_offset && !bpl) { @@ -1423,6 +1424,7 @@ static void lts_ecs_n_ishres_dhires_b1_filtered(int draw_start, int draw_end, in uae_u8 c1 = *cp++; uae_u32 dpix_val0, dpix_val1; get_shres_pix(c0, c1, &dpix_val0, &dpix_val1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); *buf1++ = dpix_val0; } if (cnt >= bpl1dat_trigger_offset && !bpl) { @@ -1466,6 +1468,7 @@ static void lts_ecs_dpf_ishres_dhires_b1(int draw_start, int draw_end, int draw_ uae_u8 c1 = *cp++; uae_u32 dpix_val0, dpix_val1; get_shres_pix(c0, c1, &dpix_val0, &dpix_val1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); *buf1++ = dpix_val0; } if (cnt >= bpl1dat_trigger_offset && !bpl) { @@ -1509,6 +1512,7 @@ static void lts_ecs_dpf_ishres_dhires_b1_filtered(int draw_start, int draw_end, uae_u8 c1 = *cp++; uae_u32 dpix_val0, dpix_val1; get_shres_pix(c0, c1, &dpix_val0, &dpix_val1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); *buf1++ = dpix_val0; } if (cnt >= bpl1dat_trigger_offset && !bpl) { @@ -1552,6 +1556,7 @@ static void lts_ecs_ehb_ishres_dhires_b1(int draw_start, int draw_end, int draw_ uae_u8 c1 = *cp++; uae_u32 dpix_val0, dpix_val1; get_shres_pix(c0, c1, &dpix_val0, &dpix_val1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); *buf1++ = dpix_val0; } if (cnt >= bpl1dat_trigger_offset && !bpl) { @@ -1595,6 +1600,7 @@ static void lts_ecs_ehb_ishres_dhires_b1_filtered(int draw_start, int draw_end, uae_u8 c1 = *cp++; uae_u32 dpix_val0, dpix_val1; get_shres_pix(c0, c1, &dpix_val0, &dpix_val1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); *buf1++ = dpix_val0; } if (cnt >= bpl1dat_trigger_offset && !bpl) { @@ -1638,6 +1644,7 @@ static void lts_ecs_ham_ishres_dhires_b1(int draw_start, int draw_end, int draw_ uae_u8 c1 = *cp++; uae_u32 dpix_val0, dpix_val1; get_shres_pix(c0, c1, &dpix_val0, &dpix_val1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); *buf1++ = dpix_val0; } if (cnt >= bpl1dat_trigger_offset && !bpl) { @@ -1681,6 +1688,7 @@ static void lts_ecs_ham_ishres_dhires_b1_filtered(int draw_start, int draw_end, uae_u8 c1 = *cp++; uae_u32 dpix_val0, dpix_val1; get_shres_pix(c0, c1, &dpix_val0, &dpix_val1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); *buf1++ = dpix_val0; } if (cnt >= bpl1dat_trigger_offset && !bpl) { @@ -1724,6 +1732,7 @@ static void lts_ecs_kehb_ishres_dhires_b1(int draw_start, int draw_end, int draw uae_u8 c1 = *cp++; uae_u32 dpix_val0, dpix_val1; get_shres_pix(c0, c1, &dpix_val0, &dpix_val1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); *buf1++ = dpix_val0; } if (cnt >= bpl1dat_trigger_offset && !bpl) { @@ -1767,6 +1776,7 @@ static void lts_ecs_kehb_ishres_dhires_b1_filtered(int draw_start, int draw_end, uae_u8 c1 = *cp++; uae_u32 dpix_val0, dpix_val1; get_shres_pix(c0, c1, &dpix_val0, &dpix_val1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); *buf1++ = dpix_val0; } if (cnt >= bpl1dat_trigger_offset && !bpl) { @@ -4121,6 +4131,7 @@ static void lts_ecs_n_ishres_dhires_b2(int draw_start, int draw_end, int draw_st uae_u8 c1 = *cp++; uae_u32 dpix_val0, dpix_val1; get_shres_pix(c0, c1, &dpix_val0, &dpix_val1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); *buf1++ = dpix_val0; *buf2++ = dpix_val0; } @@ -4167,6 +4178,7 @@ static void lts_ecs_n_ishres_dhires_b2_filtered(int draw_start, int draw_end, in uae_u8 c1 = *cp++; uae_u32 dpix_val0, dpix_val1; get_shres_pix(c0, c1, &dpix_val0, &dpix_val1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); *buf1++ = dpix_val0; *buf2++ = dpix_val0; } @@ -4213,6 +4225,7 @@ static void lts_ecs_dpf_ishres_dhires_b2(int draw_start, int draw_end, int draw_ uae_u8 c1 = *cp++; uae_u32 dpix_val0, dpix_val1; get_shres_pix(c0, c1, &dpix_val0, &dpix_val1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); *buf1++ = dpix_val0; *buf2++ = dpix_val0; } @@ -4259,6 +4272,7 @@ static void lts_ecs_dpf_ishres_dhires_b2_filtered(int draw_start, int draw_end, uae_u8 c1 = *cp++; uae_u32 dpix_val0, dpix_val1; get_shres_pix(c0, c1, &dpix_val0, &dpix_val1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); *buf1++ = dpix_val0; *buf2++ = dpix_val0; } @@ -4305,6 +4319,7 @@ static void lts_ecs_ehb_ishres_dhires_b2(int draw_start, int draw_end, int draw_ uae_u8 c1 = *cp++; uae_u32 dpix_val0, dpix_val1; get_shres_pix(c0, c1, &dpix_val0, &dpix_val1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); *buf1++ = dpix_val0; *buf2++ = dpix_val0; } @@ -4351,6 +4366,7 @@ static void lts_ecs_ehb_ishres_dhires_b2_filtered(int draw_start, int draw_end, uae_u8 c1 = *cp++; uae_u32 dpix_val0, dpix_val1; get_shres_pix(c0, c1, &dpix_val0, &dpix_val1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); *buf1++ = dpix_val0; *buf2++ = dpix_val0; } @@ -4397,6 +4413,7 @@ static void lts_ecs_ham_ishres_dhires_b2(int draw_start, int draw_end, int draw_ uae_u8 c1 = *cp++; uae_u32 dpix_val0, dpix_val1; get_shres_pix(c0, c1, &dpix_val0, &dpix_val1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); *buf1++ = dpix_val0; *buf2++ = dpix_val0; } @@ -4443,6 +4460,7 @@ static void lts_ecs_ham_ishres_dhires_b2_filtered(int draw_start, int draw_end, uae_u8 c1 = *cp++; uae_u32 dpix_val0, dpix_val1; get_shres_pix(c0, c1, &dpix_val0, &dpix_val1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); *buf1++ = dpix_val0; *buf2++ = dpix_val0; } @@ -4489,6 +4507,7 @@ static void lts_ecs_kehb_ishres_dhires_b2(int draw_start, int draw_end, int draw uae_u8 c1 = *cp++; uae_u32 dpix_val0, dpix_val1; get_shres_pix(c0, c1, &dpix_val0, &dpix_val1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); *buf1++ = dpix_val0; *buf2++ = dpix_val0; } @@ -4535,6 +4554,7 @@ static void lts_ecs_kehb_ishres_dhires_b2_filtered(int draw_start, int draw_end, uae_u8 c1 = *cp++; uae_u32 dpix_val0, dpix_val1; get_shres_pix(c0, c1, &dpix_val0, &dpix_val1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); *buf1++ = dpix_val0; *buf2++ = dpix_val0; } diff --git a/linetoscr_ecs_genlock_fast.cpp b/linetoscr_ecs_genlock_fast.cpp index 7aa0be55..e00328a7 100644 --- a/linetoscr_ecs_genlock_fast.cpp +++ b/linetoscr_ecs_genlock_fast.cpp @@ -1524,6 +1524,8 @@ static void lts_ecs_n_ishres_dhires_b1_genlock(int draw_start, int draw_end, int uae_u32 dpix_val0, dpix_val1; uae_u8 gpix0, gpix1; get_shres_pix_genlock(c0, c1, &dpix_val0, &dpix_val1, &gpix0, &gpix1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); *buf1++ = dpix_val0; *gbuf++ = gpix0; } @@ -1572,6 +1574,8 @@ static void lts_ecs_n_ishres_dhires_b1_filtered_genlock(int draw_start, int draw uae_u32 dpix_val0, dpix_val1; uae_u8 gpix0, gpix1; get_shres_pix_genlock(c0, c1, &dpix_val0, &dpix_val1, &gpix0, &gpix1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); *buf1++ = dpix_val0; *gbuf++ = gpix0; } @@ -1620,6 +1624,8 @@ static void lts_ecs_dpf_ishres_dhires_b1_genlock(int draw_start, int draw_end, i uae_u32 dpix_val0, dpix_val1; uae_u8 gpix0, gpix1; get_shres_pix_genlock(c0, c1, &dpix_val0, &dpix_val1, &gpix0, &gpix1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); *buf1++ = dpix_val0; *gbuf++ = gpix0; } @@ -1668,6 +1674,8 @@ static void lts_ecs_dpf_ishres_dhires_b1_filtered_genlock(int draw_start, int dr uae_u32 dpix_val0, dpix_val1; uae_u8 gpix0, gpix1; get_shres_pix_genlock(c0, c1, &dpix_val0, &dpix_val1, &gpix0, &gpix1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); *buf1++ = dpix_val0; *gbuf++ = gpix0; } @@ -1716,6 +1724,8 @@ static void lts_ecs_ehb_ishres_dhires_b1_genlock(int draw_start, int draw_end, i uae_u32 dpix_val0, dpix_val1; uae_u8 gpix0, gpix1; get_shres_pix_genlock(c0, c1, &dpix_val0, &dpix_val1, &gpix0, &gpix1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); *buf1++ = dpix_val0; *gbuf++ = gpix0; } @@ -1764,6 +1774,8 @@ static void lts_ecs_ehb_ishres_dhires_b1_filtered_genlock(int draw_start, int dr uae_u32 dpix_val0, dpix_val1; uae_u8 gpix0, gpix1; get_shres_pix_genlock(c0, c1, &dpix_val0, &dpix_val1, &gpix0, &gpix1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); *buf1++ = dpix_val0; *gbuf++ = gpix0; } @@ -1812,6 +1824,8 @@ static void lts_ecs_ham_ishres_dhires_b1_genlock(int draw_start, int draw_end, i uae_u32 dpix_val0, dpix_val1; uae_u8 gpix0, gpix1; get_shres_pix_genlock(c0, c1, &dpix_val0, &dpix_val1, &gpix0, &gpix1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); *buf1++ = dpix_val0; *gbuf++ = gpix0; } @@ -1860,6 +1874,8 @@ static void lts_ecs_ham_ishres_dhires_b1_filtered_genlock(int draw_start, int dr uae_u32 dpix_val0, dpix_val1; uae_u8 gpix0, gpix1; get_shres_pix_genlock(c0, c1, &dpix_val0, &dpix_val1, &gpix0, &gpix1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); *buf1++ = dpix_val0; *gbuf++ = gpix0; } @@ -1908,6 +1924,8 @@ static void lts_ecs_kehb_ishres_dhires_b1_genlock(int draw_start, int draw_end, uae_u32 dpix_val0, dpix_val1; uae_u8 gpix0, gpix1; get_shres_pix_genlock(c0, c1, &dpix_val0, &dpix_val1, &gpix0, &gpix1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); *buf1++ = dpix_val0; *gbuf++ = gpix0; } @@ -1956,6 +1974,8 @@ static void lts_ecs_kehb_ishres_dhires_b1_filtered_genlock(int draw_start, int d uae_u32 dpix_val0, dpix_val1; uae_u8 gpix0, gpix1; get_shres_pix_genlock(c0, c1, &dpix_val0, &dpix_val1, &gpix0, &gpix1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); *buf1++ = dpix_val0; *gbuf++ = gpix0; } @@ -4595,6 +4615,8 @@ static void lts_ecs_n_ishres_dhires_b2_genlock(int draw_start, int draw_end, int uae_u32 dpix_val0, dpix_val1; uae_u8 gpix0, gpix1; get_shres_pix_genlock(c0, c1, &dpix_val0, &dpix_val1, &gpix0, &gpix1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); *buf1++ = dpix_val0; *buf2++ = dpix_val0; *gbuf++ = gpix0; @@ -4646,6 +4668,8 @@ static void lts_ecs_n_ishres_dhires_b2_filtered_genlock(int draw_start, int draw uae_u32 dpix_val0, dpix_val1; uae_u8 gpix0, gpix1; get_shres_pix_genlock(c0, c1, &dpix_val0, &dpix_val1, &gpix0, &gpix1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); *buf1++ = dpix_val0; *buf2++ = dpix_val0; *gbuf++ = gpix0; @@ -4697,6 +4721,8 @@ static void lts_ecs_dpf_ishres_dhires_b2_genlock(int draw_start, int draw_end, i uae_u32 dpix_val0, dpix_val1; uae_u8 gpix0, gpix1; get_shres_pix_genlock(c0, c1, &dpix_val0, &dpix_val1, &gpix0, &gpix1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); *buf1++ = dpix_val0; *buf2++ = dpix_val0; *gbuf++ = gpix0; @@ -4748,6 +4774,8 @@ static void lts_ecs_dpf_ishres_dhires_b2_filtered_genlock(int draw_start, int dr uae_u32 dpix_val0, dpix_val1; uae_u8 gpix0, gpix1; get_shres_pix_genlock(c0, c1, &dpix_val0, &dpix_val1, &gpix0, &gpix1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); *buf1++ = dpix_val0; *buf2++ = dpix_val0; *gbuf++ = gpix0; @@ -4799,6 +4827,8 @@ static void lts_ecs_ehb_ishres_dhires_b2_genlock(int draw_start, int draw_end, i uae_u32 dpix_val0, dpix_val1; uae_u8 gpix0, gpix1; get_shres_pix_genlock(c0, c1, &dpix_val0, &dpix_val1, &gpix0, &gpix1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); *buf1++ = dpix_val0; *buf2++ = dpix_val0; *gbuf++ = gpix0; @@ -4850,6 +4880,8 @@ static void lts_ecs_ehb_ishres_dhires_b2_filtered_genlock(int draw_start, int dr uae_u32 dpix_val0, dpix_val1; uae_u8 gpix0, gpix1; get_shres_pix_genlock(c0, c1, &dpix_val0, &dpix_val1, &gpix0, &gpix1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); *buf1++ = dpix_val0; *buf2++ = dpix_val0; *gbuf++ = gpix0; @@ -4901,6 +4933,8 @@ static void lts_ecs_ham_ishres_dhires_b2_genlock(int draw_start, int draw_end, i uae_u32 dpix_val0, dpix_val1; uae_u8 gpix0, gpix1; get_shres_pix_genlock(c0, c1, &dpix_val0, &dpix_val1, &gpix0, &gpix1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); *buf1++ = dpix_val0; *buf2++ = dpix_val0; *gbuf++ = gpix0; @@ -4952,6 +4986,8 @@ static void lts_ecs_ham_ishres_dhires_b2_filtered_genlock(int draw_start, int dr uae_u32 dpix_val0, dpix_val1; uae_u8 gpix0, gpix1; get_shres_pix_genlock(c0, c1, &dpix_val0, &dpix_val1, &gpix0, &gpix1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); *buf1++ = dpix_val0; *buf2++ = dpix_val0; *gbuf++ = gpix0; @@ -5003,6 +5039,8 @@ static void lts_ecs_kehb_ishres_dhires_b2_genlock(int draw_start, int draw_end, uae_u32 dpix_val0, dpix_val1; uae_u8 gpix0, gpix1; get_shres_pix_genlock(c0, c1, &dpix_val0, &dpix_val1, &gpix0, &gpix1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); *buf1++ = dpix_val0; *buf2++ = dpix_val0; *gbuf++ = gpix0; @@ -5054,6 +5092,8 @@ static void lts_ecs_kehb_ishres_dhires_b2_filtered_genlock(int draw_start, int d uae_u32 dpix_val0, dpix_val1; uae_u8 gpix0, gpix1; get_shres_pix_genlock(c0, c1, &dpix_val0, &dpix_val1, &gpix0, &gpix1); + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); *buf1++ = dpix_val0; *buf2++ = dpix_val0; *gbuf++ = gpix0; diff --git a/linetoscr_ecs_shres.cpp b/linetoscr_ecs_shres.cpp index 6331d45f..a02e7d71 100644 --- a/linetoscr_ecs_shres.cpp +++ b/linetoscr_ecs_shres.cpp @@ -113,6 +113,117 @@ static void lts_ecs_shres_dhires(void) denise_cck++; } } +static void lts_ecs_shres_dhires_filtered(void) +{ + while (denise_cck < denise_total) { + do_denise_cck(denise_linecnt, denise_startpos, denise_cck); + if (lts_changed) return; + for (int h = 0; h < 2; h++) { + if (h) { + denise_hcounter_next = denise_hcounter_new; + } + int cnt = denise_hcounter << 2; + uae_u8 pix0 = 0; + uae_u32 dpix_val0 = BLANK_COLOR; + uae_u8 pix1 = 0; + uae_u32 dpix_val1 = BLANK_COLOR; + uae_u8 pix2 = 0; + uae_u32 dpix_val2 = BLANK_COLOR; + uae_u8 pix3 = 0; + uae_u32 dpix_val3 = BLANK_COLOR; + bool shifted = false; + checkhorizontal1_ecs(denise_hcounter, denise_hcounter_next, h); + if (!denise_blank_active) { + dpix_val0 = bordercolor_ecs_shres; + dpix_val1 = bordercolor_ecs_shres; + dpix_val2 = bordercolor_ecs_shres; + dpix_val3 = bordercolor_ecs_shres; + if (denise_hdiw && bpl1dat_trigger) { + shifted = true; + pix0 = getbpl2(); + shiftbpl2(); + pix1 = getbpl2(); + shiftbpl2(); + pix2 = getbpl2(); + shiftbpl2(); + pix3 = getbpl2(); + shiftbpl2(); + get_shres_pix(pix0, pix1, &dpix_val0, &dpix_val1); + get_shres_pix(pix2, pix3, &dpix_val2, &dpix_val3); + } + } + uae_u32 sv0 = 0; + if (denise_spr_nr_armeds) { + uae_u32 svt; + svt = denise_render_sprites_ecs_shres(); + if (!denise_sprite_blank_active && !sprites_hidden) { + sv0 = svt; + } + } + matchsprites_ecs_shres(cnt + 0); + uae_u32 sv1 = 0; + if (denise_spr_nr_armeds) { + uae_u32 svt; + svt = denise_render_sprites_ecs_shres(); + if (!denise_sprite_blank_active && !sprites_hidden) { + sv1 = svt; + } + } + matchsprites_ecs_shres(cnt + 2); + if (sv0 || sv1) { + get_shres_spr_pix(sv0, sv1, &dpix_val0, &dpix_val2); + if (sv0) { + dpix_val1 = dpix_val0; + } + if (sv1) { + dpix_val3 = dpix_val2; + } + } + if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + #ifdef DEBUGGER + if (decode_specials_debug) { + dpix_val0 = decode_denise_specials_debug(dpix_val0, cnt + 0); + } + #endif + *buf1++ = dpix_val0; + *buf2++ = dpix_val0; + #ifdef DEBUGGER + if (decode_specials_debug) { + dpix_val2 = decode_denise_specials_debug(dpix_val2, cnt + 2); + } + #endif + *buf1++ = dpix_val2; + *buf2++ = dpix_val2; + } + if (!shifted) { + shiftbpl2(); + shiftbpl2(); + shiftbpl2(); + shiftbpl2(); + } + if (bpldat_copy[0] && (denise_hcounter & 3) == bplcon1_shift[0]) { + copybpl2(); + } + internal_pixel_cnt += 4; + sprites_hidden = sprites_hidden2; + #ifdef DEBUGGER + *debug_dma_dhpos_odd = denise_hcounter; + #endif + denise_hcounter++; + denise_hcounter &= 511; + denise_hcounter_next++; + denise_hcounter_next &= 511; + } + denise_pixtotal++; + if (denise_pixtotal == 0) { + internal_pixel_start_cnt = internal_pixel_cnt; + } + denise_hcounter = denise_hcounter_new; + denise_cck++; + } +} static void lts_ecs_shres_dshres(void) { while (denise_cck < denise_total) { @@ -237,6 +348,7 @@ static void lts_ecs_shres_dshres(void) } } static LINETOSRC_FUNC linetoscr_ecs_shres_funcs[] = { + lts_ecs_shres_dhires, lts_ecs_shres_dhires, lts_ecs_shres_dshres, NULL @@ -359,6 +471,125 @@ static void lts_ecs_shres_dhires_genlock(void) denise_cck++; } } +static void lts_ecs_shres_dhires_genlock_filtered(void) +{ + while (denise_cck < denise_total) { + do_denise_cck(denise_linecnt, denise_startpos, denise_cck); + if (lts_changed) return; + for (int h = 0; h < 2; h++) { + if (h) { + denise_hcounter_next = denise_hcounter_new; + } + int cnt = denise_hcounter << 2; + uae_u8 pix0 = 0; + uae_u8 gpix0 = 0xff; + uae_u32 dpix_val0 = BLANK_COLOR; + uae_u8 pix1 = 0; + uae_u8 gpix1 = 0xff; + uae_u32 dpix_val1 = BLANK_COLOR; + uae_u8 pix2 = 0; + uae_u8 gpix2 = 0xff; + uae_u32 dpix_val2 = BLANK_COLOR; + uae_u8 pix3 = 0; + uae_u8 gpix3 = 0xff; + uae_u32 dpix_val3 = BLANK_COLOR; + bool shifted = false; + checkhorizontal1_ecs(denise_hcounter, denise_hcounter_next, h); + if (!denise_blank_active) { + dpix_val0 = bordercolor_ecs_shres; + dpix_val1 = bordercolor_ecs_shres; + dpix_val2 = bordercolor_ecs_shres; + dpix_val3 = bordercolor_ecs_shres; + if (denise_hdiw && bpl1dat_trigger) { + shifted = true; + pix0 = getbpl2(); + shiftbpl2(); + pix1 = getbpl2(); + shiftbpl2(); + pix2 = getbpl2(); + shiftbpl2(); + pix3 = getbpl2(); + shiftbpl2(); + get_shres_pix_genlock(pix0, pix1, &dpix_val0, &dpix_val1, &gpix0, &gpix1); + get_shres_pix_genlock(pix2, pix3, &dpix_val2, &dpix_val3, &gpix2, &gpix3); + } + } + uae_u32 sv0 = 0; + if (denise_spr_nr_armeds) { + uae_u32 svt; + svt = denise_render_sprites_ecs_shres(); + if (!denise_sprite_blank_active && !sprites_hidden) { + sv0 = svt; + } + } + matchsprites_ecs_shres(cnt + 0); + uae_u32 sv1 = 0; + if (denise_spr_nr_armeds) { + uae_u32 svt; + svt = denise_render_sprites_ecs_shres(); + if (!denise_sprite_blank_active && !sprites_hidden) { + sv1 = svt; + } + } + matchsprites_ecs_shres(cnt + 2); + if (sv0 || sv1) { + get_shres_spr_pix(sv0, sv1, &dpix_val0, &dpix_val2); + if (sv0) { + dpix_val1 = dpix_val0; + } + if (sv1) { + dpix_val3 = dpix_val2; + } + } + if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { + dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + dpix_val2 = filter_pixel(dpix_val2, dpix_val3); + gpix0 = filter_pixel_genlock(gpix0, gpix1); + gpix2 = filter_pixel_genlock(gpix2, gpix3); + #ifdef DEBUGGER + if (decode_specials_debug) { + dpix_val0 = decode_denise_specials_debug(dpix_val0, cnt + 0); + } + #endif + *buf1++ = dpix_val0; + *buf2++ = dpix_val0; + *gbuf++ = gpix0; + #ifdef DEBUGGER + if (decode_specials_debug) { + dpix_val2 = decode_denise_specials_debug(dpix_val2, cnt + 2); + } + #endif + *buf1++ = dpix_val2; + *buf2++ = dpix_val2; + *gbuf++ = gpix2; + } + if (!shifted) { + shiftbpl2(); + shiftbpl2(); + shiftbpl2(); + shiftbpl2(); + } + if (bpldat_copy[0] && (denise_hcounter & 3) == bplcon1_shift[0]) { + copybpl2(); + } + internal_pixel_cnt += 4; + sprites_hidden = sprites_hidden2; + #ifdef DEBUGGER + *debug_dma_dhpos_odd = denise_hcounter; + #endif + denise_hcounter++; + denise_hcounter &= 511; + denise_hcounter_next++; + denise_hcounter_next &= 511; + } + denise_pixtotal++; + if (denise_pixtotal == 0) { + internal_pixel_start_cnt = internal_pixel_cnt; + } + denise_hcounter = denise_hcounter_new; + denise_cck++; + } +} static void lts_ecs_shres_dshres_genlock(void) { while (denise_cck < denise_total) { @@ -491,6 +722,7 @@ static void lts_ecs_shres_dshres_genlock(void) } } static LINETOSRC_FUNC linetoscr_ecs_shres_genlock_funcs[] = { + lts_ecs_shres_dhires_genlock, lts_ecs_shres_dhires_genlock, lts_ecs_shres_dshres_genlock, NULL diff --git a/linetoscr_ocs_ecs_genlock.cpp b/linetoscr_ocs_ecs_genlock.cpp index 49ccf665..1c162d28 100644 --- a/linetoscr_ocs_ecs_genlock.cpp +++ b/linetoscr_ocs_ecs_genlock.cpp @@ -1398,6 +1398,7 @@ static void lts_ecs_fm0_n0_p4_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); uae_u32 t0 = 0; if (!extblank) { t0 = dpix_val0; @@ -1556,6 +1557,7 @@ static void lts_ecs_fm0_n1_p4_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); uae_u32 t0 = 0; if (!extblank) { t0 = dpix_val0; @@ -1718,6 +1720,7 @@ static void lts_ecs_fm0_dpf0_p4_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); uae_u32 t0 = 0; if (!extblank) { t0 = dpix_val0; @@ -1880,6 +1883,7 @@ static void lts_ecs_fm0_dpf1_p4_ihires_dlores_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); uae_u32 t0 = 0; if (!extblank) { t0 = dpix_val0; @@ -2096,6 +2100,7 @@ static void lts_ecs_fm0_n0_p4_ihires_dlores_spr_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); if (sv0) { uae_u32 spix0 = denise_render_sprites2(pix0, sv0); if (spix0) { @@ -2289,6 +2294,7 @@ static void lts_ecs_fm0_n1_p4_ihires_dlores_spr_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); if (sv0) { uae_u32 spix0 = denise_render_sprites2(pix0, sv0); if (spix0) { @@ -2486,6 +2492,7 @@ static void lts_ecs_fm0_dpf0_p4_ihires_dlores_spr_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); if (sv0) { uae_u32 spix0 = denise_render_sprites2(pix0, sv0); if (spix0) { @@ -2683,6 +2690,7 @@ static void lts_ecs_fm0_dpf1_p4_ihires_dlores_spr_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); if (sv0) { uae_u32 spix0 = denise_render_sprites2(pix0, sv0); if (spix0) { diff --git a/linetoscr_ocs_ecs_ntsc_genlock.cpp b/linetoscr_ocs_ecs_ntsc_genlock.cpp index e62ec80c..010b6ab2 100644 --- a/linetoscr_ocs_ecs_ntsc_genlock.cpp +++ b/linetoscr_ocs_ecs_ntsc_genlock.cpp @@ -1432,6 +1432,7 @@ static void lts_ecs_fm0_n0_p4_ihires_dlores_ntsc_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = 0; @@ -1594,6 +1595,7 @@ static void lts_ecs_fm0_n1_p4_ihires_dlores_ntsc_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = 0; @@ -1760,6 +1762,7 @@ static void lts_ecs_fm0_dpf0_p4_ihires_dlores_ntsc_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = 0; @@ -1926,6 +1929,7 @@ static void lts_ecs_fm0_dpf1_p4_ihires_dlores_ntsc_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); dtbuf[h][0] = dpix_val0; dtgbuf[h][0] = gpix0; uae_u32 t0 = 0; @@ -2146,6 +2150,7 @@ static void lts_ecs_fm0_n0_p4_ihires_dlores_spr_ntsc_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); if (sv0) { uae_u32 spix0 = denise_render_sprites2(pix0, sv0); if (spix0) { @@ -2343,6 +2348,7 @@ static void lts_ecs_fm0_n1_p4_ihires_dlores_spr_ntsc_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); if (sv0) { uae_u32 spix0 = denise_render_sprites2(pix0, sv0); if (spix0) { @@ -2544,6 +2550,7 @@ static void lts_ecs_fm0_dpf0_p4_ihires_dlores_spr_ntsc_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); if (sv0) { uae_u32 spix0 = denise_render_sprites2(pix0, sv0); if (spix0) { @@ -2745,6 +2752,7 @@ static void lts_ecs_fm0_dpf1_p4_ihires_dlores_spr_ntsc_filtered_genlock(void) internal_pixel_cnt += 2; if (denise_pixtotal >= 0 && denise_pixtotal < denise_pixtotal_max) { dpix_val0 = filter_pixel(dpix_val0, dpix_val1); + gpix0 = filter_pixel_genlock(gpix0, gpix1); if (sv0) { uae_u32 spix0 = denise_render_sprites2(pix0, sv0); if (spix0) { diff --git a/newcpu.cpp b/newcpu.cpp index 3646ea2c..325b4bc4 100644 --- a/newcpu.cpp +++ b/newcpu.cpp @@ -6669,6 +6669,7 @@ void m68k_go (int may_quit) m68k_setpc_normal(pc); fill_prefetch(); update_68k_cycles(); + init_custom(); } if (cpu_prefs_changed_flag & 2) { fixup_cpu(&changed_prefs); -- 2.47.3