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