static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, int len) { int ret = 1; struct cr16_cmd cmd; ret = cr16_decode_command (buf, &cmd); snprintf(op->buf_asm, R_ASM_BUFSIZE, "%s %s", cmd.instr, cmd.operands); op->size = ret; return ret; }
static int cr16_op(RAnal *anal, RAnalOp *op, ut64 addr, const ut8 *buf, int len) { int ret; struct cr16_cmd cmd; memset(&cmd, 0, sizeof (cmd)); memset(op, 0, sizeof (RAnalOp)); ret = op->size = cr16_decode_command(buf, &cmd); if (ret <= 0) { return ret; } op->addr = addr; op->jump = op->fail = -1; op->ptr = op->val = -1; switch (cmd.type) { case CR16_TYPE_MOV: op->type = R_ANAL_OP_TYPE_MOV; break; case CR16_TYPE_ADD: op->type = R_ANAL_OP_TYPE_ADD; break; case CR16_TYPE_MUL: op->type = R_ANAL_OP_TYPE_MUL; break; case CR16_TYPE_SUB: op->type = R_ANAL_OP_TYPE_SUB; break; case CR16_TYPE_CMP: op->type = R_ANAL_OP_TYPE_CMP; break; case CR16_TYPE_BE: case CR16_TYPE_BNE: op->type = R_ANAL_OP_TYPE_CJMP; break; case CR16_TYPE_AND: op->type = R_ANAL_OP_TYPE_AND; break; case CR16_TYPE_OR: op->type = R_ANAL_OP_TYPE_OR; break; case CR16_TYPE_SCOND: break; case CR16_TYPE_XOR: op->type = R_ANAL_OP_TYPE_XOR; break; case CR16_TYPE_SHIFT: op->type = R_ANAL_OP_TYPE_SHR; break; case CR16_TYPE_BIT: op->type = R_ANAL_OP_TYPE_MOV; break; case CR16_TYPE_SLPR: op->type = R_ANAL_OP_TYPE_MOV; break; case CR16_TYPE_BCOND: if (cmd.reladdr) { op->jump = addr + cmd.reladdr; op->fail = addr + 2; } op->type = R_ANAL_OP_TYPE_CJMP; break; case CR16_TYPE_BR: case CR16_TYPE_BAL: op->type = R_ANAL_OP_TYPE_UJMP; break; case CR16_TYPE_EXCP: op->type = R_ANAL_OP_TYPE_SWI; break; case CR16_TYPE_JCOND: case CR16_TYPE_JAL: case CR16_TYPE_JUMP: case CR16_TYPE_JUMP_UNK: if (cmd.reladdr) { op->jump = addr + cmd.reladdr; op->fail = addr + 2; } op->type = R_ANAL_OP_TYPE_JMP; break; case CR16_TYPE_RETX: op->type = R_ANAL_OP_TYPE_RET; break; case CR16_TYPE_PUSH: op->type = R_ANAL_OP_TYPE_PUSH; break; case CR16_TYPE_POP: op->type = R_ANAL_OP_TYPE_POP; break; case CR16_TYPE_LOAD: case CR16_TYPE_DI: case CR16_TYPE_EI: case CR16_TYPE_STOR: op->type = R_ANAL_OP_TYPE_MOV; break; case CR16_TYPE_NOP: op->type = R_ANAL_OP_TYPE_NOP; break; case CR16_TYPE_WAIT: case CR16_TYPE_EWAIT: op->type = R_ANAL_OP_TYPE_SWI; break; default: op->type = R_ANAL_OP_TYPE_UNK; } return ret; }