core, fix z80 vcounter value

This commit is contained in:
kub 2023-07-12 22:35:33 +02:00
parent adffea8dae
commit 7021622153
4 changed files with 27 additions and 28 deletions

View file

@ -1367,7 +1367,7 @@ static unsigned char z80_md_vdp_read(unsigned short a)
case 0x04: return PicoVideoRead8CtlH(1);
case 0x05: return PicoVideoRead8CtlL(1);
case 0x08:
case 0x0c: return get_scanline(1); // FIXME: make it proper
case 0x0c: return PicoVideoGetV(get_scanline(1));
case 0x09:
case 0x0d: return Pico.m.rotate++;
}

View file

@ -225,6 +225,15 @@ void PicoLoopPrepare(void)
// force setting possibly changed..
Pico.m.pal = (PicoIn.regionOverride == 2 || PicoIn.regionOverride == 8) ? 1 : 0;
if (Pico.m.pal) {
Pico.t.vcnt_wrap = 0x103;
Pico.t.vcnt_adj = 57;
}
else {
Pico.t.vcnt_wrap = 0xEB;
Pico.t.vcnt_adj = 6;
}
Pico.m.dirtyPal = 1;
rendstatus_old = -1;

View file

@ -136,7 +136,6 @@ static int PicoFrameHints(void)
{
struct PicoVideo *pv = &Pico.video;
int lines, y, lines_vis, skip;
int vcnt_wrap, vcnt_adj;
int hint; // Hint counter
pevt_log_m68k_o(EVT_FRAME_START);
@ -144,7 +143,6 @@ static int PicoFrameHints(void)
skip = PicoIn.skipFrame;
Pico.t.m68c_frame_start = Pico.t.m68c_aim;
pv->v_counter = Pico.m.scanline = 0;
z80_resetCycles();
PsndStartFrame();
@ -155,14 +153,11 @@ static int PicoFrameHints(void)
for (y = 0;; y++)
{
pv->v_counter = Pico.m.scanline = y;
if ((pv->reg[12]&6) == 6) { // interlace mode 2
pv->v_counter <<= 1;
pv->v_counter |= pv->v_counter >> 8;
pv->v_counter &= 0xff;
}
Pico.m.scanline = y;
pv->v_counter = PicoVideoGetV(y);
if ((y == 224 && !(pv->reg[1] & 8)) || y == 240)
lines_vis = (pv->reg[1] & 8) ? 240 : 224;
if (y == lines_vis)
break;
PAD_DELAY();
@ -268,25 +263,11 @@ static int PicoFrameHints(void)
pevt_log_m68k_o(EVT_NEXT_LINE);
// === VBLANK ===
if (Pico.m.pal) {
lines = 313;
vcnt_wrap = 0x103;
vcnt_adj = 57;
}
else {
lines = 262;
vcnt_wrap = 0xEB;
vcnt_adj = 6;
}
lines = Pico.m.pal ? 313 : 262;
for (y++; y < lines - 1; y++)
{
pv->v_counter = Pico.m.scanline = y;
if (y >= vcnt_wrap)
pv->v_counter -= vcnt_adj;
if ((pv->reg[12]&6) == 6)
pv->v_counter = (pv->v_counter << 1) | 1;
pv->v_counter &= 0xff;
Pico.m.scanline = y;
pv->v_counter = PicoVideoGetV(y);
PAD_DELAY();

View file

@ -454,6 +454,8 @@ struct PicoTiming
int timer_a_next_oflow, timer_a_step; // in z80 cycles
int timer_b_next_oflow, timer_b_step;
int vcnt_wrap, vcnt_adj;
};
struct PicoSound
@ -914,6 +916,13 @@ static __inline void VideoWriteVRAM(u32 a, u16 d)
UpdateSAT(a, d);
}
static __inline u8 PicoVideoGetV(int scanline)
{
if (scanline >= Pico.t.vcnt_wrap) scanline -= Pico.t.vcnt_adj;
if ((Pico.video.reg[12]&6) == 6) scanline = (scanline<<1) | 1;
return scanline;
}
PICO_INTERNAL_ASM void PicoVideoWrite(u32 a,unsigned short d);
PICO_INTERNAL_ASM u32 PicoVideoRead(u32 a);
unsigned char PicoVideoRead8DataH(int is_from_z80);