mirror of
https://github.com/N64Recomp/N64ModernRuntime.git
synced 2025-12-17 05:22:35 +00:00
Runtime support for RSP overlays (#77)
This commit is contained in:
parent
50029c70fd
commit
7eb4bc3459
2 changed files with 21 additions and 6 deletions
|
|
@ -14,10 +14,25 @@ enum class RspExitReason {
|
||||||
Broke,
|
Broke,
|
||||||
ImemOverrun,
|
ImemOverrun,
|
||||||
UnhandledJumpTarget,
|
UnhandledJumpTarget,
|
||||||
Unsupported
|
Unsupported,
|
||||||
|
SwapOverlay,
|
||||||
|
UnhandledResumeTarget
|
||||||
};
|
};
|
||||||
|
|
||||||
using RspUcodeFunc = RspExitReason(uint8_t* rdram);
|
struct RspContext {
|
||||||
|
uint32_t r1, r2, r3, r4, r5, r6, r7,
|
||||||
|
r8, r9, r10, r11, r12, r13, r14, r15,
|
||||||
|
r16, r17, r18, r19, r20, r21, r22, r23,
|
||||||
|
r24, r25, r26, r27, r28, r29, r30, r31;
|
||||||
|
uint32_t dma_mem_address;
|
||||||
|
uint32_t dma_dram_address;
|
||||||
|
uint32_t jump_target;
|
||||||
|
RSP rsp;
|
||||||
|
uint32_t resume_address;
|
||||||
|
bool resume_delay;
|
||||||
|
};
|
||||||
|
|
||||||
|
using RspUcodeFunc = RspExitReason(uint8_t* rdram, uint32_t ucode_addr);
|
||||||
|
|
||||||
extern uint8_t dmem[];
|
extern uint8_t dmem[];
|
||||||
extern uint16_t rspReciprocals[512];
|
extern uint16_t rspReciprocals[512];
|
||||||
|
|
@ -74,10 +89,10 @@ static inline void RSP_MEM_H_STORE(uint32_t offset, uint32_t addr, uint32_t val)
|
||||||
#define RSP_SIGNED(val) \
|
#define RSP_SIGNED(val) \
|
||||||
((int32_t)(val))
|
((int32_t)(val))
|
||||||
|
|
||||||
#define SET_DMA_DMEM(dmem_addr) dma_dmem_address = (dmem_addr)
|
#define SET_DMA_MEM(mem_addr) dma_mem_address = (mem_addr)
|
||||||
#define SET_DMA_DRAM(dram_addr) dma_dram_address = (dram_addr)
|
#define SET_DMA_DRAM(dram_addr) dma_dram_address = (dram_addr)
|
||||||
#define DO_DMA_READ(rd_len) dma_rdram_to_dmem(rdram, dma_dmem_address, dma_dram_address, (rd_len))
|
#define DO_DMA_READ(rd_len) dma_rdram_to_dmem(rdram, dma_mem_address, dma_dram_address, (rd_len))
|
||||||
#define DO_DMA_WRITE(wr_len) dma_dmem_to_rdram(rdram, dma_dmem_address, dma_dram_address, (wr_len))
|
#define DO_DMA_WRITE(wr_len) dma_dmem_to_rdram(rdram, dma_mem_address, dma_dram_address, (wr_len))
|
||||||
|
|
||||||
static inline void dma_rdram_to_dmem(uint8_t* rdram, uint32_t dmem_addr, uint32_t dram_addr, uint32_t rd_len) {
|
static inline void dma_rdram_to_dmem(uint8_t* rdram, uint32_t dmem_addr, uint32_t dram_addr, uint32_t rd_len) {
|
||||||
rd_len += 1; // Read length is inclusive
|
rd_len += 1; // Read length is inclusive
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,7 @@ bool recomp::rsp::run_task(uint8_t* rdram, const OSTask* task) {
|
||||||
dma_rdram_to_dmem(rdram, 0x0000, task->t.ucode_data, 0xF80 - 1);
|
dma_rdram_to_dmem(rdram, 0x0000, task->t.ucode_data, 0xF80 - 1);
|
||||||
|
|
||||||
// Run the ucode
|
// Run the ucode
|
||||||
RspExitReason exit_reason = ucode_func(rdram);
|
RspExitReason exit_reason = ucode_func(rdram, task->t.ucode);
|
||||||
|
|
||||||
// Ensure that the ucode exited correctly
|
// Ensure that the ucode exited correctly
|
||||||
if (exit_reason != RspExitReason::Broke) {
|
if (exit_reason != RspExitReason::Broke) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue