mirror of
				https://github.com/N64Recomp/N64ModernRuntime.git
				synced 2025-10-30 08:02:29 +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, | ||||
|     ImemOverrun, | ||||
|     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 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) \ | ||||
|     ((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 DO_DMA_READ(rd_len) dma_rdram_to_dmem(rdram, dma_dmem_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_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_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) { | ||||
|     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); | ||||
| 
 | ||||
|     // Run the ucode
 | ||||
|     RspExitReason exit_reason = ucode_func(rdram); | ||||
|     RspExitReason exit_reason = ucode_func(rdram, task->t.ucode); | ||||
| 
 | ||||
|     // Ensure that the ucode exited correctly
 | ||||
|     if (exit_reason != RspExitReason::Broke) { | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Ethan Lafrenais
						Ethan Lafrenais