mirror of
				https://github.com/coop-deluxe/sm64coopdx.git
				synced 2025-10-30 08:01:01 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			65 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#ifndef _MACROS_H_
 | 
						|
#define _MACROS_H_
 | 
						|
 | 
						|
#include "platform_info.h"
 | 
						|
 | 
						|
#ifndef __sgi
 | 
						|
#define GLOBAL_ASM(...)
 | 
						|
#endif
 | 
						|
 | 
						|
#if !defined(__sgi) && (!defined(NON_MATCHING) || !defined(AVOID_UB))
 | 
						|
// asm-process isn't supported outside of IDO, and undefined behavior causes
 | 
						|
// crashes.
 | 
						|
#error Matching build is only possible on IDO; please build with NON_MATCHING=1.
 | 
						|
#endif
 | 
						|
 | 
						|
#define ARRAY_COUNT(arr) (s32)(sizeof(arr) / sizeof(arr[0]))
 | 
						|
 | 
						|
#define GLUE(a, b) a ## b
 | 
						|
#define GLUE2(a, b) GLUE(a, b)
 | 
						|
 | 
						|
// Avoid compiler warnings for unused variables
 | 
						|
#ifdef __GNUC__
 | 
						|
#define UNUSED __attribute__((unused))
 | 
						|
#else
 | 
						|
#define UNUSED
 | 
						|
#endif
 | 
						|
 | 
						|
// Static assertions
 | 
						|
#ifdef __GNUC__
 | 
						|
#define STATIC_ASSERT(cond, msg) _Static_assert(cond, msg)
 | 
						|
#else
 | 
						|
#define STATIC_ASSERT(cond, msg) typedef char GLUE2(static_assertion_failed, __LINE__)[(cond) ? 1 : -1]
 | 
						|
#endif
 | 
						|
 | 
						|
// Align to 8-byte boundary for DMA requirements
 | 
						|
#ifdef __GNUC__
 | 
						|
#define ALIGNED8 __attribute__((aligned(8)))
 | 
						|
#else
 | 
						|
#define ALIGNED8
 | 
						|
#endif
 | 
						|
 | 
						|
// Align to 16-byte boundary for audio lib requirements
 | 
						|
#ifdef __GNUC__
 | 
						|
#define ALIGNED16 __attribute__((aligned(16)))
 | 
						|
#else
 | 
						|
#define ALIGNED16
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef TARGET_N64
 | 
						|
// convert a virtual address to physical.
 | 
						|
#define VIRTUAL_TO_PHYSICAL(addr)   ((uintptr_t)(addr) & 0x1FFFFFFF)
 | 
						|
 | 
						|
// convert a physical address to virtual.
 | 
						|
#define PHYSICAL_TO_VIRTUAL(addr)   ((uintptr_t)(addr) | 0x80000000)
 | 
						|
 | 
						|
// another way of converting virtual to physical
 | 
						|
#define VIRTUAL_TO_PHYSICAL2(addr)  ((u8 *)(addr) - 0x80000000U)
 | 
						|
#else
 | 
						|
// no conversion for pc port other than cast
 | 
						|
#define VIRTUAL_TO_PHYSICAL(addr)   ((uintptr_t)(addr))
 | 
						|
#define PHYSICAL_TO_VIRTUAL(addr)   ((uintptr_t)(addr))
 | 
						|
#define VIRTUAL_TO_PHYSICAL2(addr)  ((void *)(addr))
 | 
						|
#endif
 | 
						|
 | 
						|
#endif
 |