VDP timing improvements

This commit is contained in:
kub 2020-01-26 20:46:21 +01:00
parent 2d5b6a66c1
commit 1259ac4f60
4 changed files with 11 additions and 9 deletions

View file

@ -254,7 +254,7 @@ PICO_INTERNAL int CheckDMA(int cycles)
dma_op1 = dma_op; dma_op1 = dma_op;
if(Pico.video.reg[12] & 1) dma_op |= 4; // 40 cell mode? if(Pico.video.reg[12] & 1) dma_op |= 4; // 40 cell mode?
if(!(Pico.video.status&8)&&(Pico.video.reg[1]&0x40)) dma_op|=8; // active display? if(!(Pico.video.status&8)&&(Pico.video.reg[1]&0x40)) dma_op|=8; // active display?
xfers_can = (dma_timings[dma_op] * cycles + 0xff) >> 16; xfers_can = (dma_timings[dma_op] * cycles + 0x8000) >> 16;
if(xfers <= xfers_can) if(xfers <= xfers_can)
{ {
Pico.video.status &= ~SR_DMA; Pico.video.status &= ~SR_DMA;
@ -265,6 +265,7 @@ PICO_INTERNAL int CheckDMA(int cycles)
if(!(dma_op&2)) burn = cycles; if(!(dma_op&2)) burn = cycles;
Pico.m.dma_xfers -= xfers_can; Pico.m.dma_xfers -= xfers_can;
} }
Pico.t.dma_end = SekCyclesDone() + burn;
elprintf(EL_VDPDMA, "~Dma %i op=%i can=%i burn=%i [%u]", elprintf(EL_VDPDMA, "~Dma %i op=%i can=%i burn=%i [%u]",
Pico.m.dma_xfers, dma_op1, xfers_can, burn, SekCyclesDone()); Pico.m.dma_xfers, dma_op1, xfers_can, burn, SekCyclesDone());

View file

@ -56,10 +56,10 @@ static void SekSyncM68k(void)
static __inline void SekRunM68k(int cyc) static __inline void SekRunM68k(int cyc)
{ {
Pico.t.m68c_aim += cyc; Pico.t.m68c_aim += cyc;
Pico.t.m68c_cnt += cyc >> 6; // refresh slowdowns
cyc = Pico.t.m68c_aim - Pico.t.m68c_cnt; cyc = Pico.t.m68c_aim - Pico.t.m68c_cnt;
if (cyc <= 0) if (cyc <= 0)
return; return;
Pico.t.m68c_cnt += cyc >> 6; // refresh slowdowns
SekSyncM68k(); SekSyncM68k();
} }

View file

@ -137,9 +137,7 @@ extern m68ki_cpu_core PicoCpuMM68k, PicoCpuMS68k;
// burn cycles while not in SekRun() and while in // burn cycles while not in SekRun() and while in
#define SekCyclesBurn(c) Pico.t.m68c_cnt += c #define SekCyclesBurn(c) Pico.t.m68c_cnt += c
#define SekCyclesBurnRun(c) { \ #define SekCyclesBurnRun(c) SekCyclesLeft -= c
SekCyclesLeft -= c; \
}
// note: sometimes may extend timeslice to delay an irq // note: sometimes may extend timeslice to delay an irq
#define SekEndRun(after) { \ #define SekEndRun(after) { \
@ -421,6 +419,7 @@ struct PicoTiming
unsigned int z80c_aim; unsigned int z80c_aim;
int z80_scanline; int z80_scanline;
unsigned int dma_end; // end of current DMA op (m68k cycles)
int timer_a_next_oflow, timer_a_step; // in z80 cycles int timer_a_next_oflow, timer_a_step; // in z80 cycles
int timer_b_next_oflow, timer_b_step; int timer_b_next_oflow, timer_b_step;
}; };

View file

@ -376,12 +376,12 @@ PICO_INTERNAL_ASM void PicoVideoWrite(unsigned int a,unsigned short d)
pvid->pending=0; pvid->pending=0;
} }
if (!(pvid->status & SR_VB) && !(PicoIn.opt&POPT_DIS_VDP_FIFO)) if (!(pvid->status & SR_VB) && (pvid->reg[1]&0x40) && !(PicoIn.opt&POPT_DIS_VDP_FIFO))
{ {
int use = pvid->type == 1 ? 2 : 1; int use = pvid->type == 1 ? 2 : 1;
pvid->lwrite_cnt -= use; pvid->lwrite_cnt -= use;
if (pvid->lwrite_cnt < 0) if (pvid->lwrite_cnt < 0)
SekCyclesLeft = 0; SekCyclesBurnRun(488 - (SekCyclesDone()-Pico.t.m68c_line_start));
elprintf(EL_ASVDP, "VDP data write: [%04x] %04x [%u] {%i} #%i @ %06x", elprintf(EL_ASVDP, "VDP data write: [%04x] %04x [%u] {%i} #%i @ %06x",
Pico.video.addr, d, SekCyclesDone(), Pico.video.type, pvid->lwrite_cnt, SekPc); Pico.video.addr, d, SekCyclesDone(), Pico.video.type, pvid->lwrite_cnt, SekPc);
} }
@ -509,9 +509,11 @@ static u32 SrLow(const struct PicoVideo *pv)
{ {
unsigned int c, d = pv->status; unsigned int c, d = pv->status;
c = SekCyclesDone() - Pico.t.m68c_line_start - 39; c = SekCyclesDone();
if (c < 92) if (c - Pico.t.m68c_line_start - 39 < 92)
d |= SR_HB; d |= SR_HB;
if (CYCLES_GT(c, Pico.t.dma_end))
d &= ~SR_DMA;
return d; return d;
} }