ts-capstone
Version:
This module provides bindings for the Capstone disassembly framework.
354 lines (343 loc) • 7.5 kB
text/typescript
export interface cs_tms320c64x_op {
type: TMS320C64X; // operand type
reg?: TMS320C64X; // register value for REG operand or first register for REGPAIR operand
imm?: number; // immediate value for IMM operand
mem?: {
// base/disp value for MEM operand
base: number; // base register
disp: number; // displacement/offset value
unit: number; // unit of base and offset register
scaled: number; // offset scaled
disptype: number; // displacement type
direction: number; // direction
modify: number; // modification
};
}
export enum TMS320C64X {
OP_INVALID = 0, // cs.OP_INVALID (Uninitialized).
OP_REG = 1, // cs.OP_REG (Register operand).
OP_IMM = 2, // cs.OP_IMM (Immediate operand).
OP_MEM = 3, // cs.OP_MEM (Memory operand).
OP_REGPAIR = 64, // Register pair for double word ops
MEM_DISP_INVALID = 0,
MEM_DISP_CONSTANT = 1,
MEM_DISP_REGISTER = 2,
MEM_DIR_INVALID = 0,
MEM_DIR_FW = 1,
MEM_DIR_BW = 2,
MEM_MOD_INVALID = 0,
MEM_MOD_NO = 1,
MEM_MOD_PRE = 2,
MEM_MOD_POST = 3,
REG_INVALID = 0,
REG_AMR = 1,
REG_CSR = 2,
REG_DIER = 3,
REG_DNUM = 4,
REG_ECR = 5,
REG_GFPGFR = 6,
REG_GPLYA = 7,
REG_GPLYB = 8,
REG_ICR = 9,
REG_IER = 10,
REG_IERR = 11,
REG_ILC = 12,
REG_IRP = 13,
REG_ISR = 14,
REG_ISTP = 15,
REG_ITSR = 16,
REG_NRP = 17,
REG_NTSR = 18,
REG_REP = 19,
REG_RILC = 20,
REG_SSR = 21,
REG_TSCH = 22,
REG_TSCL = 23,
REG_TSR = 24,
REG_A0 = 25,
REG_A1 = 26,
REG_A2 = 27,
REG_A3 = 28,
REG_A4 = 29,
REG_A5 = 30,
REG_A6 = 31,
REG_A7 = 32,
REG_A8 = 33,
REG_A9 = 34,
REG_A10 = 35,
REG_A11 = 36,
REG_A12 = 37,
REG_A13 = 38,
REG_A14 = 39,
REG_A15 = 40,
REG_A16 = 41,
REG_A17 = 42,
REG_A18 = 43,
REG_A19 = 44,
REG_A20 = 45,
REG_A21 = 46,
REG_A22 = 47,
REG_A23 = 48,
REG_A24 = 49,
REG_A25 = 50,
REG_A26 = 51,
REG_A27 = 52,
REG_A28 = 53,
REG_A29 = 54,
REG_A30 = 55,
REG_A31 = 56,
REG_B0 = 57,
REG_B1 = 58,
REG_B2 = 59,
REG_B3 = 60,
REG_B4 = 61,
REG_B5 = 62,
REG_B6 = 63,
REG_B7 = 64,
REG_B8 = 65,
REG_B9 = 66,
REG_B10 = 67,
REG_B11 = 68,
REG_B12 = 69,
REG_B13 = 70,
REG_B14 = 71,
REG_B15 = 72,
REG_B16 = 73,
REG_B17 = 74,
REG_B18 = 75,
REG_B19 = 76,
REG_B20 = 77,
REG_B21 = 78,
REG_B22 = 79,
REG_B23 = 80,
REG_B24 = 81,
REG_B25 = 82,
REG_B26 = 83,
REG_B27 = 84,
REG_B28 = 85,
REG_B29 = 86,
REG_B30 = 87,
REG_B31 = 88,
REG_PCE1 = 89,
REG_ENDING = 90, // mark the end of the list of registers
// Alias registers
REG_EFR = TMS320C64X.REG_ECR,
REG_IFR = TMS320C64X.REG_ISR,
INS_INVALID = 0,
INS_ABS = 1,
INS_ABS2 = 2,
INS_ADD = 3,
INS_ADD2 = 4,
INS_ADD4 = 5,
INS_ADDAB = 6,
INS_ADDAD = 7,
INS_ADDAH = 8,
INS_ADDAW = 9,
INS_ADDK = 10,
INS_ADDKPC = 11,
INS_ADDU = 12,
INS_AND = 13,
INS_ANDN = 14,
INS_AVG2 = 15,
INS_AVGU4 = 16,
INS_B = 17,
INS_BDEC = 18,
INS_BITC4 = 19,
INS_BNOP = 20,
INS_BPOS = 21,
INS_CLR = 22,
INS_CMPEQ = 23,
INS_CMPEQ2 = 24,
INS_CMPEQ4 = 25,
INS_CMPGT = 26,
INS_CMPGT2 = 27,
INS_CMPGTU4 = 28,
INS_CMPLT = 29,
INS_CMPLTU = 30,
INS_DEAL = 31,
INS_DOTP2 = 32,
INS_DOTPN2 = 33,
INS_DOTPNRSU2 = 34,
INS_DOTPRSU2 = 35,
INS_DOTPSU4 = 36,
INS_DOTPU4 = 37,
INS_EXT = 38,
INS_EXTU = 39,
INS_GMPGTU = 40,
INS_GMPY4 = 41,
INS_LDB = 42,
INS_LDBU = 43,
INS_LDDW = 44,
INS_LDH = 45,
INS_LDHU = 46,
INS_LDNDW = 47,
INS_LDNW = 48,
INS_LDW = 49,
INS_LMBD = 50,
INS_MAX2 = 51,
INS_MAXU4 = 52,
INS_MIN2 = 53,
INS_MINU4 = 54,
INS_MPY = 55,
INS_MPY2 = 56,
INS_MPYH = 57,
INS_MPYHI = 58,
INS_MPYHIR = 59,
INS_MPYHL = 60,
INS_MPYHLU = 61,
INS_MPYHSLU = 62,
INS_MPYHSU = 63,
INS_MPYHU = 64,
INS_MPYHULS = 65,
INS_MPYHUS = 66,
INS_MPYLH = 67,
INS_MPYLHU = 68,
INS_MPYLI = 69,
INS_MPYLIR = 70,
INS_MPYLSHU = 71,
INS_MPYLUHS = 72,
INS_MPYSU = 73,
INS_MPYSU4 = 74,
INS_MPYU = 75,
INS_MPYU4 = 76,
INS_MPYUS = 77,
INS_MVC = 78,
INS_MVD = 79,
INS_MVK = 80,
INS_MVKL = 81,
INS_MVKLH = 82,
INS_NOP = 83,
INS_NORM = 84,
INS_OR = 85,
INS_PACK2 = 86,
INS_PACKH2 = 87,
INS_PACKH4 = 88,
INS_PACKHL2 = 89,
INS_PACKL4 = 90,
INS_PACKLH2 = 91,
INS_ROTL = 92,
INS_SADD = 93,
INS_SADD2 = 94,
INS_SADDU4 = 95,
INS_SADDUS2 = 96,
INS_SAT = 97,
INS_SET = 98,
INS_SHFL = 99,
INS_SHL = 100,
INS_SHLMB = 101,
INS_SHR = 102,
INS_SHR2 = 103,
INS_SHRMB = 104,
INS_SHRU = 105,
INS_SHRU2 = 106,
INS_SMPY = 107,
INS_SMPY2 = 108,
INS_SMPYH = 109,
INS_SMPYHL = 110,
INS_SMPYLH = 111,
INS_SPACK2 = 112,
INS_SPACKU4 = 113,
INS_SSHL = 114,
INS_SSHVL = 115,
INS_SSHVR = 116,
INS_SSUB = 117,
INS_STB = 118,
INS_STDW = 119,
INS_STH = 120,
INS_STNDW = 121,
INS_STNW = 122,
INS_STW = 123,
INS_SUB = 124,
INS_SUB2 = 125,
INS_SUB4 = 126,
INS_SUBAB = 127,
INS_SUBABS4 = 128,
INS_SUBAH = 129,
INS_SUBAW = 130,
INS_SUBC = 131,
INS_SUBU = 132,
INS_SWAP4 = 133,
INS_UNPKHU4 = 134,
INS_UNPKLU4 = 135,
INS_XOR = 136,
INS_XPND2 = 137,
INS_XPND4 = 138,
INS_IDLE = 139,
INS_MV = 140,
INS_NEG = 141,
INS_NOT = 142,
INS_SWAP2 = 143,
INS_ZERO = 144,
INS_ENDING = 145, // mark the end of the list of instructions
GRP_INVALID = 0, // cs.GRP_INVALID
GRP_JUMP = 1, // cs.GRP_JUMP
GRP_FUNIT_D = 128,
GRP_FUNIT_L = 129,
GRP_FUNIT_M = 130,
GRP_FUNIT_S = 131,
GRP_FUNIT_NO = 132,
GRP_ENDING = 133, // mark the end of the list of groups
FUNIT_INVALID = 0,
FUNIT_D = 1,
FUNIT_L = 2,
FUNIT_M = 3,
FUNIT_S = 4,
FUNIT_NO = 5,
}
export class cs_tms320c64x {
public op_count: number;
public operands: cs_tms320c64x_op[]; // operands for this instruction.
public condition: {
reg: number;
zero: number;
};
public funit: {
unit: number;
side: number;
crosspath: number;
};
public parallel: number;
constructor(arch_info_ptr: number, Memory: any) {
this.operands = [];
this.op_count = Memory.read(arch_info_ptr + 0, 'ubyte');
this.condition = {
reg: Memory.read(arch_info_ptr + 260, 'i32'),
zero: Memory.read(arch_info_ptr + 264, 'i32'),
};
this.funit = {
unit: Memory.read(arch_info_ptr + 268, 'u32'),
side: Memory.read(arch_info_ptr + 272, 'u32'),
crosspath: Memory.read(arch_info_ptr + 276, 'u32'),
};
this.parallel = Memory.read(arch_info_ptr + 280, 'u32');
for (let i = 0; i < this.op_count; i++) {
const op: cs_tms320c64x_op = {} as cs_tms320c64x_op;
const op_ptr: number = arch_info_ptr + 4 + i * 32;
op.type = Memory.read(op_ptr, 'i32');
switch (op.type) {
case TMS320C64X.OP_REG:
op.reg = Memory.read(op_ptr + 4, 'u32');
break;
case TMS320C64X.OP_IMM:
op.imm = Memory.read(op_ptr + 4, 'i32');
break;
case TMS320C64X.OP_MEM:
op.mem = {
base: Memory.read(op_ptr + 4, 'u32'),
disp: Memory.read(op_ptr + 8, 'i32'),
unit: Memory.read(op_ptr + 12, 'i32'),
scaled: Memory.read(op_ptr + 16, 'i32'),
disptype: Memory.read(op_ptr + 20, 'i32'),
direction: Memory.read(op_ptr + 24, 'i32'),
modify: Memory.read(op_ptr + 28, 'i32'),
};
break;
case TMS320C64X.OP_REGPAIR:
op.reg = Memory.read(op_ptr + 4, 'u32');
break;
}
this.operands[i] = op;
}
return this;
}
}