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, |     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
	
	 Ethan Lafrenais
						Ethan Lafrenais