mirror of
				https://github.com/thornAvery/jep-hack.git
				synced 2025-11-04 21:01:01 +13:00 
			
		
		
		
	
		
			
				
	
	
		
			66 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
MACRO ___wram_conversion_table
 | 
						|
	; in:
 | 
						|
	; 1: name of the table; will be prefixed to all definitions
 | 
						|
	; 2: table size, in entries
 | 
						|
	; 3: locked ID table size
 | 
						|
	; 4: last allocations table size
 | 
						|
	; 5: cache size
 | 
						|
	assert (\2) <= $FE, \
 | 
						|
		"16-bit conversion table error: too many table entries"
 | 
						|
	assert (\2) >= $20, \
 | 
						|
		"16-bit conversion table error: too many table entries"
 | 
						|
	assert ((\3) + (\4)) <= (\2), \
 | 
						|
		"16-bit conversion table error: too many fixed indexes"
 | 
						|
 | 
						|
	assert (\4) >= 2, \
 | 
						|
		"16-bit conversion table error: recent allocations table must contain at least two entries"
 | 
						|
 | 
						|
	assert !((\5) & ((\5) - 1)), \
 | 
						|
		"16-bit conversion table error: invalid cache size"
 | 
						|
 | 
						|
	assert ((\3) + (\4) + (\5)) <= $100, \
 | 
						|
		"16-bit conversion table error: cache would straddle a $100 alignment boundary"
 | 
						|
 | 
						|
\1::
 | 
						|
 | 
						|
\1UsedSlots:: db
 | 
						|
\1LastAllocatedIndex:: db ; index into LastAllocated
 | 
						|
\1Entries:: ds 2 * (\2)
 | 
						|
\1EntriesEnd::
 | 
						|
 | 
						|
; pad to a multiple of $100; ensure that the remaining values share the same high byte
 | 
						|
	DEF ___total_bytes = 2 + (2 * (\2)) + (\3) + (\4) + (\5)
 | 
						|
	if LOW(___total_bytes)
 | 
						|
		ds $100 - LOW(___total_bytes)
 | 
						|
	endc
 | 
						|
 | 
						|
	if \5
 | 
						|
	\1EntryCache:: ds \5
 | 
						|
	endc
 | 
						|
 | 
						|
	if \3
 | 
						|
	\1LockedEntries:: ds \3
 | 
						|
	endc
 | 
						|
 | 
						|
\1LastAllocated:: ds \4
 | 
						|
 | 
						|
\1End::
 | 
						|
 | 
						|
ENDM
 | 
						|
 | 
						|
MACRO wram_conversion_table
 | 
						|
	; uses constants to invoke the macro above
 | 
						|
	; in: WRAM prefix, constant prefix
 | 
						|
	assert \2_MINIMUM_RESERVED_INDEX <= $FF, \
 | 
						|
		"16-bit conversion table error: $FF must be declared as a reserved index"
 | 
						|
 | 
						|
	assert \2_ENTRIES < \2_MINIMUM_RESERVED_INDEX, \
 | 
						|
		"16-bit conversion table error: table entries and reserved indexes overlap"
 | 
						|
 | 
						|
	___wram_conversion_table \1, \
 | 
						|
	                         \2_ENTRIES, \
 | 
						|
	                         \2_LOCKED_ENTRIES, \
 | 
						|
	                         \2_SAVED_RECENT_INDEXES, \
 | 
						|
	                         \2_CACHE_SIZE
 | 
						|
ENDM
 |