mirror of
https://github.com/LIV2/WinUAE.git
synced 2025-12-06 00:12:52 +00:00
Non-CE mode SPRxPOS/CTL/DATx mid screen modification stability fix.
This commit is contained in:
parent
094a34abed
commit
4e0540dbf8
@ -1996,6 +1996,9 @@ void do_blitter(int hpos, int copper, uaecptr pc)
|
||||
bltcon0_old = bltcon0;
|
||||
bltcon1_old = bltcon1;
|
||||
|
||||
if (blitter_cycle_exact != (currprefs.blitter_cycle_exact ? 1 : 0)) {
|
||||
memset(blitter_pipe, 0, sizeof(blitter_pipe));
|
||||
}
|
||||
blitter_cycle_exact = currprefs.blitter_cycle_exact;
|
||||
immediate_blits = currprefs.immediate_blits;
|
||||
blt_info.got_cycle = 0;
|
||||
|
||||
39
custom.cpp
39
custom.cpp
@ -4863,8 +4863,8 @@ STATIC_INLINE void one_fetch_cycle_0(int hpos, int fm)
|
||||
if (datreg & CYCLE_PIPE_BITPLANE) {
|
||||
plane0 = fetch((datreg - 1) & 7, fm, hpos, (datreg & CYCLE_PIPE_MODULO) != 0);
|
||||
} else if (datreg & CYCLE_PIPE_COPPER) {
|
||||
do_copper_fetch(hpos, datreg);
|
||||
cycle_line_pipe[hpos] = 0;
|
||||
do_copper_fetch(hpos, datreg);
|
||||
}
|
||||
|
||||
if (plane0p_enabled) {
|
||||
@ -5652,17 +5652,11 @@ static void record_sprite(int num, int sprxp, uae_u16 *data, uae_u16 *datb, unsi
|
||||
low order bit records whether the attach bit was set for this pair. */
|
||||
if (attachment) {
|
||||
uae_u32 state = 0x01010101 << (num & ~1);
|
||||
uae_u8 *stb1 = spixstate.stb + word_offs;
|
||||
uae_u32 *stb1 = (uae_u32*)(spixstate.stb + word_offs);
|
||||
for (int i = 0; i < width; i += 8) {
|
||||
stb1[0] |= state;
|
||||
stb1[1] |= state;
|
||||
stb1[2] |= state;
|
||||
stb1[3] |= state;
|
||||
stb1[4] |= state;
|
||||
stb1[5] |= state;
|
||||
stb1[6] |= state;
|
||||
stb1[7] |= state;
|
||||
stb1 += 8;
|
||||
stb1 += 2;
|
||||
}
|
||||
e->has_attached = 1;
|
||||
}
|
||||
@ -9908,7 +9902,11 @@ static void SPRxDATB(int hpos, uae_u16 v, int num)
|
||||
static void SPRxCTL_2(uae_u32 vv)
|
||||
{
|
||||
int hpos = current_hpos();
|
||||
uae_u16 v = vv >> 16;
|
||||
if (!currprefs.cpu_memory_cycle_exact) {
|
||||
// current_hpos() assumes cycle-by-cycle emulation which does not happen in non-CE modes. FIXME!
|
||||
hpos = ((vv >> 24) + 1) % maxhposm0;
|
||||
}
|
||||
uae_u16 v = vv >> 8;
|
||||
int num = vv & 7;
|
||||
#if SPRITE_DEBUG > 0
|
||||
if (vpos >= SPRITE_DEBUG_MINY && vpos <= SPRITE_DEBUG_MAXY && (SPRITE_DEBUG & (1 << num))) {
|
||||
@ -9921,14 +9919,17 @@ static void SPRxCTL_2(uae_u32 vv)
|
||||
}
|
||||
static void SPRxCTL(int hpos, uae_u16 v, int num)
|
||||
{
|
||||
uae_u32 vv = (v << 16) | num;
|
||||
uae_u32 vv = (hpos << 24) | (v << 8) | num;
|
||||
event2_newevent_xx_ce(1 * CYCLE_UNIT, vv, SPRxCTL_2);
|
||||
}
|
||||
|
||||
static void SPRxPOS_2(uae_u32 vv)
|
||||
{
|
||||
int hpos = current_hpos();
|
||||
uae_u16 v = vv >> 16;
|
||||
if (!currprefs.cpu_memory_cycle_exact) {
|
||||
hpos = ((vv >> 24) + 1) % maxhposm0;
|
||||
}
|
||||
uae_u16 v = vv >> 8;
|
||||
int num = vv & 7;
|
||||
struct sprite *s = &spr[num];
|
||||
#if SPRITE_DEBUG > 0
|
||||
@ -9941,7 +9942,7 @@ static void SPRxPOS_2(uae_u32 vv)
|
||||
}
|
||||
static void SPRxPOS(int hpos, uae_u16 v, int num)
|
||||
{
|
||||
uae_u32 vv = (v << 16) | num;
|
||||
uae_u32 vv = (hpos << 24) | (v << 8) | num;
|
||||
event2_newevent_xx_ce(1 * CYCLE_UNIT, vv, SPRxPOS_2);
|
||||
}
|
||||
|
||||
@ -10319,7 +10320,9 @@ static bool copper_cant_read(int hpos, uae_u16 alloc)
|
||||
int offset = get_rga_pipeline(hpos, coffset);
|
||||
if (alloc && !bitplane_dma_access(hpos, coffset) && !cycle_line_pipe[offset]) {
|
||||
cycle_line_pipe[offset] = CYCLE_PIPE_NONE | CYCLE_PIPE_COPPER;
|
||||
blitter_pipe[offset] = CYCLE_PIPE_COPPER;
|
||||
if (currprefs.blitter_cycle_exact) {
|
||||
blitter_pipe[offset] = CYCLE_PIPE_COPPER;
|
||||
}
|
||||
#ifdef DEBUGGER
|
||||
int dvpos = vpos + 1;
|
||||
if (is_last_line()) {
|
||||
@ -10364,7 +10367,9 @@ static bool copper_cant_read(int hpos, uae_u16 alloc)
|
||||
// Keep copper cycles, without it blitter would
|
||||
// think copper cycles are free cycles because they
|
||||
// are cleared after copper has processed them
|
||||
blitter_pipe[offset] = CYCLE_PIPE_COPPER;
|
||||
if (currprefs.blitter_cycle_exact) {
|
||||
blitter_pipe[offset] = CYCLE_PIPE_COPPER;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
@ -10411,8 +10416,8 @@ static void decide_line(int endhpos)
|
||||
}
|
||||
uae_u16 datreg = cycle_line_pipe[hpos];
|
||||
if (datreg & CYCLE_PIPE_COPPER) {
|
||||
do_copper_fetch(hpos, datreg);
|
||||
cycle_line_pipe[hpos] = 0;
|
||||
do_copper_fetch(hpos, datreg);
|
||||
}
|
||||
|
||||
bool dma = dmacon_bpl;
|
||||
@ -11050,8 +11055,8 @@ static void update_copper(int until_hpos)
|
||||
bool copper_dma = (cycle_line_pipe[hpos] & CYCLE_PIPE_COPPER) != 0;
|
||||
if (copper_dma) {
|
||||
uae_u16 v = cycle_line_pipe[hpos];
|
||||
do_copper_fetch(hpos, v);
|
||||
cycle_line_pipe[hpos] = 0;
|
||||
do_copper_fetch(hpos, v);
|
||||
}
|
||||
|
||||
if (!copper_enabled_thisline) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user