diff --git a/src/cpu/rsp.c b/src/cpu/rsp.c index e570d78a..68919465 100644 --- a/src/cpu/rsp.c +++ b/src/cpu/rsp.c @@ -9,10 +9,10 @@ rsp_t n64rsp; bool rsp_acquire_semaphore() { if (N64RSP.semaphore_held) { - return false; // Semaphore is already held + return true; // Semaphore is already held } else { N64RSP.semaphore_held = true; - return true; // Acquired semaphore. + return false; // Acquired semaphore. } } diff --git a/src/cpu/rsp_interface.c b/src/cpu/rsp_interface.c index 4b67f0b6..2c88e915 100644 --- a/src/cpu/rsp_interface.c +++ b/src/cpu/rsp_interface.c @@ -87,7 +87,7 @@ word read_word_spreg(word address) { case ADDR_SP_DMA_BUSY_REG: return 0; // DMA not busy, since it's instant. case ADDR_SP_SEMAPHORE_REG: - return N64RSP.semaphore_held; + return rsp_acquire_semaphore(); default: logfatal("Reading word from unknown/unsupported address 0x%08X in region: REGION_SP_REGS", address); } @@ -119,11 +119,7 @@ void write_word_spreg(word address, word value) { case ADDR_SP_DMA_BUSY_REG: logfatal("Write to unsupported SP reg: ADDR_SP_DMA_BUSY_REG"); case ADDR_SP_SEMAPHORE_REG: - if (value == 0) { - rsp_release_semaphore(); - } else { - logfatal("Wrote non-zero value 0x%08X to SP reg ADDR_SP_SEMAPHORE_REG", value); - } + rsp_release_semaphore(); case ADDR_SP_PC_REG: set_rsp_pc(value); break;