mirror of
				https://github.com/RetroDECK/Duckstation.git
				synced 2025-04-10 19:15:14 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			65 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* Bra.h -- Branch converters for executables
 | |
| 2013-01-18 : Igor Pavlov : Public domain */
 | |
| 
 | |
| #ifndef __BRA_H
 | |
| #define __BRA_H
 | |
| 
 | |
| #include "7zTypes.h"
 | |
| 
 | |
| EXTERN_C_BEGIN
 | |
| 
 | |
| /*
 | |
| These functions convert relative addresses to absolute addresses
 | |
| in CALL instructions to increase the compression ratio.
 | |
|   
 | |
|   In:
 | |
|     data     - data buffer
 | |
|     size     - size of data
 | |
|     ip       - current virtual Instruction Pinter (IP) value
 | |
|     state    - state variable for x86 converter
 | |
|     encoding - 0 (for decoding), 1 (for encoding)
 | |
|   
 | |
|   Out:
 | |
|     state    - state variable for x86 converter
 | |
| 
 | |
|   Returns:
 | |
|     The number of processed bytes. If you call these functions with multiple calls,
 | |
|     you must start next call with first byte after block of processed bytes.
 | |
|   
 | |
|   Type   Endian  Alignment  LookAhead
 | |
|   
 | |
|   x86    little      1          4
 | |
|   ARMT   little      2          2
 | |
|   ARM    little      4          0
 | |
|   PPC     big        4          0
 | |
|   SPARC   big        4          0
 | |
|   IA64   little     16          0
 | |
| 
 | |
|   size must be >= Alignment + LookAhead, if it's not last block.
 | |
|   If (size < Alignment + LookAhead), converter returns 0.
 | |
| 
 | |
|   Example:
 | |
| 
 | |
|     UInt32 ip = 0;
 | |
|     for ()
 | |
|     {
 | |
|       ; size must be >= Alignment + LookAhead, if it's not last block
 | |
|       SizeT processed = Convert(data, size, ip, 1);
 | |
|       data += processed;
 | |
|       size -= processed;
 | |
|       ip += processed;
 | |
|     }
 | |
| */
 | |
| 
 | |
| #define x86_Convert_Init(state) { state = 0; }
 | |
| SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding);
 | |
| SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);
 | |
| SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);
 | |
| SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);
 | |
| SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);
 | |
| SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);
 | |
| 
 | |
| EXTERN_C_END
 | |
| 
 | |
| #endif
 | 
