int op_xor_wait(t_data *data, char is) { if (is == N_WAIT) return (op_wait(data)); else return (op_xor(data)); }
static UINT32 process_rop(UINT32 src, UINT32 dst, UINT32 pat, const char* rop, UINT32 format) { DWORD stack[10] = { 0 }; DWORD stackp = 0; while (*rop != '\0') { char op = *rop++; switch (op) { case '0': stack[stackp++] = FreeRDPGetColor(format, 0, 0, 0, 0xFF); break; case '1': stack[stackp++] = FreeRDPGetColor(format, 0xFF, 0xFF, 0xFF, 0xFF); break; case 'D': stack[stackp++] = dst; break; case 'S': stack[stackp++] = src; break; case 'P': stack[stackp++] = pat; break; case 'x': op_xor(stack, &stackp); break; case 'a': op_and(stack, &stackp); break; case 'o': op_or(stack, &stackp); break; case 'n': op_not(stack, &stackp); break; default: break; } } return stack[0]; }
void amis2000_base_device::execute_run() { while (m_icount > 0) { m_icount--; // remember previous opcode m_prev_op = m_op; debugger_instruction_hook(this, m_pc); m_op = m_program->read_byte(m_pc); m_pc = (m_pc + 1) & 0x1fff; if (m_skip) { // always skip over PP prefix m_skip = ((m_op & 0xf0) == 0x60); m_op = 0; // nop } switch (m_op & 0xf0) { case 0x50: op_adis(); break; case 0x60: op_pp(); break; case 0x70: op_lai(); break; case 0x80: case 0x90: case 0xa0: case 0xb0: op_jms(); break; case 0xc0: case 0xd0: case 0xe0: case 0xf0: op_jmp(); break; default: switch (m_op) { case 0x00: op_nop(); break; case 0x01: op_halt(); break; case 0x02: op_rt(); break; case 0x03: op_rts(); break; case 0x04: op_psh(); break; case 0x05: op_psl(); break; case 0x06: op_and(); break; case 0x07: op_sos(); break; case 0x08: op_sbe(); break; case 0x09: op_szc(); break; case 0x0a: op_stc(); break; case 0x0b: op_rsc(); break; case 0x0c: op_lae(); break; case 0x0d: op_xae(); break; case 0x0e: op_inp(); break; case 0x0f: op_eur(); break; case 0x10: op_cma(); break; case 0x11: op_xabu(); break; case 0x12: op_lab(); break; case 0x13: op_xab(); break; case 0x14: op_adcs(); break; case 0x15: op_xor(); break; case 0x16: op_add(); break; case 0x17: op_sam(); break; case 0x18: op_disb(); break; case 0x19: op_mvs(); break; case 0x1a: op_out(); break; case 0x1b: op_disn(); break; case 0x28: op_szk(); break; case 0x29: op_szi(); break; case 0x2a: op_rf1(); break; case 0x2b: op_sf1(); break; case 0x2c: op_rf2(); break; case 0x2d: op_sf2(); break; case 0x2e: op_tf1(); break; case 0x2f: op_tf2(); break; default: switch (m_op & 0xfc) { case 0x1c: op_szm(); break; case 0x20: op_stm(); break; case 0x24: op_rsm(); break; case 0x30: op_xci(); break; case 0x34: op_xcd(); break; case 0x38: op_xc(); break; case 0x3c: op_lam(); break; case 0x40: op_lbz(); break; case 0x44: op_lbf(); break; case 0x48: op_lbe(); break; case 0x4c: op_lbep(); break; } break; // 0xfc } break; // 0xff } // big switch } }
static int op_oplevel(int level) { int precision; bwx_DEBUG(__FUNCTION__); /* set the precision */ if ((precision = op_getprecision(level)) == OP_ERROR) { op_pulldown(2); sprintf(bwb_ebuf, "exp_operation(): failed to set precision."); bwb_error(bwb_ebuf); return FALSE; } /* precision is set correctly */ else { switch (CURTASK exps[level].operation) { case OP_ADD: op_add(level, precision); break; case OP_SUBTRACT: op_subtract(level, precision); break; case OP_MULTIPLY: op_multiply(level, precision); break; case OP_DIVIDE: op_divide(level, precision); break; case OP_ASSIGN: op_assign(level, precision); break; case OP_EQUALS: op_equals(level, precision); break; case OP_LESSTHAN: op_lessthan(level, precision); break; case OP_GREATERTHAN: op_greaterthan(level, precision); break; case OP_LTEQ: op_lteq(level, precision); break; case OP_GTEQ: op_gteq(level, precision); break; case OP_NOTEQUAL: op_notequal(level, precision); break; case OP_MODULUS: op_modulus(level, precision); break; case OP_INTDIVISION: op_intdiv(level, precision); break; case OP_OR: op_or(level, precision); break; case OP_AND: op_and(level, precision); break; case OP_NOT: op_not(level, precision); break; case OP_XOR: op_xor(level, precision); break; case OP_IMPLIES: op_imp(level, precision); break; case OP_EQUIV: op_eqv(level, precision); break; case OP_EXPONENT: op_exponent(level, precision); break; case OP_NEGATION: /* JBV */ op_negation(level, precision); break; case OP_POSATION: op_posation(level, precision); break; default: sprintf(bwb_ebuf, "PROGRAMMING ERROR: operator <%d> not (yet) supported.", CURTASK exps[level].operation); op_pulldown(2); bwb_error(bwb_ebuf); return FALSE; break; } /* end of case statement for operators */ } /* end of else statement, precision set */ return TRUE; } /* end of function op_oplevel() */
void Step() { Opcodes OP = (Opcodes)Fetch8(); //printf("%08X:%08X\n", Registers[sp], Registers[pc]); switch (OP) { case O_NOP: op_nop(); break; case O_MOV: op_mov(); break; case O_ADD: op_add(); break; case O_SUB: op_sub(); break; case O_MUL: op_mul(); break; case O_DIV: op_div(); break; case O_LI: op_li(); break; case O_MOVF: op_movf(); break; case O_ADDF: op_addf(); break; case O_SUBF: op_subf(); break; case O_MULF: op_mulf(); break; case O_DIVF: op_divf(); break; case O_LIF: op_lif(); break; case O_XOR: op_xor(); break; case O_AND: op_and(); break; case O_MOD: op_mod(); break; case O_OR: op_or(); break; case O_NOT: op_not(); break; case O_SHR: op_shr(); break; case O_SHL: op_shl(); break; case O_PUSH: op_push(); break; case O_POP: op_pop(); break; case O_STB: op_stb(); break; case O_LDB: op_ldb(); break; case O_STH: op_sth(); break; case O_LDH: op_ldh(); break; case O_STW: op_stw(); break; case O_LDW: op_ldw(); break; case O_LDF: op_ldf(); break; case O_STF: op_stf(); break; case O_CMP: op_cmp(); break; case O_B: op_b(0); break; case O_BC: op_b(1); break; case O_BEQ: op_bcond(ctr0_eq); break; case O_BNE: op_bcond(ctr0_ne); break; case O_BGT: op_bcond(ctr0_gt); break; case O_BLT: op_bcond(ctr0_lt); break; case O_BTC: op_btc(); break; case O_INC: op_inc(); break; case O_DEC: op_dec(); break; default: Error("Error: Unknown Opcode PC = %d OP = %08X\n", Registers[pc], OP); } Ticks++; }
void doop(Mips * emu, uint32_t op) { switch(op & 0xfc000000) { case 0x8000000: op_j(emu,op); return; case 0xc000000: op_jal(emu,op); return; case 0x10000000: op_beq(emu,op); return; case 0x14000000: op_bne(emu,op); return; case 0x18000000: op_blez(emu,op); return; case 0x1c000000: op_bgtz(emu,op); return; case 0x20000000: op_addi(emu,op); return; case 0x24000000: op_addiu(emu,op); return; case 0x28000000: op_slti(emu,op); return; case 0x2c000000: op_sltiu(emu,op); return; case 0x30000000: op_andi(emu,op); return; case 0x34000000: op_ori(emu,op); return; case 0x38000000: op_xori(emu,op); return; case 0x3c000000: op_lui(emu,op); return; case 0x50000000: op_beql(emu,op); return; case 0x54000000: op_bnel(emu,op); return; case 0x58000000: op_blezl(emu,op); return; case 0x80000000: op_lb(emu,op); return; case 0x84000000: op_lh(emu,op); return; case 0x88000000: op_lwl(emu,op); return; case 0x8c000000: op_lw(emu,op); return; case 0x90000000: op_lbu(emu,op); return; case 0x94000000: op_lhu(emu,op); return; case 0x98000000: op_lwr(emu,op); return; case 0xa0000000: op_sb(emu,op); return; case 0xa4000000: op_sh(emu,op); return; case 0xa8000000: op_swl(emu,op); return; case 0xac000000: op_sw(emu,op); return; case 0xb8000000: op_swr(emu,op); return; case 0xbc000000: op_cache(emu,op); return; case 0xc0000000: op_ll(emu,op); return; case 0xcc000000: op_pref(emu,op); return; case 0xe0000000: op_sc(emu,op); return; } switch(op & 0xfc00003f) { case 0x0: op_sll(emu,op); return; case 0x2: op_srl(emu,op); return; case 0x3: op_sra(emu,op); return; case 0x4: op_sllv(emu,op); return; case 0x6: op_srlv(emu,op); return; case 0x7: op_srav(emu,op); return; case 0x8: op_jr(emu,op); return; case 0x9: op_jalr(emu,op); return; case 0xc: op_syscall(emu,op); return; case 0xf: op_sync(emu,op); return; case 0x10: op_mfhi(emu,op); return; case 0x11: op_mthi(emu,op); return; case 0x12: op_mflo(emu,op); return; case 0x13: op_mtlo(emu,op); return; case 0x18: op_mult(emu,op); return; case 0x19: op_multu(emu,op); return; case 0x1a: op_div(emu,op); return; case 0x1b: op_divu(emu,op); return; case 0x20: op_add(emu,op); return; case 0x21: op_addu(emu,op); return; case 0x22: op_sub(emu,op); return; case 0x23: op_subu(emu,op); return; case 0x24: op_and(emu,op); return; case 0x25: op_or(emu,op); return; case 0x26: op_xor(emu,op); return; case 0x27: op_nor(emu,op); return; case 0x2a: op_slt(emu,op); return; case 0x2b: op_sltu(emu,op); return; case 0x2d: op_addu(emu,op); //daddu return; case 0x36: op_tne(emu,op); return; } switch(op & 0xfc1f0000) { case 0x4000000: op_bltz(emu,op); return; case 0x4010000: op_bgez(emu,op); return; case 0x4020000: op_bltzl(emu,op); return; case 0x4030000: op_bgezl(emu,op); return; case 0x4100000: op_bltzal(emu,op); return; case 0x4110000: op_bgezal(emu,op); return; case 0x5c000000: op_bgtzl(emu,op); return; } switch(op & 0xffffffff) { case 0x42000002: op_tlbwi(emu,op); return; case 0x42000006: op_tlbwr(emu,op); return; case 0x42000008: op_tlbp(emu,op); return; case 0x42000018: op_eret(emu,op); return; } switch(op & 0xfc0007ff) { case 0xa: op_movz(emu,op); return; case 0xb: op_movn(emu,op); return; case 0x70000002: op_mul(emu,op); return; } switch(op & 0xffe00000) { case 0x40000000: op_mfc0(emu,op); return; case 0x40800000: op_mtc0(emu,op); return; } switch(op & 0xfe00003f) { case 0x42000020: op_wait(emu,op); return; } // printf("unhandled opcode at %x -> %x\n",emu->pc,op); setExceptionCode(emu,EXC_RI); emu->exceptionOccured = 1; return; }