mirror of
https://github.com/kwsch/pkNX.git
synced 2026-03-22 10:14:22 -05:00
253 lines
3.8 KiB
C#
253 lines
3.8 KiB
C#
using System;
|
|
|
|
namespace pkNX.Structures;
|
|
|
|
// https://github.com/gameswop/mtasa-resources/blob/d557a72fefef57ac34780a76edf16383d3dff0e8/%5Bgamemodes%5D/%5Bamx%5D/amx-deps/src/amx/amx.c#L143
|
|
public enum AmxOpCode : uint
|
|
{
|
|
NONE,
|
|
LOAD_PRI,
|
|
LOAD_ALT,
|
|
LOAD_S_PRI,
|
|
LOAD_S_ALT,
|
|
LREF_PRI,
|
|
LREF_ALT,
|
|
LREF_S_PRI,
|
|
LREF_S_ALT,
|
|
LOAD_I,
|
|
LODB_I,
|
|
CONST_PRI,
|
|
CONST_ALT,
|
|
ADDR_PRI,
|
|
ADDR_ALT,
|
|
STOR_PRI,
|
|
STOR_ALT,
|
|
STOR_S_PRI,
|
|
STOR_S_ALT,
|
|
SREF_PRI,
|
|
SREF_ALT,
|
|
SREF_S_PRI,
|
|
SREF_S_ALT,
|
|
STOR_I,
|
|
STRB_I,
|
|
LIDX,
|
|
LIDX_B,
|
|
IDXADDR,
|
|
IDXADDR_B,
|
|
ALIGN_PRI,
|
|
ALIGN_ALT,
|
|
LCTRL,
|
|
SCTRL,
|
|
MOVE_PRI,
|
|
MOVE_ALT,
|
|
XCHG,
|
|
PUSH_PRI,
|
|
PUSH_ALT,
|
|
PICK,
|
|
PUSH_C,
|
|
PUSH,
|
|
PUSH_S,
|
|
PPRI,
|
|
PALT,
|
|
STACK,
|
|
HEAP,
|
|
PROC,
|
|
RET,
|
|
RETN,
|
|
CALL,
|
|
CALL_PRI,
|
|
JUMP,
|
|
JREL,
|
|
JZER,
|
|
JNZ,
|
|
JEQ,
|
|
JNEQ,
|
|
JLESS,
|
|
JLEQ,
|
|
JGRTR,
|
|
JGEQ,
|
|
JSLESS,
|
|
JSLEQ,
|
|
JSGRTR,
|
|
JSGEQ,
|
|
SHL,
|
|
SHR,
|
|
SSHR,
|
|
SHL_C_PRI,
|
|
SHL_C_ALT,
|
|
SHR_C_PRI,
|
|
SHR_C_ALT,
|
|
SMUL,
|
|
SDIV,
|
|
SDIV_ALT,
|
|
UMUL,
|
|
UDIV,
|
|
UDIV_ALT,
|
|
ADD,
|
|
SUB,
|
|
SUB_ALT,
|
|
AND,
|
|
OR,
|
|
XOR,
|
|
NOT,
|
|
NEG,
|
|
INVERT,
|
|
ADD_C,
|
|
SMUL_C,
|
|
ZERO_PRI,
|
|
ZERO_ALT,
|
|
ZERO,
|
|
ZERO_S,
|
|
SIGN_PRI,
|
|
SIGN_ALT,
|
|
EQ,
|
|
NEQ,
|
|
LESS,
|
|
LEQ,
|
|
GRTR,
|
|
GEQ,
|
|
SLESS,
|
|
SLEQ,
|
|
SGRTR,
|
|
SGEQ,
|
|
EQ_C_PRI,
|
|
EQ_C_ALT,
|
|
INC_PRI,
|
|
INC_ALT,
|
|
INC,
|
|
INC_S,
|
|
INC_I,
|
|
DEC_PRI,
|
|
DEC_ALT,
|
|
DEC,
|
|
DEC_S,
|
|
DEC_I,
|
|
MOVS,
|
|
CMPS,
|
|
FILL,
|
|
HALT,
|
|
BOUNDS,
|
|
SYSREQ_PRI,
|
|
SYSREQ_C,
|
|
FILE,
|
|
LINE,
|
|
SYMBOL,
|
|
SRANGE,
|
|
JUMP_PRI,
|
|
SWITCH,
|
|
CASETBL,
|
|
SWAP_PRI,
|
|
SWAP_ALT,
|
|
PUSH_ADR,
|
|
NOP,
|
|
SYSREQ_N,
|
|
SYMTAG,
|
|
BREAK,
|
|
PUSH2_C,
|
|
PUSH2,
|
|
PUSH2_S,
|
|
PUSH2_ADR,
|
|
PUSH3_C,
|
|
PUSH3,
|
|
PUSH3_S,
|
|
PUSH3_ADR,
|
|
PUSH4_C,
|
|
PUSH4,
|
|
PUSH4_S,
|
|
PUSH4_ADR,
|
|
PUSH5_C,
|
|
PUSH5,
|
|
PUSH5_S,
|
|
PUSH5_ADR,
|
|
LOAD_BOTH,
|
|
LOAD_S_BOTH,
|
|
CONST,
|
|
CONST_S,
|
|
/* overlay instructions */
|
|
ICALL,
|
|
IRETN,
|
|
ISWITCH,
|
|
ICASETBL,
|
|
/* packed instructions */
|
|
LOAD_P_PRI,
|
|
LOAD_P_ALT,
|
|
LOAD_P_S_PRI,
|
|
LOAD_P_S_ALT,
|
|
LREF_P_PRI,
|
|
LREF_P_ALT,
|
|
LREF_P_S_PRI,
|
|
LREF_P_S_ALT,
|
|
LODB_P_I,
|
|
CONST_P_PRI,
|
|
CONST_P_ALT,
|
|
ADDR_P_PRI,
|
|
ADDR_P_ALT,
|
|
STOR_P_PRI,
|
|
STOR_P_ALT,
|
|
STOR_P_S_PRI,
|
|
STOR_P_S_ALT,
|
|
SREF_P_PRI,
|
|
SREF_P_ALT,
|
|
SREF_P_S_PRI,
|
|
SREF_P_S_ALT,
|
|
STRB_P_I,
|
|
LIDX_P_B,
|
|
IDXADDR_P_B,
|
|
ALIGN_P_PRI,
|
|
ALIGN_P_ALT,
|
|
PUSH_P_C,
|
|
PUSH_P,
|
|
PUSH_P_S,
|
|
STACK_P,
|
|
HEAP_P,
|
|
SHL_P_C_PRI,
|
|
SHL_P_C_ALT,
|
|
SHR_P_C_PRI,
|
|
SHR_P_C_ALT,
|
|
ADD_P_C,
|
|
SMUL_P_C,
|
|
ZERO_P,
|
|
ZERO_P_S,
|
|
EQ_P_C_PRI,
|
|
EQ_P_C_ALT,
|
|
INC_P,
|
|
INC_P_S,
|
|
DEC_P,
|
|
DEC_P_S,
|
|
MOVS_P,
|
|
CMPS_P,
|
|
FILL_P,
|
|
HALT_P,
|
|
BOUNDS_P,
|
|
PUSH_P_ADR,
|
|
|
|
SYSREQ_D,
|
|
SYSREQ_ND,
|
|
NUM_OPCODES,
|
|
}
|
|
|
|
public static class AmxOpCodeExtensions
|
|
{
|
|
public static AmxOpCode Invert(this AmxOpCode spop)
|
|
{
|
|
return spop switch
|
|
{
|
|
AmxOpCode.JSLEQ => AmxOpCode.JSGRTR,
|
|
AmxOpCode.JSLESS => AmxOpCode.JSGEQ,
|
|
AmxOpCode.JSGRTR => AmxOpCode.JSLEQ,
|
|
AmxOpCode.JSGEQ => AmxOpCode.JSLESS,
|
|
AmxOpCode.JEQ => AmxOpCode.JNEQ,
|
|
AmxOpCode.JNEQ => AmxOpCode.JEQ,
|
|
AmxOpCode.JNZ => AmxOpCode.JZER,
|
|
AmxOpCode.JZER => AmxOpCode.JNZ,
|
|
AmxOpCode.SLEQ => AmxOpCode.SGRTR,
|
|
AmxOpCode.SLESS => AmxOpCode.SGEQ,
|
|
AmxOpCode.SGRTR => AmxOpCode.SLEQ,
|
|
AmxOpCode.SGEQ => AmxOpCode.SLESS,
|
|
AmxOpCode.EQ => AmxOpCode.NEQ,
|
|
AmxOpCode.NEQ => AmxOpCode.EQ,
|
|
_ => throw new ArgumentException(nameof(spop)),
|
|
};
|
|
}
|
|
}
|