From 155a3aa678ee0c65ed8703bccc48d36f81da1db5 Mon Sep 17 00:00:00 2001 From: Guy Perfect Date: Fri, 17 Jan 2025 09:43:58 -0600 Subject: [PATCH] Adjust GAMESTART logic, consolidate VIP sign-extensions --- core/bus.c | 4 ---- core/vip.c | 43 ++++++++++++++++++++++++------------------- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/core/bus.c b/core/bus.c index 2288552..9f9be2c 100644 --- a/core/bus.c +++ b/core/bus.c @@ -153,10 +153,6 @@ static void busRead(VB *sim, uint32_t address, int type, int32_t *value) { case 0: /* VIP */ vipRead(sim, address, type, value); - switch (type) { - case VB_S8 : *value = (int8_t ) *value; break; - case VB_S16: *value = (int16_t) *value; break; - } break; case 1: break; /* VSU */ diff --git a/core/vip.c b/core/vip.c index fbb0434..c898ed5 100644 --- a/core/vip.c +++ b/core/vip.c @@ -654,29 +654,29 @@ static int vipEmulateDisplay(VB *sim, uint32_t clocks) { vipThrow(sim, 0x0010); /* FRAMESTART */ /* Game frame */ - if (sim->vip.xp.xpen) { - if (sim->vip.xp.frame >= sim->vip.frmcyc) { - sim->vip.dp.buffer ^= sim->vip.xp.toggle; - sim->vip.xp.frame = 0; - sim->vip.xp.toggle = 0; + if (sim->vip.xp.frame >= sim->vip.frmcyc) { + sim->vip.xp.frame = 0; - /* Initiate drawing procedure */ - if (sim->vip.xp.step == 0) { - sim->vip.xp.enabled = 1; - sim->vip.xp.overtime = 0; - sim->vip.xp.step = 1; - vipThrow(sim, 0x0008); /* GAMESTART */ - } + vipThrow(sim, 0x0008); /* GAMESTART */ + if (sim->vip.xp.step != 0) { + sim->vip.xp.overtime = 1; + vipThrow(sim, 0x8000); /* TIMEERR */ + } - /* Drawing procedure has run into overtime */ - else { - sim->vip.xp.overtime = 1; - vipThrow(sim, 0x8000); /* TIMEERR */ - } + /* Initiate drawing procedure */ + else if (sim->vip.xp.xpen) { + sim->vip.dp.buffer ^= sim->vip.xp.toggle; + sim->vip.xp.enabled = 1; + sim->vip.xp.overtime = 0; + sim->vip.xp.step = 1; + sim->vip.xp.toggle = 0; + } - } else sim->vip.xp.frame++; } + /* Not a game frame */ + else sim->vip.xp.frame++; + break; /* 0ms-3ms - Idle */ @@ -1316,8 +1316,13 @@ static void vipRead(VB *sim, uint32_t address, int type, int32_t *value) { *value = 0; /* I/O register */ - else if (address < 0x60000) + else if (address < 0x60000) { *value = vipReadIO(sim, address, type); + switch (type) { + case VB_S8 : *value = (int8_t ) *value; break; + case VB_S16: *value = (int16_t) *value; break; + } + } /* Unmapped */ else if (address < 0x78000)