mirror of
				https://github.com/N64Recomp/N64ModernRuntime.git
				synced 2025-10-30 08:02:29 +00:00 
			
		
		
		
	Fix unplugged controller memory writes, add some missing math routines, and slightly weaken DMA alignment requirements (#117)
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				validate / ubuntu (arm64, Debug) (push) Has been cancelled
				
			
		
			
				
	
				validate / ubuntu (arm64, Release) (push) Has been cancelled
				
			
		
			
				
	
				validate / ubuntu (x64, Debug) (push) Has been cancelled
				
			
		
			
				
	
				validate / ubuntu (x64, Release) (push) Has been cancelled
				
			
		
			
				
	
				validate / windows (x64, Debug) (push) Has been cancelled
				
			
		
			
				
	
				validate / windows (x64, Release) (push) Has been cancelled
				
			
		
			
				
	
				validate / macos (arm64, Debug) (push) Has been cancelled
				
			
		
			
				
	
				validate / macos (arm64, Release) (push) Has been cancelled
				
			
		
			
				
	
				validate / macos (x64, Debug) (push) Has been cancelled
				
			
		
			
				
	
				validate / macos (x64, Release) (push) Has been cancelled
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	validate / ubuntu (arm64, Debug) (push) Has been cancelled
				
			validate / ubuntu (arm64, Release) (push) Has been cancelled
				
			validate / ubuntu (x64, Debug) (push) Has been cancelled
				
			validate / ubuntu (x64, Release) (push) Has been cancelled
				
			validate / windows (x64, Debug) (push) Has been cancelled
				
			validate / windows (x64, Release) (push) Has been cancelled
				
			validate / macos (arm64, Debug) (push) Has been cancelled
				
			validate / macos (arm64, Release) (push) Has been cancelled
				
			validate / macos (x64, Debug) (push) Has been cancelled
				
			validate / macos (x64, Release) (push) Has been cancelled
				
			--------- Co-authored-by: LittleCube <littlecubehax@gmail.com>
This commit is contained in:
		
							parent
							
								
									94b30d7061
								
							
						
					
					
						commit
						ba2acaeb5c
					
				
					 3 changed files with 38 additions and 5 deletions
				
			
		|  | @ -50,12 +50,14 @@ extern "C" void osContGetReadData_recomp(uint8_t* rdram, recomp_context* ctx) { | |||
|     osContGetReadData(dummy_data); | ||||
| 
 | ||||
|     for (int controller = 0; controller < MAXCONTROLLERS; controller++) { | ||||
|         if (dummy_data[controller].err_no == 0) { | ||||
|             MEM_H(6 * controller + 0, data) = dummy_data[controller].button; | ||||
|             MEM_B(6 * controller + 2, data) = dummy_data[controller].stick_x; | ||||
|             MEM_B(6 * controller + 3, data) = dummy_data[controller].stick_y; | ||||
|             MEM_B(6 * controller + 4, data) = dummy_data[controller].err_no; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| extern "C" void osContStartQuery_recomp(uint8_t * rdram, recomp_context * ctx) { | ||||
|     PTR(OSMesgQueue) mq = _arg<0, PTR(OSMesgQueue)>(rdram, ctx); | ||||
|  |  | |||
|  | @ -80,3 +80,35 @@ extern "C" void __ull_to_f_recomp(uint8_t * rdram, recomp_context * ctx) { | |||
| 
 | ||||
|     ctx->f0.fl = ret; | ||||
| } | ||||
| 
 | ||||
| extern "C" void __ull_rshift_recomp(uint8_t * rdram, recomp_context * ctx) { | ||||
|     uint64_t a = (ctx->r4 << 32) | ((ctx->r5 << 0) & 0xFFFFFFFFu); | ||||
|     uint64_t b = (ctx->r6 << 32) | ((ctx->r7 << 0) & 0xFFFFFFFFu); | ||||
|     uint64_t ret = a >> b; | ||||
| 
 | ||||
|     ctx->r2 = (int32_t)(ret >> 32); | ||||
|     ctx->r3 = (int32_t)(ret >> 0); | ||||
| } | ||||
| 
 | ||||
| extern "C" void __ll_to_f_recomp(uint8_t * rdram, recomp_context * ctx) { | ||||
|     int64_t a = (ctx->r4 << 32) | ((ctx->r5 << 0) & 0xFFFFFFFFu); | ||||
|     float ret = (float)a; | ||||
| 
 | ||||
|     ctx->f0.fl = ret; | ||||
| } | ||||
| 
 | ||||
| extern "C" void __f_to_ll_recomp(uint8_t * rdram, recomp_context * ctx) { | ||||
|     int64_t ret = (int64_t)ctx->f12.fl; | ||||
| 
 | ||||
|     ctx->r2 = (int32_t)(ret >> 32); | ||||
|     ctx->r3 = (int32_t)(ret >> 0); | ||||
| } | ||||
| 
 | ||||
| extern "C" void __ll_lshift_recomp(uint8_t * rdram, recomp_context * ctx) { | ||||
|     uint64_t a = (ctx->r4 << 32) | ((ctx->r5 << 0) & 0xFFFFFFFFu); | ||||
|     uint64_t b = (ctx->r6 << 32) | ((ctx->r7 << 0) & 0xFFFFFFFFu); | ||||
|     uint64_t ret = a << b; | ||||
| 
 | ||||
|     ctx->r2 = (int32_t)(ret >> 32); | ||||
|     ctx->r3 = (int32_t)(ret >> 0); | ||||
| } | ||||
|  |  | |||
|  | @ -67,7 +67,6 @@ void recomp::do_rom_read(uint8_t* rdram, gpr ram_address, uint32_t physical_addr | |||
|     // TODO handle misaligned DMA
 | ||||
|     assert((physical_addr & 0x1) == 0 && "Only PI DMA from aligned ROM addresses is currently supported"); | ||||
|     assert((ram_address & 0x7) == 0 && "Only PI DMA to aligned RDRAM addresses is currently supported"); | ||||
|     assert((num_bytes & 0x1) == 0 && "Only PI DMA with aligned sizes is currently supported"); | ||||
|     uint8_t* rom_addr = rom.data() + physical_addr - recomp::rom_base; | ||||
|     for (size_t i = 0; i < num_bytes; i++) { | ||||
|         MEM_B(i, ram_address) = *rom_addr; | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Wiseguy
						Wiseguy