Files
Client/GameTools/ScriptEngine/IMCodeUnits.h
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

641 lines
12 KiB
C++

#ifndef _IMCodeUnits_H_
#define _IMCodeUnits_H_
#include "BaseDef.h"
#include "Message.h"
#include "STL.h"
class CSymbolTable;
class CRelocTable;
typedef map<int, long> FUNCTABLE;
///////////////////////////////////////////////////////////////////////////////////
//
void SetSymbolTable( CSymbolTable * );
void SetFuncTable( FUNCTABLE * );
void SetRelocTable( CRelocTable * );
///////////////////////////////////////////////////////////////////////////////////
//
typedef unsigned char byte;
enum eRegister
{
EAX = 0,
ECX,
EDX,
EBX,
ESP,
EBP,
ESI,
EDI = 7,
NONE = 8
};
enum eCondition
{
G = 0, //Greater
GE, //Greater or Equal
L, //Less
LE, //Less or Equal
E, //Equal
NE = 5 //Not Equal
};
typedef struct _VAR_* VAR;
typedef struct _CONST_* CONST;
typedef struct _FUNC_* FUNC;
///////////////////////////////////////////////////////////////////////////////////
//
class IOPCode
{
public:
long m_lAddress;
public:
virtual ~IOPCode() {} //ToMachineCode 호출 전에 Addressing이 반드시 되어 있어야 한다.
virtual int ToMachineCode( byte * ) = 0; //넘겨받은 주소에 기계어 코드를 쓰고 index를 증가시킨다.
virtual long Addressing( long ) = 0; //현재 주소를 받고, 다음 instruction의 주소를 리턴한다.
virtual void Show( MESSAGE_FUNCTION2 ) = 0;
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_call : public IOPCode
{
FUNC m_funcID;
int m_iLine;
public:
COP_call( FUNC, int line );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 Print );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_mov : public IOPCode
{
byte m_Type;
FUNC m_funcID;
union
{
VAR m_leftVarID;
eRegister m_leftReg;
};
union
{
int m_midArrayIndex;
eRegister m_midIndexReg;
};
union
{
eRegister m_rightReg;
CONST m_rightConstID;
VAR m_rightVarID;
int m_rightValue;
float m_rightValuef;
};
public:
COP_mov( FUNC, VAR, eRegister reg );
COP_mov( eRegister reg, FUNC, VAR );
COP_mov( eRegister reg, CONST constID );
COP_mov( FUNC, VAR, float valuef );
COP_mov( eRegister lreg, eRegister rreg );
COP_mov( eRegister lreg, int value );
COP_mov( FUNC, VAR, int arrayIndex, eRegister rreg );
COP_mov( eRegister lreg, FUNC, VAR, eRegister indexReg );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 Print );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_nop : public IOPCode
{
public:
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 Print );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_add : public IOPCode
{
byte m_Type;
eRegister m_leftReg;
union
{
int m_iValue;
eRegister m_rightReg;
};
public:
COP_add( eRegister reg, int value );
COP_add( eRegister lreg, eRegister rreg );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 Print );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_sub : public IOPCode
{
byte m_Type;
eRegister m_leftReg;
union
{
eRegister m_rightReg;
int m_iValue;
};
public:
COP_sub( eRegister reg, int value );
COP_sub( eRegister lreg, eRegister rreg );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 Print );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_imul : public IOPCode
{
eRegister m_leftReg;
eRegister m_rightReg;
public:
COP_imul( eRegister lreg, eRegister rreg );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 Print );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_idiv : public IOPCode
{
eRegister m_rightReg;
public:
COP_idiv( eRegister rreg );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 Print );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_push : public IOPCode
{
eRegister m_Reg;
public:
COP_push( eRegister reg );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 Print );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_pop : public IOPCode
{
eRegister m_Reg;
public:
COP_pop( eRegister reg );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_jmp : public IOPCode
{
public:
IOPCode * m_pJumpTarget;
public:
COP_jmp();
COP_jmp( IOPCode * pJmpTarget );
virtual ~COP_jmp();
virtual int ToMachineCode( byte * );
virtual long Addressing( long addr );
virtual void Show( MESSAGE_FUNCTION2 Print );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_jcc : public COP_jmp
{
eCondition m_Condition;
public:
COP_jcc( eCondition condition );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 Print );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_jmpmark : public IOPCode
{
public:
IOPCode * m_pJumpSrc;
public:
COP_jmpmark();
COP_jmpmark( COP_jmp * pOPjmp );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 Print );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_cmp : public IOPCode
{
byte m_Type;
FUNC m_funcID;
union
{
VAR m_leftVarID;
eRegister m_leftReg;
};
union
{
byte m_rightValue;
CONST m_rightConstID;
eRegister m_rightReg;
};
public:
COP_cmp( FUNC, VAR lvarID, CONST rconstID );
COP_cmp( eRegister lreg, byte value );
COP_cmp( eRegister lreg, eRegister rreg );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 Print );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_ret : public IOPCode
{
public:
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 Print );
};
class COP_xor : public IOPCode
{
eRegister m_leftReg;
eRegister m_rightReg;
public:
COP_xor( eRegister lreg, eRegister rreg );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 Print );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_setcc : public IOPCode
{
eCondition m_Condition;
eRegister m_Reg;
public:
COP_setcc( eCondition condition, eRegister lreg );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_int3 : public IOPCode
{
public:
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_fld : public IOPCode
{
FUNC m_funcID;
VAR m_varID;
public:
COP_fld( FUNC, VAR );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_fadd : public IOPCode
{
FUNC m_funcID;
VAR m_varID;
public:
COP_fadd( FUNC, VAR );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_fsub : public IOPCode
{
FUNC m_funcID;
VAR m_varID;
public:
COP_fsub( FUNC, VAR );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_fmul : public IOPCode
{
FUNC m_funcID;
VAR m_varID;
public:
COP_fmul( FUNC, VAR );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_fdiv : public IOPCode
{
FUNC m_funcID;
VAR m_varID;
public:
COP_fdiv( FUNC, VAR );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_fstp : public IOPCode
{
FUNC m_funcID;
VAR m_varID;
bool m_bDouble;
public:
COP_fstp( FUNC, VAR, bool = false );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_fcomp : public IOPCode
{
FUNC m_funcID;
VAR m_varID;
public:
COP_fcomp( FUNC, VAR );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_fnstsw_ax : public IOPCode
{
public:
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_test_ah : public IOPCode
{
byte m_Value8;
public:
COP_test_ah( byte );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_itoa : public IOPCode
{
eRegister m_leftReg;
FUNC m_funcID;
VAR m_StringBuffer;
public:
COP_itoa( eRegister, VAR );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 Print );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_ftoa : public IOPCode
{
eRegister m_freeReg;
VAR m_DoubleVar;
VAR m_StringBuffer;
public:
COP_ftoa( eRegister, VAR, VAR );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 Print );
};
///////////////////////////////////////////////////////////////////////////////////
//
//할당된 메모리의 주소가 EAX에 들어간다.
class COP_malloc : public IOPCode
{
eRegister m_Reg;
public:
COP_malloc( eRegister );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 Print );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_free : public IOPCode
{
FUNC m_funcID;
VAR m_varID;
public:
COP_free( FUNC, VAR );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 Print );
};
///////////////////////////////////////////////////////////////////////////////////
//
class COP_strcpy : public IOPCode
{
int m_type;
eRegister m_leftReg;
FUNC m_funcID;
union
{
eRegister m_rightReg;
VAR m_varID;
};
public:
COP_strcpy( eRegister, eRegister );
COP_strcpy( eRegister, FUNC, VAR );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 Print );
};
///////////////////////////////////////////////////////////////////////////////////
//
//ptr[leftReg]과 ptr[rightReg]의 문자열을 비교해서 결과값을 eax에 넣는다.
class COP_strcmp : public IOPCode
{
eRegister m_leftReg;
eRegister m_rightReg;
public:
COP_strcmp( eRegister lreg, eRegister rreg );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 Print );
};
///////////////////////////////////////////////////////////////////////////////////
//
//ptr [rightReg] 에 있는 문자열의 길이를 세서 leftReg에 넣는다.
class COP_strlen : public IOPCode
{
int m_type;
FUNC m_funcID;
union
{
eRegister m_Reg;
VAR m_varID;
};
public:
COP_strlen( eRegister reg );
COP_strlen( FUNC, VAR );
int ToMachineCode( byte * );
long Addressing( long addr );
void Show( MESSAGE_FUNCTION2 Print );
};
///////////////////////////////////////////////////////////////////////////////////
#endif