From 8abbf267e1575256c883040f0187dfd05ada8515 Mon Sep 17 00:00:00 2001 From: Christopher Snowhill Date: Wed, 9 Mar 2022 20:55:15 -0800 Subject: [PATCH] Highly Complete / USF: Fix playback for some USFs The code now requires a variable to be set if Display Lists are to be skipped by setting display processor interrupt as the bypass code is supposed to. Also handle unsupported Ucode by calling the low level RSP emulator instead. Signed-off-by: Christopher Snowhill --- Frameworks/lazyusf2/lazyusf2/main/main.c | 9 +++++++++ Frameworks/lazyusf2/lazyusf2/rsp_hle/plugin.c | 5 ++++- Frameworks/lazyusf2/lazyusf2/rsp_lle/execute.h | 4 ++-- Frameworks/lazyusf2/lazyusf2/rsp_lle/rsp.c | 7 +++++++ Frameworks/lazyusf2/lazyusf2/rsp_lle/rsp.h | 2 ++ 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/Frameworks/lazyusf2/lazyusf2/main/main.c b/Frameworks/lazyusf2/lazyusf2/main/main.c index 7dd5d2956..6b5379baa 100644 --- a/Frameworks/lazyusf2/lazyusf2/main/main.c +++ b/Frameworks/lazyusf2/lazyusf2/main/main.c @@ -187,6 +187,15 @@ m64p_error main_start(usf_state_t * state) state->enable_hle_audio = 0; } + // Assume it's a proper rip + if (state->enablecompare && state->enableFIFOfull) + { + state->g_delay_si = 1; + state->g_delay_ai = 1; + state->g_delay_pi = 1; + state->g_delay_dp = 1; + } + return M64ERR_SUCCESS; } diff --git a/Frameworks/lazyusf2/lazyusf2/rsp_hle/plugin.c b/Frameworks/lazyusf2/lazyusf2/rsp_hle/plugin.c index 0f767d5b9..72b5f49ca 100644 --- a/Frameworks/lazyusf2/lazyusf2/rsp_hle/plugin.c +++ b/Frameworks/lazyusf2/lazyusf2/rsp_hle/plugin.c @@ -32,6 +32,8 @@ #include "hle.h" +extern void rsp_lle_run_task(usf_state_t * state); + /* Global functions needed by HLE core */ void HleVerboseMessage(void* user_defined, const char *message, ...) { @@ -123,5 +125,6 @@ void HleShowCFB(void* user_defined) int HleForwardTask(void* user_defined) { - /* disabled */ + rsp_lle_run_task((usf_state_t *)user_defined); + return 0; } diff --git a/Frameworks/lazyusf2/lazyusf2/rsp_lle/execute.h b/Frameworks/lazyusf2/lazyusf2/rsp_lle/execute.h index fc5f022c6..7c28b8f08 100644 --- a/Frameworks/lazyusf2/lazyusf2/rsp_lle/execute.h +++ b/Frameworks/lazyusf2/lazyusf2/rsp_lle/execute.h @@ -121,7 +121,7 @@ EX: if (state->g_sp.regs[SP_STATUS_REG] & 0x00000040) { /* SP_STATUS_INTR_BREAK */ state->g_r4300.mi.regs[MI_INTR_REG] |= 0x00000001; - //check_interupt(state); + check_interupt(state); } CONTINUE case 040: /* ADD */ @@ -482,7 +482,7 @@ BRANCH: if (state->g_sp.regs[SP_STATUS_REG] & 0x00000002) /* normal exit, from executing BREAK */ return; else if (state->g_r4300.mi.regs[MI_INTR_REG] & 0x00000001) /* interrupt set by MTC0 to break */ - /*check_interupt(state)*/; + check_interupt(state); else if (CFG_WAIT_FOR_CPU_HOST != 0) /* plugin system hack to re-sync */ {} else if (state->g_sp.regs[SP_SEMAPHORE_REG] != 0x00000000) /* semaphore lock fixes */ diff --git a/Frameworks/lazyusf2/lazyusf2/rsp_lle/rsp.c b/Frameworks/lazyusf2/lazyusf2/rsp_lle/rsp.c index c03ff7947..fbc63a155 100644 --- a/Frameworks/lazyusf2/lazyusf2/rsp_lle/rsp.c +++ b/Frameworks/lazyusf2/lazyusf2/rsp_lle/rsp.c @@ -59,6 +59,11 @@ void real_run_rsp(usf_state_t * state, uint32_t cycles) run_task(state); } +void rsp_lle_run_task(usf_state_t * state) +{ + run_task(state); +} + int32_t init_rsp_lle(usf_state_t * state) { state->CR[0x0] = &state->g_sp.regs[SP_MEM_ADDR_REG]; @@ -105,5 +110,7 @@ int32_t init_rsp_lle(usf_state_t * state) &state->g_dp.dpc_regs[DPC_TMEM_REG], state); + state->hle.hle_gfx = 1; + return 0; } diff --git a/Frameworks/lazyusf2/lazyusf2/rsp_lle/rsp.h b/Frameworks/lazyusf2/lazyusf2/rsp_lle/rsp.h index 0422ee3d9..2aa79db58 100644 --- a/Frameworks/lazyusf2/lazyusf2/rsp_lle/rsp.h +++ b/Frameworks/lazyusf2/lazyusf2/rsp_lle/rsp.h @@ -82,6 +82,8 @@ int32_t init_rsp_lle(usf_state_t * state); NOINLINE static void run_task(usf_state_t * state); #include "execute.h" +void rsp_lle_run_task(usf_state_t * state); + #ifdef SP_EXECUTE_LOG #include "matrix.h"