📄 protectedmodeublock.java
字号:
case RET_O16_A32:
case RET_O16_A16: {
if (cpu.ss.getDefaultSizeFlag())
ret_o16_a32();
else
ret_o16_a16();
} break;
case RET_O32_A32:
case RET_O32_A16: {
if (cpu.ss.getDefaultSizeFlag())
ret_o32_a32();
else
ret_o32_a16();
} break;
case RET_IW_O16_A32:
case RET_IW_O16_A16: {
if (cpu.ss.getDefaultSizeFlag())
ret_iw_o16_a32((short)reg0);
else
ret_iw_o16_a16((short)reg0);
} break;
case RET_IW_O32_A32:
case RET_IW_O32_A16: {
if (cpu.ss.getDefaultSizeFlag())
ret_iw_o32_a32((short)reg0);
else
ret_iw_o32_a16((short)reg0);
} break;
case RET_FAR_O16_A32:
case RET_FAR_O16_A16: {
if (cpu.ss.getDefaultSizeFlag())
ret_far_o16_a32(0);
else
ret_far_o16_a16(0);
} break;
case RET_FAR_O32_A32:
case RET_FAR_O32_A16: {
if (cpu.ss.getDefaultSizeFlag())
ret_far_o32_a32(0);
else
ret_far_o32_a16(0);
} break;
case RET_FAR_IW_O16_A32:
case RET_FAR_IW_O16_A16: {
if (cpu.ss.getDefaultSizeFlag())
ret_far_o16_a32((short)reg0);
else
ret_far_o16_a16((short)reg0);
} break;
case RET_FAR_IW_O32_A32:
case RET_FAR_IW_O32_A16: {
if (cpu.ss.getDefaultSizeFlag())
ret_far_o32_a32((short)reg0);
else
ret_far_o32_a16((short)reg0);
} break;
case INT_O16_A32:
case INT_O16_A16: {
cpu.handleSoftProtectedModeInterrupt(reg0);
} break;
case INT_O32_A32:
case INT_O32_A16: {
cpu.handleSoftProtectedModeInterrupt(reg0);
} break;
case IRET_O32_A32:
case IRET_O32_A16:
if (cpu.ss.getDefaultSizeFlag())
reg0 = iret_o32_a32();
else
reg0 = iret_o32_a16();
break;
case IRET_O16_A32:
case IRET_O16_A16:
if (cpu.ss.getDefaultSizeFlag())
reg0 = iret_o16_a32();
else
reg0 = iret_o16_a16();
break;
case SYSENTER: sysenter(); break;
case SYSEXIT: sysexit(reg0, reg1); break;
case IN_O8: reg0 = in_o8(reg0); break;
case IN_O16: reg0 = in_o16(reg0); break;
case IN_O32: reg0 = in_o32(reg0); break;
case OUT_O8: out_o8(reg0, reg1); break;
case OUT_O16: out_o16(reg0, reg1); break;
case OUT_O32: out_o32(reg0, reg1); break;
case CMOVO: if (cpu.getOverflowFlag()) reg0 = reg1; break;
case CMOVNO: if (!cpu.getOverflowFlag()) reg0 = reg1; break;
case CMOVC: if (cpu.getCarryFlag()) reg0 = reg1; break;
case CMOVNC: if (!cpu.getCarryFlag()) reg0 = reg1; break;
case CMOVZ: if (cpu.getZeroFlag()) reg0 = reg1; break;
case CMOVNZ: if (!cpu.getZeroFlag()) reg0 = reg1; break;
case CMOVNA: if (cpu.getCarryFlag() || cpu.getZeroFlag()) reg0 = reg1; break;
case CMOVA: if ((!cpu.getCarryFlag()) && (!cpu.getZeroFlag())) reg0 = reg1; break;
case CMOVS: if (cpu.getSignFlag()) reg0 = reg1; break;
case CMOVNS: if (!cpu.getSignFlag()) reg0 = reg1; break;
case CMOVP: if (cpu.getParityFlag()) reg0 = reg1; break;
case CMOVNP: if (!cpu.getParityFlag()) reg0 = reg1; break;
case CMOVL: if (cpu.getSignFlag() != cpu.getOverflowFlag()) reg0 = reg1; break;
case CMOVNL: if (cpu.getSignFlag() == cpu.getOverflowFlag()) reg0 = reg1; break;
case CMOVNG: if (cpu.getZeroFlag() || (cpu.getSignFlag() != cpu.getOverflowFlag())) reg0 = reg1; break;
case CMOVG: if ((!cpu.getZeroFlag()) && (cpu.getSignFlag() == cpu.getOverflowFlag())) reg0 = reg1; break;
case SETO: reg0 = cpu.getOverflowFlag() ? 1 : 0; break;
case SETNO: reg0 = cpu.getOverflowFlag() ? 0 : 1; break;
case SETC: reg0 = cpu.getCarryFlag() ? 1 : 0; break;
case SETNC: reg0 = cpu.getCarryFlag() ? 0 : 1; break;
case SETZ: reg0 = cpu.getZeroFlag() ? 1 : 0; break;
case SETNZ: reg0 = cpu.getZeroFlag() ? 0 : 1; break;
case SETNA: reg0 = cpu.getCarryFlag() || cpu.getZeroFlag() ? 1 : 0; break;
case SETA: reg0 = cpu.getCarryFlag() || cpu.getZeroFlag() ? 0 : 1; break;
case SETS: reg0 = cpu.getSignFlag() ? 1 : 0; break;
case SETNS: reg0 = cpu.getSignFlag() ? 0 : 1; break;
case SETP: reg0 = cpu.getParityFlag() ? 1 : 0; break;
case SETNP: reg0 = cpu.getParityFlag() ? 0 : 1; break;
case SETL: reg0 = cpu.getSignFlag() != cpu.getOverflowFlag() ? 1 : 0; break;
case SETNL: reg0 = cpu.getSignFlag() != cpu.getOverflowFlag() ? 0 : 1; break;
case SETNG: reg0 = cpu.getZeroFlag() || (cpu.getSignFlag() != cpu.getOverflowFlag()) ? 1 : 0; break;
case SETG: reg0 = cpu.getZeroFlag() || (cpu.getSignFlag() != cpu.getOverflowFlag()) ? 0 : 1; break;
case SMSW: reg0 = cpu.getCR0() & 0xffff; break;
case LMSW: if (cpu.getCPL() != 0) throw (ProcessorException) exceptionGP;
cpu.setCR0((cpu.getCR0() & ~0xe) | (reg0 & 0xe)); break;
case CMPXCHG:
if (reg2 == reg0) {
reg0 = reg1;
reg1 = reg2;
} else
reg1 = reg0;
break;
case CMPXCHG8B: {
long edxeax = ((cpu.edx & 0xffffffffL) << 32) | (cpu.eax & 0xffffffffL);
if (edxeax == reg0l) {
cpu.eflagsZero = true;
reg0l = ((cpu.ecx & 0xffffffffL) << 32) | (cpu.ebx & 0xffffffffL);
} else {
cpu.eflagsZero = false;
cpu.edx = (int)(reg0l >> 32);
cpu.eax = (int)reg0l;
}
} break;
case BSWAP: reg0 = reverseBytes(reg0); break;
case ENTER_O32_A32:
case ENTER_O32_A16: {
if (cpu.ss.getDefaultSizeFlag())
enter_o32_a32(reg0, reg1);
else
throw new IllegalStateException("need enter_o32_a16");
} break;
case ENTER_O16_A32:
case ENTER_O16_A16: {
if (cpu.ss.getDefaultSizeFlag())
enter_o16_a32(reg0, reg1);
else
enter_o16_a16(reg0, reg1);
} break;
case LEAVE_O32_A32:
case LEAVE_O32_A16: {
if (cpu.ss.getDefaultSizeFlag())
leave_o32_a32();
else
leave_o32_a16();
} break;
case LEAVE_O16_A32:
case LEAVE_O16_A16: {
if (cpu.ss.getDefaultSizeFlag())
leave_o16_a32();
else
leave_o16_a16();
} break;
case PUSH_O32_A16:
case PUSH_O32_A32: {
if (cpu.ss.getDefaultSizeFlag())
push_o32_a32(reg0);
else
push_o32_a16(reg0);
} break;
case PUSH_O16_A16:
case PUSH_O16_A32: {
if (cpu.ss.getDefaultSizeFlag())
push_o16_a32((short)reg0);
else
push_o16_a16((short)reg0);
} break;
case PUSHF_O32_A16:
case PUSHF_O32_A32: {
if (cpu.ss.getDefaultSizeFlag())
push_o32_a32(~0x30000 & reg0);
else
push_o32_a16(~0x30000 & reg0);
} break;
case PUSHF_O16_A16:
case PUSHF_O16_A32: {
if (cpu.ss.getDefaultSizeFlag())
push_o16_a32((short)reg0);
else
push_o16_a16((short)reg0);
} break;
case POP_O32_A16:
case POP_O32_A32: {
if (cpu.ss.getDefaultSizeFlag()) {
reg1 = cpu.esp + 4;
if (microcodes[position] == STORE0_SS)
cpu.eflagsInterruptEnable = false;
reg0 = cpu.ss.getDoubleWord(cpu.esp);
} else {
reg1 = (cpu.esp & ~0xffff) | ((cpu.esp + 4) & 0xffff);
if (microcodes[position] == STORE0_SS)
cpu.eflagsInterruptEnable = false;
reg0 = cpu.ss.getDoubleWord(0xffff & cpu.esp);
}
} break;
case POP_O16_A16:
case POP_O16_A32: {
if (cpu.ss.getDefaultSizeFlag()) {
reg1 = cpu.esp + 2;
if (microcodes[position] == STORE0_SS)
cpu.eflagsInterruptEnable = false;
reg0 = 0xffff & cpu.ss.getWord(cpu.esp);
} else {
reg1 = (cpu.esp & ~0xffff) | ((cpu.esp + 2) & 0xffff);
if (microcodes[position] == STORE0_SS)
cpu.eflagsInterruptEnable = false;
reg0 = 0xffff & cpu.ss.getWord(0xffff & cpu.esp);
}
} break;
case POPF_O32_A16:
case POPF_O32_A32: {
if (cpu.ss.getDefaultSizeFlag()) {
reg0 = cpu.ss.getDoubleWord(cpu.esp);
cpu.esp += 4;
} else {
reg0 = cpu.ss.getDoubleWord(0xffff & cpu.esp);
cpu.esp = (cpu.esp & ~0xffff) | ((cpu.esp + 4) & 0xffff);
}
if (cpu.getCPL() == 0)
reg0 = ((cpu.getEFlags() & 0x20000) | (reg0 & ~(0x20000 | 0x180000)));
else {
if (cpu.getCPL() > cpu.eflagsIOPrivilegeLevel)
reg0 = ((cpu.getEFlags() & 0x23200) | (reg0 & ~(0x23200 | 0x180000)));
else
reg0 = ((cpu.getEFlags() & 0x23000) | (reg0 & ~(0x23000 | 0x180000)));
}
} break;
case POPF_O16_A16:
case POPF_O16_A32: {
if (cpu.ss.getDefaultSizeFlag()) {
reg0 = 0xffff & cpu.ss.getWord(cpu.esp);
cpu.esp += 2;
} else {
reg0 = 0xffff & cpu.ss.getWord(0xffff & cpu.esp);
cpu.esp = (cpu.esp & ~0xffff) | ((cpu.esp + 2) & 0xffff);
}
if (cpu.getCPL() != 0)
if (cpu.getCPL() > cpu.eflagsIOPrivilegeLevel)
reg0 = ((cpu.getEFlags() & 0x3200) | (reg0 & ~0x3200));
else
reg0 = ((cpu.getEFlags() & 0x3000) | (reg0 & ~0x3000));
} break;
case PUSHAD_A32:
if (cpu.ss.getDefaultSizeFlag())
pushad_a32();
else
pushad_a16();
break;
case PUSHAD_A16:
if (cpu.ss.getDefaultSizeFlag())
pusha_a32();
else
pusha_a16();
break;
case POPA_A32:
case POPA_A16: {
if (cpu.ss.getDefaultSizeFlag())
throw new IllegalStateException("need popa_a32");
else
popa_a16();
} break;
case POPAD_A32:
case POPAD_A16: {
if (cpu.ss.getDefaultSizeFlag())
popad_a32();
else
popad_a16();
} break;
case CMPSB_A32: cmpsb_a32(seg0); break;
case CMPSW_A32: cmpsw_a32(seg0); break;
case CMPSD_A32: cmpsd_a32(seg0); break;
case REPE_CMPSB_A16: repe_cmpsb_a16(seg0); break;
case REPE_CMPSB_A32: repe_cmpsb_a32(seg0); break;
case REPE_CMPSW_A32: repe_cmpsw_a32(seg0); break;
case REPE_CMPSD_A32: repe_cmpsd_a32(seg0); break;
case REPNE_CMPSB_A32: repne_cmpsb_a32(seg0); break;
case REPNE_CMPSW_A32: repne_cmpsw_a32(seg0); break;
case REPNE_CMPSD_A32: repne_cmpsd_a32(seg0); break;
case INSB_A32: insb_a32(reg0); break;
case INSW_A32: insw_a32(reg0); break;
case INSD_A32: insd_a32(reg0); break;
case REP_INSB_A32: rep_insb_a32(reg0); break;
case REP_INSW_A32: rep_insw_a32(reg0); break;
case REP_INSD_A32: rep_insd_a32(reg0); break;
case LODSB_A16: lodsb_a16(seg0); break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -