pkNX/pkNX.Structures/Scripts/AmxOpCode.cs
2022-10-01 17:46:11 -07:00

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)),
};
}
}