📄 simops.c
字号:
State.regs[REG_D0 + REG0 (insn)] = value; z = (value == 0); n = (value & 0x80000000); c = (value < reg1) || (value < reg2); v = ((reg2 & 0x80000000) == (reg1 & 0x80000000) && (reg2 & 0x80000000) != (value & 0x80000000)); PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V); PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0) | (c ? PSW_C : 0) | (v ? PSW_V : 0));}/* add am,an */void OP_F170 (insn, extension) unsigned long insn, extension;{ int z, c, n, v; unsigned long reg1, reg2, value; reg1 = State.regs[REG_A0 + REG1 (insn)]; reg2 = State.regs[REG_A0 + REG0 (insn)]; value = reg1 + reg2; State.regs[REG_A0 + REG0 (insn)] = value; z = (value == 0); n = (value & 0x80000000); c = (value < reg1) || (value < reg2); v = ((reg2 & 0x80000000) == (reg1 & 0x80000000) && (reg2 & 0x80000000) != (value & 0x80000000)); PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V); PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0) | (c ? PSW_C : 0) | (v ? PSW_V : 0));}/* add imm8, dn */void OP_2800 (insn, extension) unsigned long insn, extension;{ int z, c, n, v; unsigned long reg1, imm, value; reg1 = State.regs[REG_D0 + REG0_8 (insn)]; imm = SEXT8 (insn & 0xff); value = reg1 + imm; State.regs[REG_D0 + REG0_8 (insn)] = value; z = (value == 0); n = (value & 0x80000000); c = (value < reg1) || (value < imm); v = ((reg1 & 0x80000000) == (imm & 0x80000000) && (reg1 & 0x80000000) != (value & 0x80000000)); PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V); PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0) | (c ? PSW_C : 0) | (v ? PSW_V : 0));}/* add imm16, dn */void OP_FAC00000 (insn, extension) unsigned long insn, extension;{ int z, c, n, v; unsigned long reg1, imm, value; reg1 = State.regs[REG_D0 + REG0_16 (insn)]; imm = SEXT16 (insn & 0xffff); value = reg1 + imm; State.regs[REG_D0 + REG0_16 (insn)] = value; z = (value == 0); n = (value & 0x80000000); c = (value < reg1) || (value < imm); v = ((reg1 & 0x80000000) == (imm & 0x80000000) && (reg1 & 0x80000000) != (value & 0x80000000)); PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V); PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0) | (c ? PSW_C : 0) | (v ? PSW_V : 0));}/* add imm32,dn */void OP_FCC00000 (insn, extension) unsigned long insn, extension;{ int z, c, n, v; unsigned long reg1, imm, value; reg1 = State.regs[REG_D0 + REG0_16 (insn)]; imm = ((insn & 0xffff) << 16) + extension; value = reg1 + imm; State.regs[REG_D0 + REG0_16 (insn)] = value; z = (value == 0); n = (value & 0x80000000); c = (value < reg1) || (value < imm); v = ((reg1 & 0x80000000) == (imm & 0x80000000) && (reg1 & 0x80000000) != (value & 0x80000000)); PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V); PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0) | (c ? PSW_C : 0) | (v ? PSW_V : 0));}/* add imm8, an */void OP_2000 (insn, extension) unsigned long insn, extension;{ int z, c, n, v; unsigned long reg1, imm, value; reg1 = State.regs[REG_A0 + REG0_8 (insn)]; imm = SEXT8 (insn & 0xff); value = reg1 + imm; State.regs[REG_A0 + REG0_8 (insn)] = value; z = (value == 0); n = (value & 0x80000000); c = (value < reg1) || (value < imm); v = ((reg1 & 0x80000000) == (imm & 0x80000000) && (reg1 & 0x80000000) != (value & 0x80000000)); PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V); PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0) | (c ? PSW_C : 0) | (v ? PSW_V : 0));}/* add imm16, an */void OP_FAD00000 (insn, extension) unsigned long insn, extension;{ int z, c, n, v; unsigned long reg1, imm, value; reg1 = State.regs[REG_A0 + REG0_16 (insn)]; imm = SEXT16 (insn & 0xffff); value = reg1 + imm; State.regs[REG_A0 + REG0_16 (insn)] = value; z = (value == 0); n = (value & 0x80000000); c = (value < reg1) || (value < imm); v = ((reg1 & 0x80000000) == (imm & 0x80000000) && (reg1 & 0x80000000) != (value & 0x80000000)); PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V); PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0) | (c ? PSW_C : 0) | (v ? PSW_V : 0));}/* add imm32, an */void OP_FCD00000 (insn, extension) unsigned long insn, extension;{ int z, c, n, v; unsigned long reg1, imm, value; reg1 = State.regs[REG_A0 + REG0_16 (insn)]; imm = ((insn & 0xffff) << 16) + extension; value = reg1 + imm; State.regs[REG_A0 + REG0_16 (insn)] = value; z = (value == 0); n = (value & 0x80000000); c = (value < reg1) || (value < imm); v = ((reg1 & 0x80000000) == (imm & 0x80000000) && (reg1 & 0x80000000) != (value & 0x80000000)); PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V); PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0) | (c ? PSW_C : 0) | (v ? PSW_V : 0));}/* add imm8, sp */void OP_F8FE00 (insn, extension) unsigned long insn, extension;{ unsigned long reg1, imm, value; reg1 = State.regs[REG_SP]; imm = SEXT8 (insn & 0xff); value = reg1 + imm; State.regs[REG_SP] = value;}/* add imm16,sp */void OP_FAFE0000 (insn, extension) unsigned long insn, extension;{ unsigned long reg1, imm, value; reg1 = State.regs[REG_SP]; imm = SEXT16 (insn & 0xffff); value = reg1 + imm; State.regs[REG_SP] = value;}/* add imm32, sp */void OP_FCFE0000 (insn, extension) unsigned long insn, extension;{ unsigned long reg1, imm, value; reg1 = State.regs[REG_SP]; imm = ((insn & 0xffff) << 16) + extension; value = reg1 + imm; State.regs[REG_SP] = value;}/* addc dm,dn */void OP_F140 (insn, extension) unsigned long insn, extension;{ int z, c, n, v; unsigned long reg1, reg2, value; reg1 = State.regs[REG_D0 + REG1 (insn)]; reg2 = State.regs[REG_D0 + REG0 (insn)]; value = reg1 + reg2 + ((PSW & PSW_C) != 0); State.regs[REG_D0 + REG0 (insn)] = value; z = (value == 0); n = (value & 0x80000000); c = (value < reg1) || (value < reg2); v = ((reg2 & 0x80000000) == (reg1 & 0x80000000) && (reg2 & 0x80000000) != (value & 0x80000000)); PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V); PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0) | (c ? PSW_C : 0) | (v ? PSW_V : 0));}/* sub dm, dn */void OP_F100 (insn, extension) unsigned long insn, extension;{ int z, c, n, v; unsigned long reg1, reg2, value; reg1 = State.regs[REG_D0 + REG1 (insn)]; reg2 = State.regs[REG_D0 + REG0 (insn)]; value = reg2 - reg1; State.regs[REG_D0 + REG0 (insn)] = value; z = (value == 0); n = (value & 0x80000000); c = (reg1 > reg2); v = ((reg2 & 0x80000000) != (reg1 & 0x80000000) && (reg2 & 0x80000000) != (value & 0x80000000)); PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V); PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0) | (c ? PSW_C : 0) | (v ? PSW_V : 0));}/* sub dm, an */void OP_F120 (insn, extension) unsigned long insn, extension;{ int z, c, n, v; unsigned long reg1, reg2, value; reg1 = State.regs[REG_D0 + REG1 (insn)]; reg2 = State.regs[REG_A0 + REG0 (insn)]; value = reg2 - reg1; State.regs[REG_A0 + REG0 (insn)] = value; z = (value == 0); n = (value & 0x80000000); c = (reg1 > reg2); v = ((reg2 & 0x80000000) != (reg1 & 0x80000000) && (reg2 & 0x80000000) != (value & 0x80000000)); PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V); PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0) | (c ? PSW_C : 0) | (v ? PSW_V : 0));}/* sub am, dn */void OP_F110 (insn, extension) unsigned long insn, extension;{ int z, c, n, v; unsigned long reg1, reg2, value; reg1 = State.regs[REG_A0 + REG1 (insn)]; reg2 = State.regs[REG_D0 + REG0 (insn)]; value = reg2 - reg1; State.regs[REG_D0 + REG0 (insn)] = value; z = (value == 0); n = (value & 0x80000000); c = (reg1 > reg2); v = ((reg2 & 0x80000000) != (reg1 & 0x80000000) && (reg2 & 0x80000000) != (value & 0x80000000)); PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V); PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0) | (c ? PSW_C : 0) | (v ? PSW_V : 0));}/* sub am, an */void OP_F130 (insn, extension) unsigned long insn, extension;{ int z, c, n, v; unsigned long reg1, reg2, value; reg1 = State.regs[REG_A0 + REG1 (insn)]; reg2 = State.regs[REG_A0 + REG0 (insn)]; value = reg2 - reg1; State.regs[REG_A0 + REG0 (insn)] = value; z = (value == 0); n = (value & 0x80000000); c = (reg1 > reg2); v = ((reg2 & 0x80000000) != (reg1 & 0x80000000) && (reg2 & 0x80000000) != (value & 0x80000000)); PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V); PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0) | (c ? PSW_C : 0) | (v ? PSW_V : 0));}/* sub imm32, dn */void OP_FCC40000 (insn, extension) unsigned long insn, extension;{ int z, c, n, v; unsigned long reg1, imm, value; reg1 = State.regs[REG_D0 + REG0_16 (insn)]; imm = ((insn & 0xffff) << 16) + extension; value = reg1 - imm; State.regs[REG_D0 + REG0_16 (insn)] = value; z = (value == 0); n = (value & 0x80000000); c = (reg1 < imm); v = ((reg1 & 0x80000000) != (imm & 0x80000000) && (reg1 & 0x80000000) != (value & 0x80000000)); PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V); PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0) | (c ? PSW_C : 0) | (v ? PSW_V : 0));}/* sub imm32, an */void OP_FCD40000 (insn, extension) unsigned long insn, extension;{ int z, c, n, v; unsigned long reg1, imm, value; reg1 = State.regs[REG_A0 + REG0_16 (insn)]; imm = ((insn & 0xffff) << 16) + extension; value = reg1 - imm; State.regs[REG_A0 + REG0_16 (insn)] = value; z = (value == 0); n = (value & 0x80000000); c = (reg1 < imm); v = ((reg1 & 0x80000000) != (imm & 0x80000000) && (reg1 & 0x80000000) != (value & 0x80000000)); PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V); PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0) | (c ? PSW_C : 0) | (v ? PSW_V : 0));}/* subc dm, dn */void OP_F180 (insn, extension) unsigned long insn, extension;{ int z, c, n, v; unsigned long reg1, reg2, value; reg1 = State.regs[REG_D0 + REG1 (insn)]; reg2 = State.regs[REG_D0 + REG0 (insn)]; value = reg2 - reg1 - ((PSW & PSW_C) != 0); State.regs[REG_D0 + REG0 (insn)] = value; z = (value == 0); n = (value & 0x80000000); c = (reg1 > reg2); v = ((reg2 & 0x80000000) != (reg1 & 0x80000000) && (reg2 & 0x80000000) != (value & 0x80000000)); PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V); PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0) | (c ? PSW_C : 0) | (v ? PSW_V : 0));}/* mul dm, dn */void OP_F240 (insn, extension) unsigned long insn, extension;{ unsigned long long temp; int n, z; temp = ((signed64)(signed32)State.regs[REG_D0 + REG0 (insn)] * (signed64)(signed32)State.regs[REG_D0 + REG1 (insn)]); State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffffff; State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;; z = (State.regs[REG_D0 + REG0 (insn)] == 0); n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0; PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V); PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));}/* mulu dm, dn */void OP_F250 (insn, extension) unsigned long insn, extension;{ unsigned long long temp; int n, z; temp = ((unsigned64)State.regs[REG_D0 + REG0 (insn)] * (unsigned64)State.regs[REG_D0 + REG1 (insn)]); State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffffff; State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32; z = (State.regs[REG_D0 + REG0 (insn)] == 0); n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0; PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V); PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));}/* div dm, dn */void OP_F260 (insn, extension) unsigned long insn, extension;{ long long temp; int n, z; temp = State.regs[REG_MDR]; temp <<= 32; temp |= State.regs[REG_D0 + REG0 (insn)]; State.regs[REG_MDR] = temp % (long)State.regs[REG_D0 + REG1 (insn)]; temp /= (long)State.regs[REG_D0 + REG1 (insn)]; State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffffff; z = (State.regs[REG_D0 + REG0 (insn)] == 0); n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0; PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V); PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));}/* divu dm, dn */void OP_F270 (insn, extension) unsigned long insn, extension;{ unsigned long long temp; int n, z; temp = State.regs[REG_MDR]; temp <<= 32; temp |= State.regs[REG_D0 + REG0 (insn)]; State.regs[REG_MDR] = temp % State.regs[REG_D0 + REG1 (insn)]; temp /= State.regs[REG_D0 + REG1 (insn)]; State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffffff; z = (State.regs[REG_D0 + REG0 (insn)] == 0); n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0; PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V); PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));}/* inc dn */void OP_40 (insn, extension) unsigned long insn, extension;{ int z,n,c,v; unsigned int value, imm, reg1; reg1 = State.regs[REG_D0 + REG1 (insn)]; imm = 1; value = reg1 + imm; State.regs[REG_D0 + REG1 (insn)] = value; z = (value == 0); n = (value & 0x80000000); c = (value < imm); v = ((reg1 & 0x80000000) == (imm & 0x80000000) && (reg1 & 0x80000000) != (value & 0x80000000)); PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V); PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0) | (c ? PSW_C : 0) | (v ? PSW_V : 0));}/* inc an */void OP_41 (insn, extension) unsigned long insn, extension;{ State.regs[REG_A0 + REG1 (insn)] += 1;}/* inc4 an */void OP_50 (insn, extension) unsigned long insn, extension;{ State.regs[REG_A0 + REG0 (insn)] += 4;}/* cmp imm8, dn */void OP_A000 (insn, extension) unsigned long insn, extension;{ int z, c, n, v; unsigned long reg1, imm, value; reg1 = State.regs[REG_D0 + REG0_8 (insn)]; imm = SEXT8 (insn & 0xff); value = reg1 - imm; z = (value == 0); n = (value & 0x80000000); c = (reg1 < imm);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -