static int first_nibble_is_3(RAnal* anal, RAnalOp* op, ut16 code){ //TODO Handle carry/overflow , CMP/xx? if( IS_ADD(code) || IS_ADDC(code) || IS_ADDV(code) ) { op->type = R_ANAL_OP_TYPE_ADD; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if ( IS_SUB(code) || IS_SUBC(code) || IS_SUBV(code)) { op->type = R_ANAL_OP_TYPE_SUB; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_CMPEQ(code) || IS_CMPGE(code) || IS_CMPGT(code) || IS_CMPHI(code) || IS_CMPHS(code)) { //TODO : finish implementing op->type = R_ANAL_OP_TYPE_CMP; op->src[0] = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); op->src[1] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); } else if (IS_DIV1(code)) { op->type = R_ANAL_OP_TYPE_DIV; op->src[0] = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); op->src[1] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); //todo: dest ? } else if (IS_DMULU(code) || IS_DMULS(code)) { op->type = R_ANAL_OP_TYPE_MUL; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->src[1] = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); //todo: dest=MACL,MACH } return op->size; }
static int first_nibble_is_8(RAnal* anal, RAnalOp* op, ut16 code){ if (IS_BT_OR_BF(code)) { op->type = R_ANAL_OP_TYPE_CJMP; //Jump if true or jump if false insns op->jump = disarm_8bit_offset (op->addr, GET_BTF_OFFSET(code)); op->fail = op->addr + 2 ; op->eob = true; if (IS_BTS(code) || IS_BFS(code)) op->delay = 1; //Only /S versions have a delay slot } else if (IS_MOVB_REGDISP_R0(code)) { // 10000100mmmmi4*1 mov.b @(<disp>,<REG_M>),R0 op->type = R_ANAL_OP_TYPE_LOAD; op->dst = anal_fill_ai_rg (anal, 0); op->src[0] = anal_fill_reg_disp_mem (anal, GET_SOURCE_REG(code), code&0x0F, BYTE_SIZE); } else if (IS_MOVW_REGDISP_R0(code)) { // 10000101mmmmi4*2 mov.w @(<disp>,<REG_M>),R0 op->type = R_ANAL_OP_TYPE_LOAD; op->dst = anal_fill_ai_rg (anal, 0); op->src[0] = anal_fill_reg_disp_mem (anal, GET_SOURCE_REG(code), code&0x0F, WORD_SIZE); } else if (IS_CMPIMM(code)) { op->type = R_ANAL_OP_TYPE_CMP; //todo : finish implementing } else if (IS_MOVB_R0_REGDISP(code)) { /* 10000000mmmmi4*1 mov.b R0,@(<disp>,<REG_M>)*/ op->type = R_ANAL_OP_TYPE_STORE; op->src[0] = anal_fill_ai_rg (anal, 0); op->dst = anal_fill_reg_disp_mem (anal, GET_SOURCE_REG(code), code&0x0F, BYTE_SIZE); } else if (IS_MOVW_R0_REGDISP(code)) { // 10000001mmmmi4*2 mov.w R0,@(<disp>,<REG_M>)) op->type = R_ANAL_OP_TYPE_STORE; op->src[0] = anal_fill_ai_rg (anal, 0); op->dst = anal_fill_reg_disp_mem (anal, GET_SOURCE_REG(code), code&0x0F, WORD_SIZE); } return op->size; }
static int first_nibble_is_3(RAnal* anal, RAnalOp* op, ut16 code){ //TODO Handle carry/overflow , CMP/xx? if( IS_ADD(code) || IS_ADDC(code) || IS_ADDV(code) ){ op->type = R_ANAL_OP_TYPE_ADD; op->src[0] = anal_fill_ai_rg(anal,GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); } else if ( IS_SUB(code) || IS_SUBC(code) || IS_SUBV(code)){ op->type = R_ANAL_OP_TYPE_SUB; op->src[0] = anal_fill_ai_rg(anal,GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); } return op->size; }
static int first_nibble_is_2(RAnal* anal, RAnalOp* op, ut16 code){ if (IS_MOVB_REG_TO_REGREF(code)) { // 0010nnnnmmmm0000 mov.b <REG_M>,@<REG_N> op->type = R_ANAL_OP_TYPE_STORE; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_reg_ref (anal, GET_TARGET_REG(code), BYTE_SIZE); } else if (IS_MOVW_REG_TO_REGREF(code)) { op->type = R_ANAL_OP_TYPE_STORE; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_reg_ref (anal, GET_TARGET_REG(code), WORD_SIZE); } else if (IS_MOVL_REG_TO_REGREF(code)) { op->type = R_ANAL_OP_TYPE_STORE; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_reg_ref (anal, GET_TARGET_REG(code), LONG_SIZE); } else if (IS_AND_REGS(code)) { op->type = R_ANAL_OP_TYPE_AND; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_XOR_REGS(code)) { op->type = R_ANAL_OP_TYPE_XOR; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_OR_REGS(code)) { op->type = R_ANAL_OP_TYPE_OR; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_PUSHB(code) || IS_PUSHW(code) || IS_PUSHL(code)) { op->type = R_ANAL_OP_TYPE_PUSH; //TODO Handle 'pushes' (mov Rm,@-Rn) } else if (IS_TSTRR(code)) { op->type = R_ANAL_OP_TYPE_ACMP; //TODO: handle tst reg,reg } else if (IS_CMPSTR(code)) { //0010nnnnmmmm1100 cmp/str <REG_M>,<REG_N> op->type = R_ANAL_OP_TYPE_ACMP; //maybe not? op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->src[1] = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); //todo: handle cmp/str byte-per-byte cmp? } else if (IS_XTRCT(code)) { //0010nnnnmmmm1101 xtrct <REG_M>,<REG_N> op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->src[1] = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); //todo: add details ? } else if (IS_DIV0S(code)) { op->type = R_ANAL_OP_TYPE_DIV; //todo: add details? } else if (IS_MULUW(code) || IS_MULSW(code)) { //0010nnnnmmmm111_ mul{s,u}.w <REG_M>,<REG_N> op->type = R_ANAL_OP_TYPE_MUL; op->src[0] = anal_fill_ai_rg(anal,GET_SOURCE_REG(code)); op->src[1] = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); //todo: dest=MACL } return op->size; }
static int first_nibble_is_8(RAnal* anal, RAnalOp* op, ut16 code){ if (IS_BT_OR_BF(code)){ op->type = R_ANAL_OP_TYPE_CJMP; //Jump if true or jump if false insns op->jump = (op->addr << 1) +4 + (st8)GET_BTF_OFFSET(code); op->fail = op->addr + 2 ; op->eob = R_TRUE; if (IS_BTS(code) || IS_BFS(code)) op->delay = 1; //Only /S versions have a delay slot } else if (IS_MOVB_REGDISP_R0(code)){ op->type = R_ANAL_OP_TYPE_MOV; op->dst = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); op->src[0] = anal_fill_reg_disp_mem(anal,GET_SOURCE_REG(code),code&0x0F,BYTE_SIZE); } else if (IS_MOVW_REGDISP_R0(code)){ op->type = R_ANAL_OP_TYPE_MOV; op->dst = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); op->src[0] = anal_fill_reg_disp_mem(anal,GET_SOURCE_REG(code),code&0x0F,WORD_SIZE); } //TODO some movs + CMP/EQ?? return op->size; }
static int first_nibble_is_6(RAnal* anal, RAnalOp* op, ut16 code){ if(IS_MOV_REGS(code)){ op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_ai_rg(anal,GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); } else if (IS_MOVB_REGREF_TO_REG(code)){ op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_reg_ref(anal,GET_SOURCE_REG(code),BYTE_SIZE); op->dst = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); } else if (IS_MOVW_REGREF_TO_REG(code)){ op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_reg_ref(anal,GET_SOURCE_REG(code),WORD_SIZE); op->dst = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); } else if (IS_MOVL_REGREF_TO_REG(code)){ op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_reg_ref(anal,GET_SOURCE_REG(code),LONG_SIZE); op->dst = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); } //TODO neg(c) + MOV.L @Rm+,Rn return op->size; }
static int first_nibble_is_2(RAnal* anal, RAnalOp* op, ut16 code){ //TODO handle mov.x Rm, @Rn, (X)OR/AND regs, if (IS_MOVB_REG_TO_REGREF(code)){ op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_ai_rg(anal,GET_SOURCE_REG(code)); op->dst = anal_fill_reg_ref(anal,GET_TARGET_REG(code),BYTE_SIZE); } else if (IS_MOVW_REG_TO_REGREF(code)){ op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_ai_rg(anal,GET_SOURCE_REG(code)); op->dst = anal_fill_reg_ref(anal,GET_TARGET_REG(code),WORD_SIZE); } else if (IS_MOVL_REG_TO_REGREF(code)){ op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_ai_rg(anal,GET_SOURCE_REG(code)); op->dst = anal_fill_reg_ref(anal,GET_TARGET_REG(code),LONG_SIZE); } else if (IS_AND_REGS(code)){ op->type = R_ANAL_OP_TYPE_AND; op->src[0] = anal_fill_ai_rg(anal,GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); } else if (IS_XOR_REGS(code)){ op->type = R_ANAL_OP_TYPE_XOR; op->src[0] = anal_fill_ai_rg(anal,GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); } else if (IS_OR_REGS(code)){ op->type = R_ANAL_OP_TYPE_OR; op->src[0] = anal_fill_ai_rg(anal,GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); } //TODO Handle 'pushes' (mov Rm,@-Rn) //TODO Handle CMP/STR ?? return op->size; }
static int first_nibble_is_6(RAnal* anal, RAnalOp* op, ut16 code){ if (IS_MOV_REGS(code)) { op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_MOVB_REGREF_TO_REG(code)) { op->type = R_ANAL_OP_TYPE_LOAD; op->src[0] = anal_fill_reg_ref (anal, GET_SOURCE_REG(code), BYTE_SIZE); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_MOVW_REGREF_TO_REG(code)) { op->type = R_ANAL_OP_TYPE_LOAD; op->src[0] = anal_fill_reg_ref (anal, GET_SOURCE_REG(code), WORD_SIZE); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_MOVL_REGREF_TO_REG(code)) { op->type = R_ANAL_OP_TYPE_LOAD; op->src[0] = anal_fill_reg_ref (anal, GET_SOURCE_REG(code), LONG_SIZE); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_EXT(code)) { //ext{s,u}.{b,w} instructs. todo : more detail ? op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_MOVB_POP(code) || IS_MOVW_POP(code) || IS_MOVL_POP(code)) { /* 0110nnnnmmmm0100 mov.b @<REG_M>+,<REG_N>*/ /* 0110nnnnmmmm0101 mov.w @<REG_M>+,<REG_N>*/ /* 0110nnnnmmmm0110 mov.l @<REG_M>+,<REG_N>*/ op->type = R_ANAL_OP_TYPE_POP; op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); //todo : op->src for pop = ? } else if (IS_NEG(code)) { //todo: neg and negc details op->type = R_ANAL_OP_TYPE_UNK; /* 0110nnnnmmmm1010 negc*/ /* 0110nnnnmmmm1010 neg */ op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_NOT(code)) { //todo : details? op->type = R_ANAL_OP_TYPE_NOT; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_SWAP(code)) { /* 0110nnnnmmmm1000 swap.b <REG_M>,<REG_N>*/ /* 0110nnnnmmmm1001 swap.w <REG_M>,<REG_N>*/ op->type = R_ANAL_OP_TYPE_MOV; //todo : details } return op->size; }
/* 16 decoder routines, based on 1st nibble value */ static int first_nibble_is_0(RAnal* anal, RAnalOp* op, ut16 code){ if(IS_BSRF(code)){ /* Call 'far' subroutine Rn+PC+4 */ op->type = R_ANAL_OP_TYPE_UCALL; op->delay = 1; op->dst = anal_regrel_jump(anal,op,GET_TARGET_REG(code)); } else if (IS_BRAF(code)){ /* Unconditional branch to Rn+PC+4, no delay slot */ op->type = R_ANAL_OP_TYPE_UJMP; op->dst = anal_regrel_jump(anal,op,GET_TARGET_REG(code)); op->eob = R_TRUE; } else if( IS_RTS(code) ){ /* Ret from subroutine. Returns to pr */ //TODO Convert into jump pr? op->type = R_ANAL_OP_TYPE_RET; op->delay = 1; op->eob = R_TRUE; } else if (IS_RTE(code)){ //TODO Convert into jmp spc? Indicate ssr->sr as well? op->type = R_ANAL_OP_TYPE_RET; op->delay = 1; op->eob = R_TRUE; } else if (IS_MOVB_REG_TO_R0REL(code)){ op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_ai_rg(anal,GET_SOURCE_REG(code)); op->dst = anal_fill_r0_reg_ref(anal,GET_TARGET_REG(code),BYTE_SIZE); } else if (IS_MOVW_REG_TO_R0REL(code)){ op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_ai_rg(anal,GET_SOURCE_REG(code)); op->dst = anal_fill_r0_reg_ref(anal,GET_TARGET_REG(code),WORD_SIZE); } else if (IS_MOVL_REG_TO_R0REL(code)){ op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_ai_rg(anal,GET_SOURCE_REG(code)); op->dst = anal_fill_r0_reg_ref(anal,GET_TARGET_REG(code),LONG_SIZE); } else if (IS_MOVB_R0REL_TO_REG(code)){ op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_r0_reg_ref(anal,GET_SOURCE_REG(code),BYTE_SIZE); op->dst = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); } else if (IS_MOVW_R0REL_TO_REG(code)){ op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_r0_reg_ref(anal,GET_SOURCE_REG(code),WORD_SIZE); op->dst = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); } else if (IS_MOVL_R0REL_TO_REG(code)){ op->type = R_ANAL_OP_TYPE_MOV; op->src[0] = anal_fill_r0_reg_ref(anal,GET_SOURCE_REG(code),LONG_SIZE); op->dst = anal_fill_ai_rg(anal,GET_TARGET_REG(code)); } //TODO Check missing insns, specially STC might be interesting return op->size; }
//nibble=5; 0101nnnnmmmmi4*4 mov.l @(<disp>,<REG_M>),<REG_N> static int movl_rdisp_reg(RAnal* anal, RAnalOp* op, ut16 code){ op->type = R_ANAL_OP_TYPE_LOAD; op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); op->src[0] = anal_fill_reg_disp_mem (anal, GET_SOURCE_REG(code), code&0x0F, LONG_SIZE); return op->size; }
/* 16 decoder routines, based on 1st nibble value */ static int first_nibble_is_0(RAnal* anal, RAnalOp* op, ut16 code){ if(IS_BSRF(code)) { /* Call 'far' subroutine Rn+PC+4 */ op->type = R_ANAL_OP_TYPE_UCALL; op->delay = 1; op->dst = anal_regrel_jump (anal, op, GET_TARGET_REG(code)); } else if (IS_BRAF(code)) { /* Unconditional branch to Rn+PC+4, no delay slot */ op->type = R_ANAL_OP_TYPE_UJMP; op->dst = anal_regrel_jump (anal, op, GET_TARGET_REG(code)); op->eob = true; } else if( IS_RTS(code) ) { /* Ret from subroutine. Returns to pr */ //TODO Convert into jump pr? op->type = R_ANAL_OP_TYPE_RET; op->delay = 1; op->eob = true; } else if (IS_RTE(code)) { //TODO Convert into jmp spc? Indicate ssr->sr as well? op->type = R_ANAL_OP_TYPE_RET; op->delay = 1; op->eob = true; } else if (IS_MOVB_REG_TO_R0REL(code)) { //0000nnnnmmmm0100 mov.b <REG_M>,@(R0,<REG_N>) op->type = R_ANAL_OP_TYPE_STORE; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_r0_reg_ref (anal, GET_TARGET_REG(code), BYTE_SIZE); } else if (IS_MOVW_REG_TO_R0REL(code)) { op->type = R_ANAL_OP_TYPE_STORE; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_r0_reg_ref (anal, GET_TARGET_REG(code), WORD_SIZE); } else if (IS_MOVL_REG_TO_R0REL(code)) { op->type = R_ANAL_OP_TYPE_STORE; op->src[0] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); op->dst = anal_fill_r0_reg_ref(anal, GET_TARGET_REG(code), LONG_SIZE); } else if (IS_MOVB_R0REL_TO_REG(code)) { op->type = R_ANAL_OP_TYPE_LOAD; op->src[0] = anal_fill_r0_reg_ref (anal, GET_SOURCE_REG(code), BYTE_SIZE); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_MOVW_R0REL_TO_REG(code)) { op->type = R_ANAL_OP_TYPE_LOAD; op->src[0] = anal_fill_r0_reg_ref (anal, GET_SOURCE_REG(code), WORD_SIZE); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_MOVL_R0REL_TO_REG(code)) { op->type = R_ANAL_OP_TYPE_LOAD; op->src[0] = anal_fill_r0_reg_ref (anal, GET_SOURCE_REG(code), LONG_SIZE); op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_NOP(code)) { op->type = R_ANAL_OP_TYPE_NOP; } else if (IS_CLRT(code)) { op->type = R_ANAL_OP_TYPE_UNK; //TODO : implement flag } else if (IS_SETT(code)) { op->type = R_ANAL_OP_TYPE_UNK; } else if (IS_CLRMAC(code)) { op->type = R_ANAL_OP_TYPE_UNK; //TODO : type_mov ? } else if (IS_DIV0U(code)) { op->type = R_ANAL_OP_TYPE_DIV; } else if (IS_MOVT(code)) { op->type = R_ANAL_OP_TYPE_MOV; //op->src[0] = //TODO: figure out how to get T flag from sr reg op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_MULL(code)) { op->type = R_ANAL_OP_TYPE_MUL; op->src[0] = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); op->src[1] = anal_fill_ai_rg (anal, GET_SOURCE_REG(code)); //op->dst = //TODO: figure out how to set MACL + MACH } else if (IS_SLEEP(code)) { op->type = R_ANAL_OP_TYPE_UNK; } else if (IS_STSMAC(code)) { //0000nnnn0000101_ sts MAC*,<REG_N> op->type = R_ANAL_OP_TYPE_MOV; op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); } else if (IS_STCSR1(code)) { //0000nnnn00010010 stc {sr,gbr,vbr,ssr},<REG_N> op->type = R_ANAL_OP_TYPE_MOV; op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); //todo: plug in src } else if (IS_STSPR(code)) { //0000nnnn00101010 sts PR,<REG_N> op->type = R_ANAL_OP_TYPE_MOV; op->dst = anal_fill_ai_rg (anal, GET_TARGET_REG(code)); //todo: plug in src } //TODO Check missing insns, especially STC might be interesting return op->size; }