mirror of
https://github.com/openmoh/openmohaa.git
synced 2025-04-29 06:07:57 +03:00
183 lines
6.3 KiB
C
183 lines
6.3 KiB
C
#ifndef __ASM_H__
|
|
#define __ASM_H__
|
|
|
|
#if defined ( CGAME_DLL )
|
|
#define _CGAME_CODE() if(1)
|
|
#else
|
|
#define _CGAME_CODE() if(0)
|
|
#endif
|
|
|
|
#if defined ( WIN32 )
|
|
#define _LINUX_CODE() if(0)
|
|
#define WIN32_CODE() if(1)
|
|
#else
|
|
#define _CGAME_CODE() if(0)
|
|
#define _LINUX_CODE() if(1)
|
|
#define WIN32_CODE() if(0)
|
|
#endif
|
|
|
|
#ifdef WIN32
|
|
#define NAKED __declspec(naked)
|
|
#else
|
|
#define NAKED
|
|
#endif
|
|
|
|
#ifdef __GNUC__
|
|
#define JMPTO( addr ) asm("leave;mov %0, %%edx;jmp *%%edx;" : : "g"((DWORD)addr) )
|
|
#define JMPTO_DIRECT( addr ) asm("movl %0, %%edx;jmp *%%edx;" : : "g"((DWORD)addr) )
|
|
#define CALL( addr ) asm("movl %0, %%edx;call *%%edx;" : : "g"((DWORD)addr) ) //{ DWORD address_CALL = (DWORD) addr; __asm__ __volatile__("movl %0, %%edx;call *%%edx;" : : "g"(address_CALL) ); }
|
|
#define PUSH( addr ) asm("pushl %0;" : : "g"(*(DWORD *)&addr) ) //{ DWORD address_PUSH = (DWORD) addr; __asm__ __volatile__("push %0;" :: "g"(address_PUSH)); }
|
|
#define POP( addr ) asm("popl %0;" : : "g"(*(DWORD *)&addr) ) //{ DWORD address_PUSH = (DWORD) addr; __asm__ __volatile__("push %0;" :: "g"(address_PUSH)); }
|
|
#ifndef WIN32
|
|
#define SET_CLASS( addr ) asm("movl %0, %%eax; movl %%eax, (%%esp);" : : "g"((DWORD)addr) ) // asm("movl %0, %%ecx;" : : "g"(addr) ) //{ DWORD address_SET_CLASS = (DWORD) addr; __asm__ __volatile__("movl %0, %%ecx;" : : "g"(address_SET_CLASS) ); }
|
|
#define GET_CLASS( var ) asm("movl %%esp, %0;" : "=r"(var) )
|
|
#else
|
|
#define SET_CLASS( addr ) asm("movl %0, %%ecx;" : : "g"((DWORD)addr) ) // asm("movl %0, %%ecx;" : : "g"(addr) ) //{ DWORD address_SET_CLASS = (DWORD) addr; __asm__ __volatile__("movl %0, %%ecx;" : : "g"(address_SET_CLASS) ); }
|
|
#define GET_CLASS( var ) asm("movl %%ecx, %0;" : "=r"(var) )
|
|
#endif
|
|
|
|
#define MAKE_JUMPER( declaration, gamex86_address, fgameded_symbol, cgamex86_address ) declaration {} //asm( ".globl " #fgameded_symbol "\n\t" #fgameded_symbol ":\n\tmovl _" #fgameded_symbol "_, %edx;jmp *%edx;" )
|
|
#else
|
|
#define JMPTO( addr ) { _asm leave _asm mov edx, addr _asm jmp edx }
|
|
#define JMPTO_DIRECT( addr ) { _asm mov edx, addr _asm jmp edx }
|
|
#define CALL( addr ) { _asm mov edx, addr _asm call edx }
|
|
#define PUSH( addr ) { _asm push addr }
|
|
#define POP( addr ) { _asm pop addr }
|
|
#define SET_CLASS( addr ) { _asm mov ecx, addr }
|
|
#define GET_CLASS( var ) { _asm mov var, ecx }
|
|
|
|
#define MAKE_JUMPER( declaration, gamex86_address, fgameded_symbol, cgamex86_address ) \
|
|
__declspec(naked) declaration { JMPTO_DIRECT_WIN32( gamex86_address) JMPTO_DIRECT_CGAME( cgamex86_address ) }
|
|
#endif
|
|
|
|
#if defined ( _UBER_SDK )
|
|
#define MP_NUMBER( gamex86, fgameded, cgamex86 ) 0
|
|
#define MP_STRING( gamex86, fgameded, cgamex86 ) 0
|
|
#endif
|
|
|
|
#if defined ( CGAME_DLL )
|
|
#define MP_NUMBER( gamex86, fgameded, cgamex86 ) cgamex86
|
|
#define MP_STRING( gamex86, fgameded, cgamex86 ) cgamex86
|
|
#define JMPTO_CGAME(addr) JMPTO(addr)
|
|
#define JMPTO_DIRECT_CGAME(addr) JMPTO_DIRECT(addr)
|
|
|
|
#if defined( SPEARHEAD ) || defined( SH )
|
|
#define JMPTO_SH_CGAME(addr) JMPTO(addr)
|
|
#define JMPTO_SH_DIRECT_GAME(addr) JMPTO_DIRECT(addr)
|
|
#else
|
|
#define JMPTO_SH_CGAME(addr)
|
|
#define JMPTO_SH_DIRECT_GAME(addr)
|
|
#endif
|
|
|
|
#if defined( BREAKTHROUGH ) || defined( BT )
|
|
#define JMPTO_BT_CGAME(addr) JMPTO(addr)
|
|
#define JMPTO_BT_DIRECT_GAME(addr) JMPTO_DIRECT(addr)
|
|
#else
|
|
#define JMPTO_BT_CGAME(addr)
|
|
#define JMPTO_BT_DIRECT_GAME(addr)
|
|
#endif
|
|
|
|
#define CALL_CGAME(addr) CALL(addr)
|
|
#else
|
|
#define JMPTO_CGAME(addr)
|
|
#define JMPTO_DIRECT_CGAME(addr)
|
|
#define CALL_CGAME(addr) CALL(addr)
|
|
#define JMPTO_SH_CGAME(addr)
|
|
#define JMPTO_SH_DIRECT_GAME(addr)
|
|
#define JMPTO_BT_CGAME(addr)
|
|
#define JMPTO_BT_DIRECT_GAME(addr)
|
|
#endif
|
|
|
|
#if !defined( SPEARHEAD ) && !defined( SH )
|
|
#define JMPTO_SH_WIN32(addr)
|
|
#define JMPTO_SH_DIRECT_WIN32(addr)
|
|
#define JMPTO_SH_LINUX(addr)
|
|
#define JMPTO_SH_DIRECT_LINUX(addr)
|
|
#endif
|
|
|
|
#if !defined( BREAKTHROUGH ) && !defined( BT )
|
|
#define JMPTO_BT_WIN32(addr)
|
|
#define JMPTO_BT_DIRECT_WIN32(addr)
|
|
#define JMPTO_BT_LINUX(addr)
|
|
#define JMPTO_BT_DIRECT_LINUX(addr)
|
|
#endif
|
|
|
|
#if defined ( WIN32 )
|
|
|
|
#if defined( GAME_DLL )
|
|
#define MP_NUMBER( gamex86, fgameded, cgamex86 ) gamex86
|
|
#define MP_STRING( gamex86, fgameded, cgamex86 ) gamex86
|
|
#define CALL_WIN32(addr) CALL(addr)
|
|
#define JMPTO_WIN32(addr) JMPTO(addr)
|
|
#define JMPTO_DIRECT_WIN32(addr) JMPTO_DIRECT(addr)
|
|
|
|
#if defined( SPEARHEAD ) || defined( SH )
|
|
#define JMPTO_SH_WIN32(addr) JMPTO(addr)
|
|
#define JMPTO_SH_DIRECT_WIN32(addr) JMPTO_DIRECT(addr)
|
|
#endif
|
|
|
|
#if defined( BREAKTHROUGH ) || defined( BT )
|
|
#define JMPTO_BT_WIN32(addr) JMPTO(addr)
|
|
#define JMPTO_BT_DIRECT_WIN32(addr) JMPTO_DIRECT(addr)
|
|
#endif
|
|
#else
|
|
#define CALL_WIN32(addr)
|
|
#define JMPTO_WIN32(addr)
|
|
#define JMPTO_DIRECT_WIN32(addr)
|
|
#define JMPTO_SH_WIN32(addr)
|
|
#define JMPTO_SH_DIRECT_WIN32(addr)
|
|
#define JMPTO_BT_WIN32(addr)
|
|
#define JMPTO_BT_DIRECT_WIN32(addr)
|
|
#endif
|
|
|
|
#define JMPTO_LINUX(addr)
|
|
#define JMPTO_DIRECT_LINUX(addr)
|
|
#define JMPTO_SH_LINUX(addr)
|
|
#define JMPTO_SH_DIRECT_LINUX(addr)
|
|
#define JMPTO_BT_LINUX(addr)
|
|
#define JMPTO_BT_DIRECT_LINUX(addr)
|
|
#define CALL_LINUX(addr)
|
|
#define SET_CLASS_LINUX( addr )
|
|
#define SET_CLASS_WIN32( addr ) SET_CLASS( addr )
|
|
#else
|
|
#define MP_NUMBER( gamex86, fgameded, cgamex86 ) fgameded
|
|
#define MP_STRING( gamex86, fgameded, cgamex86 ) fgameded
|
|
#define JMPTO_CLIENT(addr)
|
|
#define JMPTO_LINUX(addr) JMPTO(addr)
|
|
#define JMPTO_WIN32(addr)
|
|
#define JMPTO_DIRECT_CLIENT(addr)
|
|
#define JMPTO_DIRECT_LINUX(addr) JMPTO_DIRECT(addr)
|
|
#define JMPTO_DIRECT_WIN32(addr)
|
|
|
|
#if defined( SPEARHEAD ) || defined( SH )
|
|
#define JMPTO_SH_LINUX(addr) JMPTO(addr)
|
|
#define JMPTO_SH_DIRECT_LINUX(addr) JMPTO_DIRECT(addr)
|
|
#endif
|
|
|
|
#if defined( BREAKTHROUGH ) || defined( BT )
|
|
#define JMPTO_BT_LINUX(addr) JMPTO(addr)
|
|
#define JMPTO_BT_DIRECT_LINUX(addr) JMPTO_DIRECT(addr)
|
|
#endif
|
|
|
|
#define CALL_LINUX(addr) CALL(addr)
|
|
#define CALL_WIN32(addr)
|
|
#define SET_CLASS_LINUX( addr ) SET_CLASS( addr )
|
|
#define SET_CLASS_WIN32( addr )
|
|
#endif
|
|
|
|
#define MP_CODE( gamex86, fgameded, cgamex86 ) MP_NUMBER( gamex86, fgameded, cgamex86 )
|
|
|
|
#ifndef WIN32
|
|
|
|
extern void* dl_fgame_sym( const char *symbol );
|
|
|
|
#define SYMBOL_DECLARE( symbol ) DWORD _##symbol##_ = (DWORD)dl_fgame_sym( #symbol ) //void* symbol = dlsym( hmod, #symbol )
|
|
#define SYMBOL_GET( symbol ) _##symbol##_
|
|
#else
|
|
#define SYMBOL_DECLARE( symbol )
|
|
#define SYMBOL_GET( symbol ) 0
|
|
#endif
|
|
|
|
#define SYM( symbol ) SYMBOL_GET( symbol )
|
|
|
|
#endif /* __ASM_H__ */
|