📄 virtual8086modeublock.java
字号:
case LOAD_SEG_ES: seg0 = cpu.es; break;
case LOAD_SEG_CS: seg0 = cpu.cs; break;
case LOAD_SEG_SS: seg0 = cpu.ss; break;
case LOAD_SEG_DS: seg0 = cpu.ds; break;
case LOAD_SEG_FS: seg0 = cpu.fs; break;
case LOAD_SEG_GS: seg0 = cpu.gs; break;
case ADDR_EAX: addr0 += cpu.eax; break;
case ADDR_ECX: addr0 += cpu.ecx; break;
case ADDR_EDX: addr0 += cpu.edx; break;
case ADDR_EBX: addr0 += cpu.ebx; break;
case ADDR_ESP: addr0 += cpu.esp; break;
case ADDR_EBP: addr0 += cpu.ebp; break;
case ADDR_ESI: addr0 += cpu.esi; break;
case ADDR_EDI: addr0 += cpu.edi; break;
case ADDR_AX: addr0 += ((short)cpu.eax); break;
case ADDR_CX: addr0 += ((short)cpu.ecx); break;
case ADDR_DX: addr0 += ((short)cpu.edx); break;
case ADDR_BX: addr0 += ((short)cpu.ebx); break;
case ADDR_SP: addr0 += ((short)cpu.esp); break;
case ADDR_BP: addr0 += ((short)cpu.ebp); break;
case ADDR_SI: addr0 += ((short)cpu.esi); break;
case ADDR_DI: addr0 += ((short)cpu.edi); break;
case ADDR_2EAX: addr0 += (cpu.eax << 1); break;
case ADDR_2ECX: addr0 += (cpu.ecx << 1); break;
case ADDR_2EDX: addr0 += (cpu.edx << 1); break;
case ADDR_2EBX: addr0 += (cpu.ebx << 1); break;
case ADDR_2ESP: addr0 += (cpu.esp << 1); break;
case ADDR_2EBP: addr0 += (cpu.ebp << 1); break;
case ADDR_2ESI: addr0 += (cpu.esi << 1); break;
case ADDR_2EDI: addr0 += (cpu.edi << 1); break;
case ADDR_4EAX: addr0 += (cpu.eax << 2); break;
case ADDR_4ECX: addr0 += (cpu.ecx << 2); break;
case ADDR_4EDX: addr0 += (cpu.edx << 2); break;
case ADDR_4EBX: addr0 += (cpu.ebx << 2); break;
case ADDR_4ESP: addr0 += (cpu.esp << 2); break;
case ADDR_4EBP: addr0 += (cpu.ebp << 2); break;
case ADDR_4ESI: addr0 += (cpu.esi << 2); break;
case ADDR_4EDI: addr0 += (cpu.edi << 2); break;
case ADDR_8EAX: addr0 += (cpu.eax << 3); break;
case ADDR_8ECX: addr0 += (cpu.ecx << 3); break;
case ADDR_8EDX: addr0 += (cpu.edx << 3); break;
case ADDR_8EBX: addr0 += (cpu.ebx << 3); break;
case ADDR_8ESP: addr0 += (cpu.esp << 3); break;
case ADDR_8EBP: addr0 += (cpu.ebp << 3); break;
case ADDR_8ESI: addr0 += (cpu.esi << 3); break;
case ADDR_8EDI: addr0 += (cpu.edi << 3); break;
case ADDR_IB: addr0 += ((byte)microcodes[position++]); break;
case ADDR_IW: addr0 += ((short)microcodes[position++]); break;
case ADDR_ID: addr0 += microcodes[position++]; break;
case ADDR_MASK16: addr0 &= 0xffff; break;
case ADDR_uAL: addr0 += 0xff & cpu.eax; break;
case LOAD0_ADDR: reg0 = addr0; break;
case LOAD0_MEM_BYTE: reg0 = 0xff & seg0.getByte(addr0); break;
case LOAD0_MEM_WORD: reg0 = 0xffff & seg0.getWord(addr0); break;
case LOAD0_MEM_DWORD: reg0 = seg0.getDoubleWord(addr0); break;
case LOAD0_MEM_QWORD: reg0l = seg0.getQuadWord(addr0); break;
case LOAD1_MEM_BYTE: reg1 = 0xff & seg0.getByte(addr0); break;
case LOAD1_MEM_WORD: reg1 = 0xffff & seg0.getWord(addr0); break;
case LOAD1_MEM_DWORD: reg1 = seg0.getDoubleWord(addr0); break;
case STORE0_MEM_BYTE: seg0.setByte(addr0, (byte)reg0); break;
case STORE0_MEM_WORD: seg0.setWord(addr0, (short)reg0); break;
case STORE0_MEM_DWORD: seg0.setDoubleWord(addr0, reg0); break;
case STORE0_MEM_QWORD: seg0.setQuadWord(addr0, reg0); break;
case STORE1_MEM_BYTE: seg0.setByte(addr0, (byte)reg1); break;
case STORE1_MEM_WORD: seg0.setWord(addr0, (short)reg1); break;
case STORE1_MEM_DWORD: seg0.setDoubleWord(addr0, reg1); break;
case JUMP_FAR_O16: jump_far_o16(reg0, reg1); break;
case JUMP_FAR_O32: jump_far_o32(reg0, reg1); break;
case JUMP_ABS_O16: cpu.eip = reg0; break;
case CALL_FAR_O16_A16: call_far_o16_a16(reg0, reg1); break;
case CALL_FAR_O16_A32: call_far_o16_a32(reg0, reg1); break;
case CALL_ABS_O16_A16: call_abs_o16_a16(reg0); break;
case JUMP_O8: jump_o8((byte)reg0); break;
case JUMP_O16: jump_o16((short)reg0); break;
case JUMP_O32: jump_o32(reg0); break;
case INT_O16_A16: int_o16_a16(reg0); break;
// case INT3_O16_A16: int3_o16_a16(); break;
case IRET_O16_A16: reg0 = iret_o16_a16(); break; //returns flags
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 XOR: reg0 ^= reg1; break;
case AND: reg0 &= reg1; break;
case NOT: reg0 = ~reg0; break;
case SUB: reg2 = reg0; reg0 = reg2 - reg1; break;
case SBB: reg2 = reg0; reg0 = reg2 - (reg1 + (cpu.getCarryFlag() ? 1 : 0)); break;
case ADD: reg2 = reg0; reg0 = reg2 + reg1; break;
case ADC: reg2 = reg0; reg0 = reg2 + reg1 + (cpu.getCarryFlag() ? 1 : 0); break;
case NEG: reg0 = -reg0; break;
case MUL_O8: mul_o8(reg0); break;
case MUL_O16: mul_o16(reg0); break;
case MUL_O32: mul_o32(reg0); break;
case IMULA_O8: imula_o8((byte)reg0); break;
case IMULA_O16: imula_o16((short)reg0); break;
case IMULA_O32: imula_o32(reg0); break;
case IMUL_O16: reg0 = imul_o16((short)reg0, (short)reg1); break;
case IMUL_O32: reg0 = imul_o32(reg0, reg1); break;
case DIV_O8: div_o8(reg0); break;
case DIV_O16: div_o16(reg0); break;
case DIV_O32: div_o32(reg0); break;
case IDIV_O8: idiv_o8((byte)reg0); break;
case IDIV_O16: idiv_o16((short)reg0); break;
case IDIV_O32: idiv_o32(reg0); break;
case BSF: reg0 = bsf(reg1, reg0); break;
case BSR: reg0 = bsr(reg1, reg0); break;
case BT_MEM: bt_mem(reg1, seg0, addr0); break;
case BTS_MEM: bts_mem(reg1, seg0, addr0); break;
case BTR_MEM: btr_mem(reg1, seg0, addr0); break;
case BTC_MEM: btc_mem(reg1, seg0, addr0); break;
case BT_O32: reg1 &= 0x1f; cpu.setCarryFlag(reg0, reg1, Processor.CY_NTH_BIT_SET); break;
case BT_O16: reg1 &= 0xf; cpu.setCarryFlag(reg0, reg1, Processor.CY_NTH_BIT_SET); break;
case BTS_O32: reg1 &= 0x1f; cpu.setCarryFlag(reg0, reg1, Processor.CY_NTH_BIT_SET); reg0 |= (1 << reg1); break;
case BTS_O16: reg1 &= 0xf; cpu.setCarryFlag(reg0, reg1, Processor.CY_NTH_BIT_SET); reg0 |= (1 << reg1); break;
case BTR_O32: reg1 &= 0x1f; cpu.setCarryFlag(reg0, reg1, Processor.CY_NTH_BIT_SET); reg0 &= ~(1 << reg1); break;
case BTR_O16: reg1 &= 0xf; cpu.setCarryFlag(reg0, reg1, Processor.CY_NTH_BIT_SET); reg0 &= ~(1 << reg1); break;
case BTC_O32: reg1 &= 0x1f; cpu.setCarryFlag(reg0, reg1, Processor.CY_NTH_BIT_SET); reg0 ^= (1 << reg1); break;
case BTC_O16: reg1 &= 0xf; cpu.setCarryFlag(reg0, reg1, Processor.CY_NTH_BIT_SET); reg0 ^= (1 << reg1); break;
case ROL_O8: reg1 &= 0x7; reg0 = (reg0 << reg1) | (reg0 >>> (8 - reg1)); break;
case ROL_O16: reg1 &= 0xf; reg0 = (reg0 << reg1) | (reg0 >>> (16 - reg1)); break;
case ROL_O32: reg1 &= 0x1f; reg0 = (reg0 << reg1) | (reg0 >>> (32 - reg1)); break;
case ROR_O8: reg1 &= 0x7; reg0 = (reg0 >>> reg1) | (reg0 << (8 - reg1)); break;
case ROR_O16: reg1 &= 0xf; reg0 = (reg0 >>> reg1) | (reg0 << (16 - reg1)); break;
case ROR_O32: reg1 &= 0x1f; reg0 = (reg0 >>> reg1) | (reg0 << (32 - reg1)); break;
case RCL_O8: reg1 &= 0x1f; reg1 %= 9; reg0 |= (cpu.getCarryFlag() ? 0x100 : 0);
reg0 = (reg0 << reg1) | (reg0 >>> (9 - reg1)); break;
case RCL_O16: reg1 &= 0x1f; reg1 %= 17; reg0 |= (cpu.getCarryFlag() ? 0x10000 : 0);
reg0 = (reg0 << reg1) | (reg0 >>> (17 - reg1)); break;
case RCL_O32: reg1 &= 0x1f; reg0l = (0xffffffffl & reg0) | (cpu.getCarryFlag() ? 0x100000000l : 0);
reg0 = (int)(reg0l = (reg0l << reg1) | (reg0l >>> (33 - reg1))); break;
case RCR_O8: reg1 &= 0x1f; reg1 %= 9; reg0 |= (cpu.getCarryFlag() ? 0x100 : 0);
reg0 = (reg0 >>> reg1) | (reg0 << (9 - reg1)); break;
case RCR_O16: reg1 &= 0x1f; reg1 %= 17; reg0 |= (cpu.getCarryFlag() ? 0x10000 : 0);
reg0 = (reg0 >>> reg1) | (reg0 << (17 - reg1)); break;
case RCR_O32: reg1 &= 0x1f; reg0l = (0xffffffffl & reg0) | (cpu.getCarryFlag() ? 0x100000000l : 0);
reg0 = (int)(reg0l = (reg0l >>> reg1) | (reg0l << (33 - reg1))); break;
case SHR: reg1 &= 0x1f; reg2 = reg0; reg0 >>>= reg1; break;
case SAR_O8: reg1 &= 0x1f; reg2 = reg0; reg0 = ((byte)reg0) >> reg1; break;
case SAR_O16: reg1 &= 0x1f; reg2 = reg0; reg0 = ((short)reg0) >> reg1; break;
case SAR_O32: reg1 &= 0x1f; reg2 = reg0; reg0 >>= reg1; break;
case SHLD_O16: {
int i = reg0; reg2 &= 0x1f;
reg0 = (reg0 << reg2) | (reg1 >>> (16 - reg2));
reg1 = reg2; reg2 = i;
} break;
case SHLD_O32: {
int i = reg0; reg2 &= 0x1f;
if (reg2 != 0)
reg0 = (reg0 << reg2) | (reg1 >>> (32 - reg2));
reg1 = reg2; reg2 = i;
} break;
case SHRD_O16: {
int i = reg0; reg2 &= 0x1f;
reg0 = (reg0 >>> reg2) | (reg1 << (16 - reg2));
reg1 = reg2; reg2 = i;
} break;
case SHRD_O32: {
int i = reg0; reg2 &= 0x1f;
if (reg2 != 0)
reg0 = (reg0 >>> reg2) | (reg1 << (32 - reg2));
reg1 = reg2; reg2 = i;
} break;
case CWD: if ((cpu.eax & 0x8000) == 0) cpu.edx &= 0xffff0000; else cpu.edx |= 0x0000ffff; break;
case CDQ: if ((cpu.eax & 0x80000000) == 0) cpu.edx = 0; else cpu.edx = -1; break;
case AAA: aaa(); break;
case AAD: aad(reg0); break;
case AAM: reg0 = aam(reg0); break;
case AAS: aas(); break;
case DAA: daa(); break;
case DAS: das(); break;
case BOUND_O16: {
short lower = (short)reg0;
short upper = (short)(reg0 >> 16);
short index = (short)reg1;
if ((index < lower) || (index > (upper + 2)))
throw exceptionBR;
} break;
case LAHF: lahf(); break;
case SAHF: sahf(); break;
case CLC: cpu.setCarryFlag(false); break;
case STC: cpu.setCarryFlag(true); break;
case CLI: {
if (cpu.eflagsIOPrivilegeLevel == 3)
cpu.eflagsInterruptEnable = cpu.eflagsInterruptEnableSoon = false;
else
if ((cpu.getCR4() & Processor.CR4_VIRTUAL8086_MODE_EXTENSIONS) != 0)
cpu.eflagsVirtualInterrupt = false;
else
throw exceptionGP;
} break;
case STI: {
if (cpu.eflagsIOPrivilegeLevel == 3)
cpu.eflagsInterruptEnable = cpu.eflagsInterruptEnableSoon = true;
else
if (!cpu.eflagsVirtualInterruptPending && ((cpu.getCR4() & Processor.CR4_VIRTUAL8086_MODE_EXTENSIONS) != 0))
cpu.eflagsVirtualInterrupt = true;
else
throw exceptionGP;
} break;
case CLD: cpu.eflagsDirection = false; break;
case STD: cpu.eflagsDirection = true; break;
case CMC: cpu.setCarryFlag(cpu.getCarryFlag() ^ true); break;
case CALL_O16_A16: call_o16_a16((short)reg0); break;
case CALL_O32_A16: call_o32_a16(reg0); break;
case RET_O16_A16: ret_o16_a16(); break;
case RET_O32_A16: ret_o32_a16(); break;
case RET_IW_O16_A16: ret_iw_o16_a16((short)reg0); break;
case RET_FAR_O16_A16: ret_far_o16_a16(); break;
case RET_FAR_IW_O16_A16: ret_far_iw_o16_a16((short)reg0); break;
case ENTER_O16_A16: enter_o16_a16(reg0, reg1); break;
case LEAVE_O16_A16: leave_o16_a16(); break;
case PUSH_O16_A16: push_o16_a16((short)reg0); break;
case PUSH_O32_A16: push_o32_a16(reg0); break;
case PUSHF_O16_A16:
if (cpu.eflagsIOPrivilegeLevel < 3)
throw exceptionGP;
push_o16_a16((short)reg0);
break;
case PUSHF_O32_A16: push_o32_a16(~0x30000 & reg0); break;
case POP_O16_A16:
reg1 = (cpu.esp & ~0xffff) | ((cpu.esp + 2) & 0xffff);
if ((microcodes[position] == STORE0_SS))
cpu.eflagsInterruptEnable = false;
reg0 = cpu.ss.getWord(cpu.esp & 0xffff);
break;
case POP_O32_A16:
reg1 = (cpu.esp & ~0xffff) | ((cpu.esp + 4) & 0xffff);
if ((microcodes[position] == STORE0_SS))
cpu.eflagsInterruptEnable = false;
reg0 = cpu.ss.getDoubleWord(cpu.esp & 0xffff);
break;
case POPF_O16_A16:
if (cpu.eflagsIOPrivilegeLevel < 3)
throw exceptionGP;
reg0 = cpu.ss.getWord(cpu.esp & 0xffff);
cpu.esp = (cpu.esp & ~0xffff) | ((cpu.esp + 2) & 0xffff);
break;
case POPF_O32_A16:
if (cpu.eflagsIOPrivilegeLevel < 3)
throw exceptionGP;
reg0 = cpu.ss.getDoubleWord(cpu.esp & 0xffff);
cpu.esp = (cpu.esp & ~0xffff) | ((cpu.esp + 4) & 0xffff);
break;
case PUSHA_A16: pusha_a16(); break;
case PUSHAD_A16: pushad_a16(); break;
case POPA_A16: popa_a16(); break;
case POPAD_A16: popad_a16(); break;
case SIGN_EXTEND_8_16: reg0 = 0xffff & ((byte)reg0); break;
case SIGN_EXTEND_8_32: reg0 = (byte)reg0; break;
case SIGN_EXTEND_16_32: reg0 = (short)reg0; break;
case CMPSB_A16: cmpsb_a16(seg0); break;
case CMPSW_A16: cmpsw_a16(seg0); break;
case CMPSD_A16: cmpsd_a16(seg0); break;
case REPE_CMPSB_A16: repe_cmpsb_a16(seg0); break;
case REPE_CMPSW_A16: repe_cmpsw_a16(seg0); break;
case REPE_CMPSD_A16: repe_cmpsd_a16(seg0); break;
case INSB_A16: insb_a16(reg0); break;
case INSW_A16: insw_a16(reg0); break;
case INSD_A16: insd_a16(reg0); break;
case REP_INSB_A16: rep_insb_a16(reg0); break;
case REP_INSW_A16: rep_insw_a16(reg0); break;
case REP_INSD_A16: rep_insd_a16(reg0); break;
case LODSB_A16: lodsb_a16(seg0); break;
case LODSW_A16: lodsw_a16(seg0); break;
case LODSD_A16: lodsd_a16(seg0); break;
case REP_LODSB_A16: rep_lodsb_a16(seg0); break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -