Merge branch 'next' into neo
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b4a961f..92d4ea1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -28,8 +28,8 @@
option(CAPSTONE_BUILD_CSTOOL "Build cstool" ON)
option(CAPSTONE_USE_DEFAULT_ALLOC "Use default memory allocation functions" ON)
-set(SUPPORTED_ARCHITECTURES ARM ARM64 M68K MIPS PPC SPARC SYSZ XCORE X86 TMS320C64X M680X EVM)
-set(SUPPORTED_ARCHITECTURE_LABELS ARM ARM64 M68K MIPS PowerPC Sparc SystemZ XCore x86 TMS320C64x M680x EVM)
+set(SUPPORTED_ARCHITECTURES ARM ARM64 M68K MIPS PPC SPARC SYSZ XCORE X86 TMS320C64X M680X EVM NEO)
+set(SUPPORTED_ARCHITECTURE_LABELS ARM ARM64 M68K MIPS PowerPC Sparc SystemZ XCore x86 TMS320C64x M680x EVM NEO)
list(LENGTH SUPPORTED_ARCHITECTURES count)
math(EXPR count "${count}-1")
@@ -382,6 +382,23 @@
set(TEST_SOURCES ${TEST_SOURCES} test_evm.c)
endif ()
+if (CAPSTONE_NEO_SUPPORT)
+ add_definitions(-DCAPSTONE_HAS_NEO)
+ set(SOURCES_NEO
+ arch/NEO/NEODisassembler.c
+ arch/NEO/NEOInstPrinter.c
+ arch/NEO/NEOMapping.c
+ arch/NEO/NEOModule.c
+ )
+ set(HEADERS_NEO
+ arch/NEO/NEODisassembler.h
+ arch/NEO/NEOInstPrinter.h
+ arch/NEO/NEOMapping.h
+ arch/NEO/NEOMappingInsn.inc
+ )
+ set(TEST_SOURCES ${TEST_SOURCES} test_neo.c)
+endif ()
+
if (CAPSTONE_OSXKERNEL_SUPPORT)
add_definitions(-DCAPSTONE_HAS_OSXKERNEL)
endif ()
@@ -400,6 +417,7 @@
${SOURCES_TMS320C64X}
${SOURCES_M680X}
${SOURCES_EVM}
+ ${SOURCES_NEO}
)
set(ALL_HEADERS
@@ -417,6 +435,7 @@
${HEADERS_TMS320C64X}
${HEADERS_M680X}
${HEADERS_EVM}
+ ${HEADERS_NEO}
)
include_directories("${PROJECT_SOURCE_DIR}/include")
@@ -497,6 +516,7 @@
source_group("Source\\TMS320C64x" FILES ${SOURCES_TMS320C64X})
source_group("Source\\M680X" FILES ${SOURCES_M680X})
source_group("Source\\EVM" FILES ${SOURCES_EVM})
+source_group("Source\\NEO" FILES ${SOURCES_NEO})
source_group("Include\\Common" FILES ${HEADERS_COMMON})
source_group("Include\\Engine" FILES ${HEADERS_ENGINE})
@@ -512,6 +532,7 @@
source_group("Include\\TMS320C64x" FILES ${HEADERS_TMS320C64X})
source_group("Include\\M680X" FILES ${HEADERS_MC680X})
source_group("Include\\EVM" FILES ${HEADERS_EVM})
+source_group("Include\\NEO" FILES ${HEADERS_NEO})
### test library 64bit routine:
get_property(LIB64 GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS)
diff --git a/COMPILE.TXT b/COMPILE.TXT
index 56aecad..9fa135e 100644
--- a/COMPILE.TXT
+++ b/COMPILE.TXT
@@ -17,12 +17,12 @@
(0) Tailor Capstone to your need.
- Out of 12 archtitectures supported by Capstone (Arm, Arm64, M68K, Mips, PPC,
- Sparc, SystemZ, XCore, X86, M680X, TMS320C64x & EVM), if you just need several
- selected archs, choose the ones you want to compile in by editing "config.mk"
- before going to next steps.
+ Out of 13 archtitectures supported by Capstone (Arm, Arm64, M68K, Mips, PPC,
+ Sparc, SystemZ, XCore, X86, M680X, TMS320C64x, EVM & NEO), if you just need
+ several selected archs, choose the ones you want to compile in by editing
+ "config.mk" before going to next steps.
- By default, all 12 architectures are compiled.
+ By default, all architectures are compiled.
The other way of customize Capstone without having to edit config.mk is to
pass the desired options on the commandline to ./make.sh. Currently,
@@ -91,6 +91,7 @@
/usr/include/capstone/m68k.h
/usr/include/capstone/m680x.h
/usr/include/capstone/mips.h
+ /usr/include/capstone/neo.h
/usr/include/capstone/ppc.h
/usr/include/capstone/sparc.h
/usr/include/capstone/systemz.h
diff --git a/HACK.TXT b/HACK.TXT
index e641c68..a7058d1 100644
--- a/HACK.TXT
+++ b/HACK.TXT
@@ -5,12 +5,15 @@
├── arch <- code handling disasm engine for each arch
│ ├── AArch64 <- ARM64 (aka ARMv8) engine
│ ├── ARM <- ARM engine
+│ ├── EVM <- Ethereum VM engine
│ ├── M680X <- M680X engine
│ ├── M68K <- M68K engine
│ ├── Mips <- Mips engine
+│ ├── NEO <- NEO VM engine
│ ├── PowerPC <- PowerPC engine
│ ├── Sparc <- Sparc engine
│ ├── SystemZ <- SystemZ engine
+│ ├── TMS320C64x <- TMS320C64x engine
│ ├── X86 <- X86 engine
│ └── XCore <- XCore engine
├── bindings <- all bindings are under this dir
diff --git a/MCInst.h b/MCInst.h
index 6a70741..5516246 100644
--- a/MCInst.h
+++ b/MCInst.h
@@ -110,6 +110,7 @@
uint8_t popcode_adjust; // Pseudo X86 instruction adjust
char assembly[8]; // for special instruction, so that we dont need printer
unsigned char evm_data[32]; // for EVM PUSH operand
+ unsigned char neo_data[80]; // for NEO instructions with operands
};
void MCInst_Init(MCInst *inst);
diff --git a/Makefile b/Makefile
index 0118122..0d469a7 100644
--- a/Makefile
+++ b/Makefile
@@ -250,9 +250,20 @@
endif
+DEP_NEO =
+DEP_NEO += $(wildcard arch/NEO/NEO*.inc)
+
+LIBOBJ_NEO =
+ifneq (,$(findstring neo,$(CAPSTONE_ARCHS)))
+ CFLAGS += -DCAPSTONE_HAS_NEO
+ LIBSRC_NEO += $(wildcard arch/NEO/NEO*.c)
+ LIBOBJ_NEO += $(LIBSRC_NEO:%.c=$(OBJDIR)/%.o)
+endif
+
+
LIBOBJ =
LIBOBJ += $(OBJDIR)/cs.o $(OBJDIR)/utils.o $(OBJDIR)/SStream.o $(OBJDIR)/MCInstrDesc.o $(OBJDIR)/MCRegisterInfo.o
-LIBOBJ += $(LIBOBJ_ARM) $(LIBOBJ_ARM64) $(LIBOBJ_M68K) $(LIBOBJ_MIPS) $(LIBOBJ_PPC) $(LIBOBJ_SPARC) $(LIBOBJ_SYSZ) $(LIBOBJ_X86) $(LIBOBJ_XCORE) $(LIBOBJ_TMS320C64X) $(LIBOBJ_M680X) $(LIBOBJ_EVM)
+LIBOBJ += $(LIBOBJ_ARM) $(LIBOBJ_ARM64) $(LIBOBJ_M68K) $(LIBOBJ_MIPS) $(LIBOBJ_PPC) $(LIBOBJ_SPARC) $(LIBOBJ_SYSZ) $(LIBOBJ_X86) $(LIBOBJ_XCORE) $(LIBOBJ_TMS320C64X) $(LIBOBJ_M680X) $(LIBOBJ_EVM) $(LIBOBJ_NEO)
LIBOBJ += $(OBJDIR)/MCInst.o
@@ -379,6 +390,7 @@
$(LIBOBJ_TMS320C64X): $(DEP_TMS320C64X)
$(LIBOBJ_M680X): $(DEP_M680X)
$(LIBOBJ_EVM): $(DEP_EVM)
+$(LIBOBJ_NEO): $(DEP_NEO)
ifeq ($(CAPSTONE_STATIC),yes)
$(ARCHIVE): $(LIBOBJ)
diff --git a/README.md b/README.md
index e25acef..c13acad 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,7 @@
Capstone offers some unparalleled features:
- Support multiple hardware architectures: ARM, ARM64 (ARMv8), Ethereum VM, M68K,
- Mips, PPC, Sparc, SystemZ, TMS320C64X, M680X, XCore and X86 (including X86_64).
+ Mips, NEO VM, PPC, Sparc, SystemZ, TMS320C64X, M680X, XCore and X86.
- Having clean/simple/lightweight/intuitive architecture-neutral API.
diff --git a/arch/NEO/NEODisassembler.c b/arch/NEO/NEODisassembler.c
new file mode 100644
index 0000000..0e90c70
--- /dev/null
+++ b/arch/NEO/NEODisassembler.c
@@ -0,0 +1,340 @@
+/* Capstone Disassembly Engine */
+/* By Nguyen Anh Quynh, 2018 */
+
+#include <string.h>
+
+#include "NEODisassembler.h"
+#include "NEOMapping.h"
+
+static short opcodes[256] = {
+ NEO_INS_PUSH0,
+ NEO_INS_PUSHBYTES1,
+ NEO_INS_PUSHBYTES2,
+ NEO_INS_PUSHBYTES3,
+ NEO_INS_PUSHBYTES4,
+ NEO_INS_PUSHBYTES5,
+ NEO_INS_PUSHBYTES6,
+ NEO_INS_PUSHBYTES7,
+ NEO_INS_PUSHBYTES8,
+ NEO_INS_PUSHBYTES9,
+ NEO_INS_PUSHBYTES10,
+ NEO_INS_PUSHBYTES11,
+ NEO_INS_PUSHBYTES12,
+ NEO_INS_PUSHBYTES13,
+ NEO_INS_PUSHBYTES14,
+ NEO_INS_PUSHBYTES15,
+ NEO_INS_PUSHBYTES16,
+ NEO_INS_PUSHBYTES17,
+ NEO_INS_PUSHBYTES18,
+ NEO_INS_PUSHBYTES19,
+ NEO_INS_PUSHBYTES20,
+ NEO_INS_PUSHBYTES21,
+ NEO_INS_PUSHBYTES22,
+ NEO_INS_PUSHBYTES23,
+ NEO_INS_PUSHBYTES24,
+ NEO_INS_PUSHBYTES25,
+ NEO_INS_PUSHBYTES26,
+ NEO_INS_PUSHBYTES27,
+ NEO_INS_PUSHBYTES28,
+ NEO_INS_PUSHBYTES29,
+ NEO_INS_PUSHBYTES30,
+ NEO_INS_PUSHBYTES31,
+ NEO_INS_PUSHBYTES32,
+ NEO_INS_PUSHBYTES33,
+ NEO_INS_PUSHBYTES34,
+ NEO_INS_PUSHBYTES35,
+ NEO_INS_PUSHBYTES36,
+ NEO_INS_PUSHBYTES37,
+ NEO_INS_PUSHBYTES38,
+ NEO_INS_PUSHBYTES39,
+ NEO_INS_PUSHBYTES40,
+ NEO_INS_PUSHBYTES41,
+ NEO_INS_PUSHBYTES42,
+ NEO_INS_PUSHBYTES43,
+ NEO_INS_PUSHBYTES44,
+ NEO_INS_PUSHBYTES45,
+ NEO_INS_PUSHBYTES46,
+ NEO_INS_PUSHBYTES47,
+ NEO_INS_PUSHBYTES48,
+ NEO_INS_PUSHBYTES49,
+ NEO_INS_PUSHBYTES50,
+ NEO_INS_PUSHBYTES51,
+ NEO_INS_PUSHBYTES52,
+ NEO_INS_PUSHBYTES53,
+ NEO_INS_PUSHBYTES54,
+ NEO_INS_PUSHBYTES55,
+ NEO_INS_PUSHBYTES56,
+ NEO_INS_PUSHBYTES57,
+ NEO_INS_PUSHBYTES58,
+ NEO_INS_PUSHBYTES59,
+ NEO_INS_PUSHBYTES60,
+ NEO_INS_PUSHBYTES61,
+ NEO_INS_PUSHBYTES62,
+ NEO_INS_PUSHBYTES63,
+ NEO_INS_PUSHBYTES64,
+ NEO_INS_PUSHBYTES65,
+ NEO_INS_PUSHBYTES66,
+ NEO_INS_PUSHBYTES67,
+ NEO_INS_PUSHBYTES68,
+ NEO_INS_PUSHBYTES69,
+ NEO_INS_PUSHBYTES70,
+ NEO_INS_PUSHBYTES71,
+ NEO_INS_PUSHBYTES72,
+ NEO_INS_PUSHBYTES73,
+ NEO_INS_PUSHBYTES74,
+ NEO_INS_PUSHBYTES75,
+ NEO_INS_PUSHDATA1,
+ NEO_INS_PUSHDATA2,
+ NEO_INS_PUSHDATA4,
+ NEO_INS_PUSHM1,
+ -1,
+ NEO_INS_PUSH1,
+ NEO_INS_PUSH2,
+ NEO_INS_PUSH3,
+ NEO_INS_PUSH4,
+ NEO_INS_PUSH5,
+ NEO_INS_PUSH6,
+ NEO_INS_PUSH7,
+ NEO_INS_PUSH8,
+ NEO_INS_PUSH9,
+ NEO_INS_PUSH10,
+ NEO_INS_PUSH11,
+ NEO_INS_PUSH12,
+ NEO_INS_PUSH13,
+ NEO_INS_PUSH14,
+ NEO_INS_PUSH15,
+ NEO_INS_PUSH16,
+ NEO_INS_NOP,
+ NEO_INS_JMP,
+ NEO_INS_JMPIF,
+ NEO_INS_JMPIFNOT,
+ NEO_INS_CALL,
+ NEO_INS_RET,
+ NEO_INS_APPCALL,
+ NEO_INS_SYSCALL,
+ NEO_INS_TAILCALL,
+ NEO_INS_DUPFROMALTSTACK,
+ NEO_INS_TOALTSTACK,
+ NEO_INS_FROMALTSTACK,
+ NEO_INS_XDROP,
+ -1,
+ -1,
+ -1,
+ -1,
+ NEO_INS_XSWAP,
+ NEO_INS_XTUCK,
+ NEO_INS_DEPTH,
+ NEO_INS_DROP,
+ NEO_INS_DUP,
+ NEO_INS_NIP,
+ NEO_INS_OVER,
+ NEO_INS_PICK,
+ NEO_INS_ROLL,
+ NEO_INS_ROT,
+ NEO_INS_SWAP,
+ NEO_INS_TUCK,
+ NEO_INS_CAT,
+ NEO_INS_SUBSTR,
+ NEO_INS_LEFT,
+ NEO_INS_RIGHT,
+ NEO_INS_SIZE,
+ NEO_INS_INVERT,
+ NEO_INS_AND,
+ NEO_INS_OR,
+ NEO_INS_XOR,
+ NEO_INS_EQUAL,
+ NEO_INS_OP_EQUALVERIFY,
+ NEO_INS_OP_RESERVED1,
+ NEO_INS_OP_RESERVED2,
+ NEO_INS_INC,
+ NEO_INS_DEC,
+ NEO_INS_SIGN,
+ -1,
+ NEO_INS_NEGATE,
+ NEO_INS_ABS,
+ NEO_INS_NOT,
+ NEO_INS_NZ,
+ NEO_INS_ADD,
+ NEO_INS_SUB,
+ NEO_INS_MUL,
+ NEO_INS_DIV,
+ NEO_INS_MOD,
+ NEO_INS_SHL,
+ NEO_INS_SHR,
+ NEO_INS_BOOLAND,
+ NEO_INS_BOOLOR,
+ NEO_INS_NUMEQUAL,
+ -1,
+ NEO_INS_NUMNOTEQUAL,
+ NEO_INS_LT,
+ NEO_INS_GT,
+ NEO_INS_LTE,
+ NEO_INS_GTE,
+ NEO_INS_MIN,
+ NEO_INS_MAX,
+ NEO_INS_WITHIN,
+ -1,
+ NEO_INS_SHA1,
+ NEO_INS_SHA256,
+ NEO_INS_HASH160,
+ NEO_INS_HASH256,
+ -1,
+ NEO_INS_CHECKSIG,
+ NEO_INS_VERIFY,
+ NEO_INS_CHECKMULTISIG,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ NEO_INS_ARRAYSIZE,
+ NEO_INS_PACK,
+ NEO_INS_UNPACK,
+ NEO_INS_PICKITEM,
+ NEO_INS_SETITEM,
+ NEO_INS_NEWARRAY,
+ NEO_INS_NEWSTRUCT,
+ NEO_INS_NEWMAP,
+ NEO_INS_APPEND,
+ NEO_INS_REVERSE,
+ NEO_INS_REMOVE,
+ NEO_INS_HASKEY,
+ NEO_INS_KEYS,
+ NEO_INS_VALUES,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ NEO_INS_THROW,
+ NEO_INS_THROWIFNOT,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+};
+
+bool NEO_getInstruction(csh ud, const uint8_t *code, size_t code_len,
+ MCInst *MI, uint16_t *size, uint64_t address, void *inst_info)
+{
+ unsigned char opcode;
+
+ if (code_len == 0)
+ return false;
+
+ opcode = code[0];
+ if (opcodes[opcode] == -1) {
+ // invalid opcode
+ return false;
+ }
+
+ // valid opcode
+ MI->address = address;
+ MI->OpcodePub = MI->Opcode = opcode;
+
+ *size = neo_insn_opsize(opcode) + 1;
+ if (*size > 1) {
+ if (code_len < *size) {
+ // not enough data
+ return false;
+ }
+
+ // copy operand
+ memcpy(MI->neo_data, code + 1, *size - 1);
+ }
+
+ if (MI->flat_insn->detail) {
+ memset(&MI->flat_insn->detail->neo, 0, sizeof(cs_neo));
+ NEO_get_insn_id((cs_struct *)ud, MI->flat_insn, opcode);
+
+ MI->flat_insn->detail->regs_read_count = 0;
+ MI->flat_insn->detail->regs_write_count = 0;
+ MI->flat_insn->detail->groups_count = 0;
+
+ if (MI->flat_insn->detail->neo.pop) {
+ MI->flat_insn->detail->groups[MI->flat_insn->detail->groups_count] = NEO_GRP_STACK_READ;
+ MI->flat_insn->detail->groups_count++;
+ }
+
+ if (MI->flat_insn->detail->neo.push) {
+ MI->flat_insn->detail->groups[MI->flat_insn->detail->groups_count] = NEO_GRP_STACK_WRITE;
+ MI->flat_insn->detail->groups_count++;
+ }
+
+ // setup groups
+#if 0
+ switch(opcode) {
+ default:
+ break;
+ case NEO_INS_ADD:
+ case NEO_INS_MUL:
+ MI->flat_insn->detail->groups[MI->flat_insn->detail->groups_count] = NEO_GRP_MATH;
+ MI->flat_insn->detail->groups_count++;
+ break;
+
+ case NEO_INS_MSTORE:
+ case NEO_INS_MSTORE8:
+ case NEO_INS_CALLDATACOPY:
+ case NEO_INS_CODECOPY:
+ case NEO_INS_EXTCODECOPY:
+ MI->flat_insn->detail->groups[MI->flat_insn->detail->groups_count] = NEO_GRP_MEM_WRITE;
+ MI->flat_insn->detail->groups_count++;
+ break;
+
+ }
+#endif
+ }
+
+ return true;
+}
diff --git a/arch/NEO/NEODisassembler.h b/arch/NEO/NEODisassembler.h
new file mode 100644
index 0000000..a05a50e
--- /dev/null
+++ b/arch/NEO/NEODisassembler.h
@@ -0,0 +1,12 @@
+/* Capstone Disassembly Engine */
+/* By Nguyen Anh Quynh, 2018 */
+
+#ifndef CS_NEODISASSEMBLER_H
+#define CS_NEODISASSEMBLER_H
+
+#include "../../MCInst.h"
+
+bool NEO_getInstruction(csh ud, const uint8_t *code, size_t code_len,
+ MCInst *instr, uint16_t *size, uint64_t address, void *info);
+
+#endif
diff --git a/arch/NEO/NEOInstPrinter.c b/arch/NEO/NEOInstPrinter.c
new file mode 100644
index 0000000..0b8283d
--- /dev/null
+++ b/arch/NEO/NEOInstPrinter.c
@@ -0,0 +1,25 @@
+/* Capstone Disassembly Engine */
+/* By Nguyen Anh Quynh, 2018 */
+
+#include "NEOInstPrinter.h"
+#include "NEOMapping.h"
+
+
+void NEO_printInst(MCInst *MI, struct SStream *O, void *PrinterInfo)
+{
+ int opsize;
+
+ // print mnemonic
+ SStream_concat(O, NEO_insn_name((csh)MI->csh, MI->Opcode));
+
+ opsize = neo_insn_opsize(MI->Opcode);
+ if (opsize) {
+ // print operand
+ unsigned int i;
+
+ SStream_concat0(O, "\t");
+ for (i = 0; i < opsize; i++) {
+ SStream_concat(O, "%02x", MI->neo_data[i]);
+ }
+ }
+}
diff --git a/arch/NEO/NEOInstPrinter.h b/arch/NEO/NEOInstPrinter.h
new file mode 100644
index 0000000..6034995
--- /dev/null
+++ b/arch/NEO/NEOInstPrinter.h
@@ -0,0 +1,17 @@
+/* Capstone Disassembly Engine */
+/* By Nguyen Anh Quynh, 2018 */
+
+#ifndef CS_NEOINSTPRINTER_H
+#define CS_NEOINSTPRINTER_H
+
+
+#include "capstone/capstone.h"
+#include "../../MCInst.h"
+#include "../../SStream.h"
+#include "../../cs_priv.h"
+
+struct SStream;
+
+void NEO_printInst(MCInst *MI, struct SStream *O, void *Info);
+
+#endif
diff --git a/arch/NEO/NEOMapping.c b/arch/NEO/NEOMapping.c
new file mode 100644
index 0000000..21c46ba
--- /dev/null
+++ b/arch/NEO/NEOMapping.c
@@ -0,0 +1,339 @@
+/* Capstone Disassembly Engine */
+/* By Nguyen Anh Quynh, 2018 */
+
+#ifdef CAPSTONE_HAS_NEO
+
+#include <string.h>
+
+#include "../../cs_priv.h"
+#include "../../utils.h"
+
+#include "NEOMapping.h"
+
+#ifndef CAPSTONE_DIET
+static cs_neo insns[256] = {
+#include "NEOMappingInsn.inc"
+};
+#endif
+
+// look for opsize of @id in @insns, given its size in @max.
+// return -1 if not found
+int neo_insn_opsize(unsigned int id)
+{
+ if (id >= 256)
+ return -1;
+
+ if (insns[id].fee == 255)
+ // unused opcode
+ return -1;
+
+ return insns[id].op_size;
+}
+
+// fill in details
+void NEO_get_insn_id(cs_struct *h, cs_insn *insn, unsigned int id)
+{
+ insn->id = id;
+#ifndef CAPSTONE_DIET
+ if (id < 256 && insns[id].fee != 255) {
+ if (h->detail) {
+ memcpy(&insn->detail->neo, &insns[id], sizeof(insns[id]));
+ }
+ }
+#endif
+}
+
+#ifndef CAPSTONE_DIET
+static name_map insn_name_maps[] = {
+ { NEO_INS_PUSH0, "push0" },
+ { NEO_INS_PUSHBYTES1, "pushbytes1" },
+ { NEO_INS_PUSHBYTES2, "pushbytes2" },
+ { NEO_INS_PUSHBYTES3, "pushbytes3" },
+ { NEO_INS_PUSHBYTES4, "pushbytes4" },
+ { NEO_INS_PUSHBYTES5, "pushbytes5" },
+ { NEO_INS_PUSHBYTES6, "pushbytes6" },
+ { NEO_INS_PUSHBYTES7, "pushbytes7" },
+ { NEO_INS_PUSHBYTES8, "pushbytes8" },
+ { NEO_INS_PUSHBYTES9, "pushbytes9" },
+ { NEO_INS_PUSHBYTES10, "pushbytes10" },
+ { NEO_INS_PUSHBYTES11, "pushbytes11" },
+ { NEO_INS_PUSHBYTES12, "pushbytes12" },
+ { NEO_INS_PUSHBYTES13, "pushbytes13" },
+ { NEO_INS_PUSHBYTES14, "pushbytes14" },
+ { NEO_INS_PUSHBYTES15, "pushbytes15" },
+ { NEO_INS_PUSHBYTES16, "pushbytes16" },
+ { NEO_INS_PUSHBYTES17, "pushbytes17" },
+ { NEO_INS_PUSHBYTES18, "pushbytes18" },
+ { NEO_INS_PUSHBYTES19, "pushbytes19" },
+ { NEO_INS_PUSHBYTES20, "pushbytes20" },
+ { NEO_INS_PUSHBYTES21, "pushbytes21" },
+ { NEO_INS_PUSHBYTES22, "pushbytes22" },
+ { NEO_INS_PUSHBYTES23, "pushbytes23" },
+ { NEO_INS_PUSHBYTES24, "pushbytes24" },
+ { NEO_INS_PUSHBYTES25, "pushbytes25" },
+ { NEO_INS_PUSHBYTES26, "pushbytes26" },
+ { NEO_INS_PUSHBYTES27, "pushbytes27" },
+ { NEO_INS_PUSHBYTES28, "pushbytes28" },
+ { NEO_INS_PUSHBYTES29, "pushbytes29" },
+ { NEO_INS_PUSHBYTES30, "pushbytes30" },
+ { NEO_INS_PUSHBYTES31, "pushbytes31" },
+ { NEO_INS_PUSHBYTES32, "pushbytes32" },
+ { NEO_INS_PUSHBYTES33, "pushbytes33" },
+ { NEO_INS_PUSHBYTES34, "pushbytes34" },
+ { NEO_INS_PUSHBYTES35, "pushbytes35" },
+ { NEO_INS_PUSHBYTES36, "pushbytes36" },
+ { NEO_INS_PUSHBYTES37, "pushbytes37" },
+ { NEO_INS_PUSHBYTES38, "pushbytes38" },
+ { NEO_INS_PUSHBYTES39, "pushbytes39" },
+ { NEO_INS_PUSHBYTES40, "pushbytes40" },
+ { NEO_INS_PUSHBYTES41, "pushbytes41" },
+ { NEO_INS_PUSHBYTES42, "pushbytes42" },
+ { NEO_INS_PUSHBYTES43, "pushbytes43" },
+ { NEO_INS_PUSHBYTES44, "pushbytes44" },
+ { NEO_INS_PUSHBYTES45, "pushbytes45" },
+ { NEO_INS_PUSHBYTES46, "pushbytes46" },
+ { NEO_INS_PUSHBYTES47, "pushbytes47" },
+ { NEO_INS_PUSHBYTES48, "pushbytes48" },
+ { NEO_INS_PUSHBYTES49, "pushbytes49" },
+ { NEO_INS_PUSHBYTES50, "pushbytes50" },
+ { NEO_INS_PUSHBYTES51, "pushbytes51" },
+ { NEO_INS_PUSHBYTES52, "pushbytes52" },
+ { NEO_INS_PUSHBYTES53, "pushbytes53" },
+ { NEO_INS_PUSHBYTES54, "pushbytes54" },
+ { NEO_INS_PUSHBYTES55, "pushbytes55" },
+ { NEO_INS_PUSHBYTES56, "pushbytes56" },
+ { NEO_INS_PUSHBYTES57, "pushbytes57" },
+ { NEO_INS_PUSHBYTES58, "pushbytes58" },
+ { NEO_INS_PUSHBYTES59, "pushbytes59" },
+ { NEO_INS_PUSHBYTES60, "pushbytes60" },
+ { NEO_INS_PUSHBYTES61, "pushbytes61" },
+ { NEO_INS_PUSHBYTES62, "pushbytes62" },
+ { NEO_INS_PUSHBYTES63, "pushbytes63" },
+ { NEO_INS_PUSHBYTES64, "pushbytes64" },
+ { NEO_INS_PUSHBYTES65, "pushbytes65" },
+ { NEO_INS_PUSHBYTES66, "pushbytes66" },
+ { NEO_INS_PUSHBYTES67, "pushbytes67" },
+ { NEO_INS_PUSHBYTES68, "pushbytes68" },
+ { NEO_INS_PUSHBYTES69, "pushbytes69" },
+ { NEO_INS_PUSHBYTES70, "pushbytes70" },
+ { NEO_INS_PUSHBYTES71, "pushbytes71" },
+ { NEO_INS_PUSHBYTES72, "pushbytes72" },
+ { NEO_INS_PUSHBYTES73, "pushbytes73" },
+ { NEO_INS_PUSHBYTES74, "pushbytes74" },
+ { NEO_INS_PUSHBYTES75, "pushbytes75" },
+ { NEO_INS_PUSHDATA1, "pushdata1" },
+ { NEO_INS_PUSHDATA2, "pushdata2" },
+ { NEO_INS_PUSHDATA4, "pushdata4" },
+ { NEO_INS_PUSHM1, "pushm1" },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_PUSH1, "push1" },
+ { NEO_INS_PUSH2, "push2" },
+ { NEO_INS_PUSH3, "push3" },
+ { NEO_INS_PUSH4, "push4" },
+ { NEO_INS_PUSH5, "push5" },
+ { NEO_INS_PUSH6, "push6" },
+ { NEO_INS_PUSH7, "push7" },
+ { NEO_INS_PUSH8, "push8" },
+ { NEO_INS_PUSH9, "push9" },
+ { NEO_INS_PUSH10, "push10" },
+ { NEO_INS_PUSH11, "push11" },
+ { NEO_INS_PUSH12, "push12" },
+ { NEO_INS_PUSH13, "push13" },
+ { NEO_INS_PUSH14, "push14" },
+ { NEO_INS_PUSH15, "push15" },
+ { NEO_INS_PUSH16, "push16" },
+ { NEO_INS_NOP, "nop" },
+ { NEO_INS_JMP, "jmp" },
+ { NEO_INS_JMPIF, "jmpif" },
+ { NEO_INS_JMPIFNOT, "jmpifnot" },
+ { NEO_INS_CALL, "call" },
+ { NEO_INS_RET, "ret" },
+ { NEO_INS_APPCALL, "appcall" },
+ { NEO_INS_SYSCALL, "syscall" },
+ { NEO_INS_TAILCALL, "tailcall" },
+ { NEO_INS_DUPFROMALTSTACK, "dupfromaltstack" },
+ { NEO_INS_TOALTSTACK, "toaltstack" },
+ { NEO_INS_FROMALTSTACK, "fromaltstack" },
+ { NEO_INS_XDROP, "xdrop" },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_XSWAP, "xswap" },
+ { NEO_INS_XTUCK, "xtuck" },
+ { NEO_INS_DEPTH, "depth" },
+ { NEO_INS_DROP, "drop" },
+ { NEO_INS_DUP, "dup" },
+ { NEO_INS_NIP, "nip" },
+ { NEO_INS_OVER, "over" },
+ { NEO_INS_PICK, "pick" },
+ { NEO_INS_ROLL, "roll" },
+ { NEO_INS_ROT, "rot" },
+ { NEO_INS_SWAP, "swap" },
+ { NEO_INS_TUCK, "tuck" },
+ { NEO_INS_CAT, "cat" },
+ { NEO_INS_SUBSTR, "substr" },
+ { NEO_INS_LEFT, "left" },
+ { NEO_INS_RIGHT, "right" },
+ { NEO_INS_SIZE, "size" },
+ { NEO_INS_INVERT, "invert" },
+ { NEO_INS_AND, "and" },
+ { NEO_INS_OR, "or" },
+ { NEO_INS_XOR, "xor" },
+ { NEO_INS_EQUAL, "equal" },
+ { NEO_INS_OP_EQUALVERIFY, "op_equalverify" },
+ { NEO_INS_OP_RESERVED1, "op_reserved1" },
+ { NEO_INS_OP_RESERVED2, "op_reserved2" },
+ { NEO_INS_INC, "inc" },
+ { NEO_INS_DEC, "dec" },
+ { NEO_INS_SIGN, "sign" },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_NEGATE, "negate" },
+ { NEO_INS_ABS, "abs" },
+ { NEO_INS_NOT, "not" },
+ { NEO_INS_NZ, "nz" },
+ { NEO_INS_ADD, "add" },
+ { NEO_INS_SUB, "sub" },
+ { NEO_INS_MUL, "mul" },
+ { NEO_INS_DIV, "div" },
+ { NEO_INS_MOD, "mod" },
+ { NEO_INS_SHL, "shl" },
+ { NEO_INS_SHR, "shr" },
+ { NEO_INS_BOOLAND, "booland" },
+ { NEO_INS_BOOLOR, "boolor" },
+ { NEO_INS_NUMEQUAL, "numequal" },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_NUMNOTEQUAL, "numnotequal" },
+ { NEO_INS_LT, "lt" },
+ { NEO_INS_GT, "gt" },
+ { NEO_INS_LTE, "lte" },
+ { NEO_INS_GTE, "gte" },
+ { NEO_INS_MIN, "min" },
+ { NEO_INS_MAX, "max" },
+ { NEO_INS_WITHIN, "within" },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_SHA1, "sha1" },
+ { NEO_INS_SHA256, "sha256" },
+ { NEO_INS_HASH160, "hash160" },
+ { NEO_INS_HASH256, "hash256" },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_CHECKSIG, "checksig" },
+ { NEO_INS_VERIFY, "verify" },
+ { NEO_INS_CHECKMULTISIG, "checkmultisig" },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_ARRAYSIZE, "arraysize" },
+ { NEO_INS_PACK, "pack" },
+ { NEO_INS_UNPACK, "unpack" },
+ { NEO_INS_PICKITEM, "pickitem" },
+ { NEO_INS_SETITEM, "setitem" },
+ { NEO_INS_NEWARRAY, "newarray" },
+ { NEO_INS_NEWSTRUCT, "newstruct" },
+ { NEO_INS_NEWMAP, "newmap" },
+ { NEO_INS_APPEND, "append" },
+ { NEO_INS_REVERSE, "reverse" },
+ { NEO_INS_REMOVE, "remove" },
+ { NEO_INS_HASKEY, "haskey" },
+ { NEO_INS_KEYS, "keys" },
+ { NEO_INS_VALUES, "values" },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_THROW, "throw" },
+ { NEO_INS_THROWIFNOT, "throwifnot" },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+ { NEO_INS_INVALID, NULL },
+};
+#endif
+
+const char *NEO_insn_name(csh handle, unsigned int id)
+{
+#ifndef CAPSTONE_DIET
+ if (id >= ARR_SIZE(insn_name_maps))
+ return NULL;
+ else
+ return insn_name_maps[id].name;
+#else
+ return NULL;
+#endif
+}
+
+#ifndef CAPSTONE_DIET
+static name_map group_name_maps[] = {
+ // generic groups
+ { NEO_GRP_INVALID, NULL },
+ { NEO_GRP_JUMP, "jump" },
+ // special groups
+ { NEO_GRP_MATH, "math" },
+ { NEO_GRP_STACK_WRITE, "stack_write" },
+ { NEO_GRP_STACK_READ, "stack_read" },
+};
+#endif
+
+const char *NEO_group_name(csh handle, unsigned int id)
+{
+#ifndef CAPSTONE_DIET
+ return id2name(group_name_maps, ARR_SIZE(group_name_maps), id);
+#else
+ return NULL;
+#endif
+}
+#endif
diff --git a/arch/NEO/NEOMapping.h b/arch/NEO/NEOMapping.h
new file mode 100644
index 0000000..8d780f2
--- /dev/null
+++ b/arch/NEO/NEOMapping.h
@@ -0,0 +1,9 @@
+/* Capstone Disassembly Engine */
+/* By Nguyen Anh Quynh, 2018 */
+
+#include <capstone/capstone.h>
+
+void NEO_get_insn_id(cs_struct *h, cs_insn *insn, unsigned int id);
+const char *NEO_insn_name(csh handle, unsigned int id);
+const char *NEO_group_name(csh handle, unsigned int id);
+int neo_insn_opsize(unsigned int id);
diff --git a/arch/NEO/NEOMappingInsn.inc b/arch/NEO/NEOMappingInsn.inc
new file mode 100644
index 0000000..80398b3
--- /dev/null
+++ b/arch/NEO/NEOMappingInsn.inc
@@ -0,0 +1,259 @@
+/* Capstone Disassembly Engine */
+/* By Nguyen Anh Quynh, 2018 */
+
+{ 0, 0, 1, NEO_FEE_0 },
+{ 1, 0, 1, NEO_FEE_0 },
+{ 2, 0, 2, NEO_FEE_0 },
+{ 3, 0, 3, NEO_FEE_0 },
+{ 4, 0, 4, NEO_FEE_0 },
+{ 5, 0, 5, NEO_FEE_0 },
+{ 6, 0, 6, NEO_FEE_0 },
+{ 7, 0, 7, NEO_FEE_0 },
+{ 8, 0, 8, NEO_FEE_0 },
+{ 9, 0, 9, NEO_FEE_0 },
+{ 10, 0, 10, NEO_FEE_0 },
+{ 11, 0, 11, NEO_FEE_0 },
+{ 12, 0, 12, NEO_FEE_0 },
+{ 13, 0, 13, NEO_FEE_0 },
+{ 14, 0, 14, NEO_FEE_0 },
+{ 15, 0, 15, NEO_FEE_0 },
+{ 16, 0, 16, NEO_FEE_0 },
+{ 17, 0, 17, NEO_FEE_0 },
+{ 18, 0, 18, NEO_FEE_0 },
+{ 19, 0, 19, NEO_FEE_0 },
+{ 20, 0, 20, NEO_FEE_0 },
+{ 21, 0, 21, NEO_FEE_0 },
+{ 22, 0, 22, NEO_FEE_0 },
+{ 23, 0, 23, NEO_FEE_0 },
+{ 24, 0, 24, NEO_FEE_0 },
+{ 25, 0, 25, NEO_FEE_0 },
+{ 26, 0, 26, NEO_FEE_0 },
+{ 27, 0, 27, NEO_FEE_0 },
+{ 28, 0, 28, NEO_FEE_0 },
+{ 29, 0, 29, NEO_FEE_0 },
+{ 30, 0, 30, NEO_FEE_0 },
+{ 31, 0, 31, NEO_FEE_0 },
+{ 32, 0, 32, NEO_FEE_0 },
+{ 33, 0, 33, NEO_FEE_0 },
+{ 34, 0, 34, NEO_FEE_0 },
+{ 35, 0, 35, NEO_FEE_0 },
+{ 36, 0, 36, NEO_FEE_0 },
+{ 37, 0, 37, NEO_FEE_0 },
+{ 38, 0, 38, NEO_FEE_0 },
+{ 39, 0, 39, NEO_FEE_0 },
+{ 40, 0, 40, NEO_FEE_0 },
+{ 41, 0, 41, NEO_FEE_0 },
+{ 42, 0, 42, NEO_FEE_0 },
+{ 43, 0, 43, NEO_FEE_0 },
+{ 44, 0, 44, NEO_FEE_0 },
+{ 45, 0, 45, NEO_FEE_0 },
+{ 46, 0, 46, NEO_FEE_0 },
+{ 47, 0, 47, NEO_FEE_0 },
+{ 48, 0, 48, NEO_FEE_0 },
+{ 49, 0, 49, NEO_FEE_0 },
+{ 50, 0, 50, NEO_FEE_0 },
+{ 51, 0, 51, NEO_FEE_0 },
+{ 52, 0, 52, NEO_FEE_0 },
+{ 53, 0, 53, NEO_FEE_0 },
+{ 54, 0, 54, NEO_FEE_0 },
+{ 55, 0, 55, NEO_FEE_0 },
+{ 56, 0, 56, NEO_FEE_0 },
+{ 57, 0, 57, NEO_FEE_0 },
+{ 58, 0, 58, NEO_FEE_0 },
+{ 59, 0, 59, NEO_FEE_0 },
+{ 60, 0, 60, NEO_FEE_0 },
+{ 61, 0, 61, NEO_FEE_0 },
+{ 62, 0, 62, NEO_FEE_0 },
+{ 63, 0, 63, NEO_FEE_0 },
+{ 64, 0, 64, NEO_FEE_0 },
+{ 65, 0, 65, NEO_FEE_0 },
+{ 66, 0, 66, NEO_FEE_0 },
+{ 67, 0, 67, NEO_FEE_0 },
+{ 68, 0, 68, NEO_FEE_0 },
+{ 69, 0, 69, NEO_FEE_0 },
+{ 70, 0, 70, NEO_FEE_0 },
+{ 71, 0, 71, NEO_FEE_0 },
+{ 72, 0, 72, NEO_FEE_0 },
+{ 73, 0, 73, NEO_FEE_0 },
+{ 74, 0, 74, NEO_FEE_0 },
+{ 75, 0, 75, NEO_FEE_0 },
+{ 1, 0, 1, NEO_FEE_0 },
+{ 2, 0, 2, NEO_FEE_0 },
+{ 4, 0, 4, NEO_FEE_0 },
+{ 0, 0, 1, NEO_FEE_0 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 1, NEO_FEE_0 },
+{ 0, 0, 1, NEO_FEE_0 },
+{ 0, 0, 1, NEO_FEE_0 },
+{ 0, 0, 1, NEO_FEE_0 },
+{ 0, 0, 1, NEO_FEE_0 },
+{ 0, 0, 1, NEO_FEE_0 },
+{ 0, 0, 1, NEO_FEE_0 },
+{ 0, 0, 1, NEO_FEE_0 },
+{ 0, 0, 1, NEO_FEE_0 },
+{ 0, 0, 1, NEO_FEE_0 },
+{ 0, 0, 1, NEO_FEE_0 },
+{ 0, 0, 1, NEO_FEE_0 },
+{ 0, 0, 1, NEO_FEE_0 },
+{ 0, 0, 1, NEO_FEE_0 },
+{ 0, 0, 1, NEO_FEE_0 },
+{ 0, 0, 1, NEO_FEE_0 },
+{ 0, 0, 0, NEO_FEE_0 },
+{ 2, 0, 0, NEO_FEE_0001 },
+{ 2, 1, 0, NEO_FEE_0001 },
+{ 2, 1, 0, NEO_FEE_0001 },
+{ 2, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 32, 0, 0, NEO_FEE_001 },
+{ 1, 0, 0, NEO_FEE_0001 },
+{ 32, 0, 0, NEO_FEE_001 },
+{ 0, 0, 1, NEO_FEE_0001 },
+{ 0, 1, 1, NEO_FEE_0001 },
+{ 0, 1, 1, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 1, 0, NEO_FEE_0001 },
+{ 0, 1, 1, NEO_FEE_0001 },
+{ 0, 0, 1, NEO_FEE_0001 },
+{ 0, 1, 0, NEO_FEE_0001 },
+{ 0, 0, 1, NEO_FEE_0001 },
+{ 0, 2, 1, NEO_FEE_0001 },
+{ 0, 1, 2, NEO_FEE_0001 },
+{ 0, 1, 1, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 3, 3, NEO_FEE_0001 },
+{ 0, 2, 2, NEO_FEE_0001 },
+{ 0, 2, 3, NEO_FEE_0001 },
+{ 0, 2, 1, NEO_FEE_0001 },
+{ 0, 3, 1, NEO_FEE_0001 },
+{ 0, 2, 1, NEO_FEE_0001 },
+{ 0, 2, 1, NEO_FEE_0001 },
+{ 0, 1, 1, NEO_FEE_0001 },
+{ 0, 1, 1, NEO_FEE_0001 },
+{ 0, 2, 1, NEO_FEE_0001 },
+{ 0, 2, 1, NEO_FEE_0001 },
+{ 0, 2, 1, NEO_FEE_0001 },
+{ 0, 2, 1, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 1, 1, NEO_FEE_0001 },
+{ 0, 1, 1, NEO_FEE_0001 },
+{ 0, 1, 1, NEO_FEE_0001 },
+{ 0, 0, 0, 255 },
+{ 0, 1, 1, NEO_FEE_0001 },
+{ 0, 1, 1, NEO_FEE_0001 },
+{ 0, 1, 1, NEO_FEE_0001 },
+{ 0, 1, 1, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, NEO_FEE_001 },
+{ 0, 0, 0, NEO_FEE_001 },
+{ 0, 0, 0, NEO_FEE_002 },
+{ 0, 0, 0, NEO_FEE_002 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, NEO_FEE_01 },
+{ 0, 0, 0, NEO_FEE_01 },
+{ 0, 0, 0, NEO_FEE_01 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, NEO_FEE_0001 },
+{ 0, 1, 0, NEO_FEE_0001 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
+{ 0, 0, 0, 255 },
diff --git a/arch/NEO/NEOModule.c b/arch/NEO/NEOModule.c
new file mode 100644
index 0000000..95a2009
--- /dev/null
+++ b/arch/NEO/NEOModule.c
@@ -0,0 +1,33 @@
+/* Capstone Disassembly Engine */
+/* By Nguyen Anh Quynh, 2018 */
+
+#ifdef CAPSTONE_HAS_NEO
+
+#include "../../cs_priv.h"
+#include "NEODisassembler.h"
+#include "NEOInstPrinter.h"
+#include "NEOMapping.h"
+#include "NEOModule.h"
+
+cs_err NEO_global_init(cs_struct *ud)
+{
+ // verify if requested mode is valid
+ if (ud->mode)
+ return CS_ERR_MODE;
+
+ ud->printer = NEO_printInst;
+ ud->printer_info = NULL;
+ ud->insn_id = NEO_get_insn_id;
+ ud->insn_name = NEO_insn_name;
+ ud->group_name = NEO_group_name;
+ ud->disasm = NEO_getInstruction;
+
+ return CS_ERR_OK;
+}
+
+cs_err NEO_option(cs_struct *handle, cs_opt_type type, size_t value)
+{
+ return CS_ERR_OK;
+}
+
+#endif
diff --git a/arch/NEO/NEOModule.h b/arch/NEO/NEOModule.h
new file mode 100644
index 0000000..f552f50
--- /dev/null
+++ b/arch/NEO/NEOModule.h
@@ -0,0 +1,12 @@
+/* Capstone Disassembly Engine */
+/* By Travis Finkenauer <tmfinken@gmail.com>, 2018 */
+
+#ifndef CS_NEO_MODULE_H
+#define CS_NEO_MODULE_H
+
+#include "../../utils.h"
+
+cs_err NEO_global_init(cs_struct *ud);
+cs_err NEO_option(cs_struct *handle, cs_opt_type type, size_t value);
+
+#endif
diff --git a/config.mk b/config.mk
index 3b078a7..12bb00e 100644
--- a/config.mk
+++ b/config.mk
@@ -4,7 +4,7 @@
################################################################################
# Specify which archs you want to compile in. By default, we build all archs.
-CAPSTONE_ARCHS ?= arm aarch64 m68k mips powerpc sparc systemz x86 xcore tms320c64x m680x evm
+CAPSTONE_ARCHS ?= arm aarch64 m68k mips powerpc sparc systemz x86 xcore tms320c64x m680x evm neo
################################################################################
diff --git a/cs.c b/cs.c
index d2ffecc..4f20d13 100644
--- a/cs.c
+++ b/cs.c
@@ -58,6 +58,7 @@
#include "arch/M680X/M680XModule.h"
#include "arch/M68K/M68KModule.h"
#include "arch/Mips/MipsModule.h"
+#include "arch/NEO/NEOModule.h"
#include "arch/PowerPC/PPCModule.h"
#include "arch/Sparc/SparcModule.h"
#include "arch/SystemZ/SystemZModule.h"
@@ -127,6 +128,11 @@
#else
NULL,
#endif
+#ifdef CAPSTONE_HAS_NEO
+ NEO_global_init,
+#else
+ NULL,
+#endif
};
// support cs_option() for all archs
@@ -191,6 +197,11 @@
#else
NULL,
#endif
+#ifdef CAPSTONE_HAS_NEO
+ NEO_option,
+#else
+ NULL,
+#endif
};
// bitmask for finding disallowed modes for an arch:
@@ -263,6 +274,11 @@
#else
0,
#endif
+#ifdef CAPSTONE_HAS_NEO
+ 0,
+#else
+ 0,
+#endif
};
// bitmask of enabled architectures
@@ -303,6 +319,9 @@
#ifdef CAPSTONE_HAS_EVM
| (1 << CS_ARCH_EVM)
#endif
+#ifdef CAPSTONE_HAS_NEO
+ | (1 << CS_ARCH_NEO)
+#endif
;
@@ -375,7 +394,8 @@
(1 << CS_ARCH_PPC) | (1 << CS_ARCH_SPARC) |
(1 << CS_ARCH_SYSZ) | (1 << CS_ARCH_XCORE) |
(1 << CS_ARCH_M68K) | (1 << CS_ARCH_TMS320C64X) |
- (1 << CS_ARCH_M680X) | (1 << CS_ARCH_EVM));
+ (1 << CS_ARCH_M680X) | (1 << CS_ARCH_EVM) |
+ (1 << CS_ARCH_NEO));
if ((unsigned int)query < CS_ARCH_MAX)
return all_arch & (1 << query);
@@ -641,6 +661,9 @@
case CS_ARCH_EVM:
// EVM alignment is 1.
return 1;
+ case CS_ARCH_NEO:
+ // NEO alignment is 1.
+ return 1;
}
}
@@ -1359,6 +1382,13 @@
count++;
#endif
break;
+ case CS_ARCH_NEO:
+#if 0
+ for (i = 0; i < insn->detail->neo.op_count; i++)
+ if (insn->detail->neo.operands[i].type == (neo_op_type)op_type)
+ count++;
+#endif
+ break;
}
return count;
@@ -1494,6 +1524,16 @@
}
#endif
break;
+ case CS_ARCH_NEO:
+#if 0
+ for (i = 0; i < insn->detail->neo.op_count; i++) {
+ if (insn->detail->neo.operands[i].type == (neo_op_type)op_type)
+ count++;
+ if (count == post)
+ return i;
+ }
+#endif
+ break;
}
return -1;
diff --git a/cstool/cstool.c b/cstool/cstool.c
index cd3483e..835e3fe 100644
--- a/cstool/cstool.c
+++ b/cstool/cstool.c
@@ -56,6 +56,7 @@
{ "hd6309", CS_ARCH_M680X, CS_MODE_M680X_6309 },
{ "hcs08", CS_ARCH_M680X, CS_MODE_M680X_HCS08 },
{ "evm", CS_ARCH_EVM, 0 },
+ { "neo", CS_ARCH_NEO, 0 },
{ NULL }
};
@@ -71,6 +72,7 @@
void print_insn_detail_tms320c64x(csh handle, cs_insn *ins);
void print_insn_detail_m680x(csh handle, cs_insn *ins);
void print_insn_detail_evm(csh handle, cs_insn *ins);
+void print_insn_detail_neo(csh handle, cs_insn *ins);
static void print_details(csh handle, cs_arch arch, cs_mode md, cs_insn *ins);
@@ -208,6 +210,10 @@
printf(" evm: Ethereum Virtual Machine\n");
}
+ if (cs_support(CS_ARCH_NEO)) {
+ printf(" neo: NEO Virtual Machine\n");
+ }
+
printf("\nExtra options:\n");
printf(" -d show detailed information of the instructions\n");
printf(" -u show immediates as unsigned\n\n");
@@ -252,6 +258,9 @@
case CS_ARCH_EVM:
print_insn_detail_evm(handle, ins);
break;
+ case CS_ARCH_NEO:
+ print_insn_detail_neo(handle, ins);
+ break;
default: break;
}
diff --git a/cstool/cstool_neo.c b/cstool/cstool_neo.c
new file mode 100644
index 0000000..9943fea
--- /dev/null
+++ b/cstool/cstool_neo.c
@@ -0,0 +1,46 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <capstone/capstone.h>
+
+void print_string_hex(char *comment, unsigned char *str, size_t len);
+
+void print_insn_detail_neo(csh handle, cs_insn *ins)
+{
+ cs_neo *neo;
+ int i;
+
+ // detail can be NULL on "data" instruction if SKIPDATA option is turned ON
+ if (ins->detail == NULL)
+ return;
+
+ neo = &(ins->detail->neo);
+
+ if (neo->pop)
+ printf("\tPop: %u\n", neo->pop);
+
+ if (neo->push)
+ printf("\tPush: %u\n", neo->push);
+
+ if (neo->fee) {
+ switch(neo->fee) {
+ default:
+ break;
+ case NEO_FEE_0:
+ printf("\tGas fee: 0\n");
+ break;
+ case NEO_FEE_01:
+ printf("\tGas fee: 0.1\n");
+ break;
+ case NEO_FEE_001:
+ printf("\tGas fee: 0.01\n");
+ break;
+ case NEO_FEE_002:
+ printf("\tGas fee: 0.02\n");
+ break;
+ case NEO_FEE_0001:
+ printf("\tGas fee: 0.001\n");
+ break;
+ }
+ }
+}
diff --git a/include/capstone/capstone.h b/include/capstone/capstone.h
index 39b18c9..2ebb093 100644
--- a/include/capstone/capstone.h
+++ b/include/capstone/capstone.h
@@ -84,6 +84,7 @@
CS_ARCH_TMS320C64X, // TMS320C64x architecture
CS_ARCH_M680X, // 680X architecture
CS_ARCH_EVM, // Ethereum architecture
+ CS_ARCH_NEO, // Ethereum architecture
CS_ARCH_MAX,
CS_ARCH_ALL = 0xFFFF, // All architectures - for cs_support()
} cs_arch;
@@ -257,6 +258,7 @@
// X86: 1 bytes.
// XCore: 2 bytes.
// EVM: 1 bytes.
+ // NEO: 1 bytes.
cs_skipdata_cb_t callback; // default value is NULL
// User-defined data to be passed to @callback function pointer.
@@ -276,6 +278,7 @@
#include "tms320c64x.h"
#include "m680x.h"
#include "evm.h"
+#include "neo.h"
// NOTE: All information in cs_detail is only available when CS_OPT_DETAIL = CS_OPT_ON
typedef struct cs_detail {
@@ -302,6 +305,7 @@
cs_tms320c64x tms320c64x; // TMS320C64x architecture
cs_m680x m680x; // M680X architecture
cs_evm evm; // Ethereum architecture
+ cs_neo neo; // NEO architecture
};
} cs_detail;
diff --git a/include/capstone/neo.h b/include/capstone/neo.h
new file mode 100644
index 0000000..95843e5
--- /dev/null
+++ b/include/capstone/neo.h
@@ -0,0 +1,239 @@
+#ifndef CAPSTONE_NEO_H
+#define CAPSTONE_NEO_H
+
+/* Capstone Disassembly Engine */
+/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2018 */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "platform.h"
+
+#ifdef _MSC_VER
+#pragma warning(disable:4201)
+#endif
+
+typedef enum neo_fee {
+ NEO_FEE_0, // fee 0
+ NEO_FEE_01, // fee 0.1
+ NEO_FEE_001, // fee 0.01
+ NEO_FEE_002, // fee 0.02
+ NEO_FEE_0001, // fee 0.001
+} neo_fee;
+
+// Instruction structure
+typedef struct cs_neo {
+ unsigned char op_size; // operand size
+ unsigned char pop; // number of items popped from the stack
+ unsigned char push; // number of items pushed into the stack
+ neo_fee fee; // gas fee for the instruction
+} cs_neo;
+
+//> NEO instruction
+typedef enum cs_neo_insn {
+ NEO_INS_PUSH0 = 0,
+ NEO_INS_PUSHBYTES1 = 1,
+ NEO_INS_PUSHBYTES2 = 2,
+ NEO_INS_PUSHBYTES3 = 3,
+ NEO_INS_PUSHBYTES4 = 4,
+ NEO_INS_PUSHBYTES5 = 5,
+ NEO_INS_PUSHBYTES6 = 6,
+ NEO_INS_PUSHBYTES7 = 7,
+ NEO_INS_PUSHBYTES8 = 8,
+ NEO_INS_PUSHBYTES9 = 9,
+ NEO_INS_PUSHBYTES10 = 10,
+ NEO_INS_PUSHBYTES11 = 11,
+ NEO_INS_PUSHBYTES12 = 12,
+ NEO_INS_PUSHBYTES13 = 13,
+ NEO_INS_PUSHBYTES14 = 14,
+ NEO_INS_PUSHBYTES15 = 15,
+ NEO_INS_PUSHBYTES16 = 16,
+ NEO_INS_PUSHBYTES17 = 17,
+ NEO_INS_PUSHBYTES18 = 18,
+ NEO_INS_PUSHBYTES19 = 19,
+ NEO_INS_PUSHBYTES20 = 20,
+ NEO_INS_PUSHBYTES21 = 21,
+ NEO_INS_PUSHBYTES22 = 22,
+ NEO_INS_PUSHBYTES23 = 23,
+ NEO_INS_PUSHBYTES24 = 24,
+ NEO_INS_PUSHBYTES25 = 25,
+ NEO_INS_PUSHBYTES26 = 26,
+ NEO_INS_PUSHBYTES27 = 27,
+ NEO_INS_PUSHBYTES28 = 28,
+ NEO_INS_PUSHBYTES29 = 29,
+ NEO_INS_PUSHBYTES30 = 30,
+ NEO_INS_PUSHBYTES31 = 31,
+ NEO_INS_PUSHBYTES32 = 32,
+ NEO_INS_PUSHBYTES33 = 33,
+ NEO_INS_PUSHBYTES34 = 34,
+ NEO_INS_PUSHBYTES35 = 35,
+ NEO_INS_PUSHBYTES36 = 36,
+ NEO_INS_PUSHBYTES37 = 37,
+ NEO_INS_PUSHBYTES38 = 38,
+ NEO_INS_PUSHBYTES39 = 39,
+ NEO_INS_PUSHBYTES40 = 40,
+ NEO_INS_PUSHBYTES41 = 41,
+ NEO_INS_PUSHBYTES42 = 42,
+ NEO_INS_PUSHBYTES43 = 43,
+ NEO_INS_PUSHBYTES44 = 44,
+ NEO_INS_PUSHBYTES45 = 45,
+ NEO_INS_PUSHBYTES46 = 46,
+ NEO_INS_PUSHBYTES47 = 47,
+ NEO_INS_PUSHBYTES48 = 48,
+ NEO_INS_PUSHBYTES49 = 49,
+ NEO_INS_PUSHBYTES50 = 50,
+ NEO_INS_PUSHBYTES51 = 51,
+ NEO_INS_PUSHBYTES52 = 52,
+ NEO_INS_PUSHBYTES53 = 53,
+ NEO_INS_PUSHBYTES54 = 54,
+ NEO_INS_PUSHBYTES55 = 55,
+ NEO_INS_PUSHBYTES56 = 56,
+ NEO_INS_PUSHBYTES57 = 57,
+ NEO_INS_PUSHBYTES58 = 58,
+ NEO_INS_PUSHBYTES59 = 59,
+ NEO_INS_PUSHBYTES60 = 60,
+ NEO_INS_PUSHBYTES61 = 61,
+ NEO_INS_PUSHBYTES62 = 62,
+ NEO_INS_PUSHBYTES63 = 63,
+ NEO_INS_PUSHBYTES64 = 64,
+ NEO_INS_PUSHBYTES65 = 65,
+ NEO_INS_PUSHBYTES66 = 66,
+ NEO_INS_PUSHBYTES67 = 67,
+ NEO_INS_PUSHBYTES68 = 68,
+ NEO_INS_PUSHBYTES69 = 69,
+ NEO_INS_PUSHBYTES70 = 70,
+ NEO_INS_PUSHBYTES71 = 71,
+ NEO_INS_PUSHBYTES72 = 72,
+ NEO_INS_PUSHBYTES73 = 73,
+ NEO_INS_PUSHBYTES74 = 74,
+ NEO_INS_PUSHBYTES75 = 75,
+ NEO_INS_PUSHDATA1 = 76,
+ NEO_INS_PUSHDATA2 = 77,
+ NEO_INS_PUSHDATA4 = 78,
+ NEO_INS_PUSHM1 = 79,
+ NEO_INS_PUSH1 = 81,
+ NEO_INS_PUSH2 = 82,
+ NEO_INS_PUSH3 = 83,
+ NEO_INS_PUSH4 = 84,
+ NEO_INS_PUSH5 = 85,
+ NEO_INS_PUSH6 = 86,
+ NEO_INS_PUSH7 = 87,
+ NEO_INS_PUSH8 = 88,
+ NEO_INS_PUSH9 = 89,
+ NEO_INS_PUSH10 = 90,
+ NEO_INS_PUSH11 = 91,
+ NEO_INS_PUSH12 = 92,
+ NEO_INS_PUSH13 = 93,
+ NEO_INS_PUSH14 = 94,
+ NEO_INS_PUSH15 = 95,
+ NEO_INS_PUSH16 = 96,
+ NEO_INS_NOP = 97,
+ NEO_INS_JMP = 98,
+ NEO_INS_JMPIF = 99,
+ NEO_INS_JMPIFNOT = 100,
+ NEO_INS_CALL = 101,
+ NEO_INS_RET = 102,
+ NEO_INS_APPCALL = 103,
+ NEO_INS_SYSCALL = 104,
+ NEO_INS_TAILCALL = 105,
+ NEO_INS_DUPFROMALTSTACK = 106,
+ NEO_INS_TOALTSTACK = 107,
+ NEO_INS_FROMALTSTACK = 108,
+ NEO_INS_XDROP = 109,
+ NEO_INS_XSWAP = 114,
+ NEO_INS_XTUCK = 115,
+ NEO_INS_DEPTH = 116,
+ NEO_INS_DROP = 117,
+ NEO_INS_DUP = 118,
+ NEO_INS_NIP = 119,
+ NEO_INS_OVER = 120,
+ NEO_INS_PICK = 121,
+ NEO_INS_ROLL = 122,
+ NEO_INS_ROT = 123,
+ NEO_INS_SWAP = 124,
+ NEO_INS_TUCK = 125,
+ NEO_INS_CAT = 126,
+ NEO_INS_SUBSTR = 127,
+ NEO_INS_LEFT = 128,
+ NEO_INS_RIGHT = 129,
+ NEO_INS_SIZE = 130,
+ NEO_INS_INVERT = 131,
+ NEO_INS_AND = 132,
+ NEO_INS_OR = 133,
+ NEO_INS_XOR = 134,
+ NEO_INS_EQUAL = 135,
+ NEO_INS_OP_EQUALVERIFY = 136,
+ NEO_INS_OP_RESERVED1 = 137,
+ NEO_INS_OP_RESERVED2 = 138,
+ NEO_INS_INC = 139,
+ NEO_INS_DEC = 140,
+ NEO_INS_SIGN = 141,
+ NEO_INS_NEGATE = 143,
+ NEO_INS_ABS = 144,
+ NEO_INS_NOT = 145,
+ NEO_INS_NZ = 146,
+ NEO_INS_ADD = 147,
+ NEO_INS_SUB = 148,
+ NEO_INS_MUL = 149,
+ NEO_INS_DIV = 150,
+ NEO_INS_MOD = 151,
+ NEO_INS_SHL = 152,
+ NEO_INS_SHR = 153,
+ NEO_INS_BOOLAND = 154,
+ NEO_INS_BOOLOR = 155,
+ NEO_INS_NUMEQUAL = 156,
+ NEO_INS_NUMNOTEQUAL = 158,
+ NEO_INS_LT = 159,
+ NEO_INS_GT = 160,
+ NEO_INS_LTE = 161,
+ NEO_INS_GTE = 162,
+ NEO_INS_MIN = 163,
+ NEO_INS_MAX = 164,
+ NEO_INS_WITHIN = 165,
+ NEO_INS_SHA1 = 167,
+ NEO_INS_SHA256 = 168,
+ NEO_INS_HASH160 = 169,
+ NEO_INS_HASH256 = 170,
+ NEO_INS_CHECKSIG = 172,
+ NEO_INS_VERIFY = 173,
+ NEO_INS_CHECKMULTISIG = 174,
+ NEO_INS_ARRAYSIZE = 192,
+ NEO_INS_PACK = 193,
+ NEO_INS_UNPACK = 194,
+ NEO_INS_PICKITEM = 195,
+ NEO_INS_SETITEM = 196,
+ NEO_INS_NEWARRAY = 197,
+ NEO_INS_NEWSTRUCT = 198,
+ NEO_INS_NEWMAP = 199,
+ NEO_INS_APPEND = 200,
+ NEO_INS_REVERSE = 201,
+ NEO_INS_REMOVE = 202,
+ NEO_INS_HASKEY = 203,
+ NEO_INS_KEYS = 204,
+ NEO_INS_VALUES = 205,
+ NEO_INS_THROW = 240,
+ NEO_INS_THROWIFNOT = 241,
+
+ NEO_INS_INVALID = 512,
+ NEO_INS_ENDING, // <-- mark the end of the list of instructions
+} cs_neo_insn;
+
+//> Group of NEO instructions
+typedef enum cs_neo_insn_group {
+ NEO_GRP_INVALID = 0, // = CS_GRP_INVALID
+
+ NEO_GRP_JUMP, // all jump instructions
+
+ NEO_GRP_MATH = 8, // math instructions
+ NEO_GRP_STACK_WRITE,
+ NEO_GRP_STACK_READ,
+
+ NEO_GRP_ENDING, // <-- mark the end of the list of groups
+} cs_neo_insn_group;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif