📄 virtual8086modeublock.java
字号:
case STORE0_AL: cpu.eax = (cpu.eax & ~0xff) | (reg0 & 0xff); break; //814558
case LOAD0_BX: reg0 = cpu.ebx & 0xffff; break; //813659
case LOAD1_IB: reg1 = microcodes[position++] & 0xff; break; //809491
case LOAD1_IW: reg1 = microcodes[position++] & 0xffff; break; //805651
case CALL_O16_A16: call_o16_a16((short)reg0); break; //791837
case STORE0_CX: cpu.ecx = (cpu.ecx & ~0xffff) | (reg0 & 0xffff); break; //775713
case LOAD0_CX: reg0 = cpu.ecx & 0xffff; break; //773832
case LOAD0_BP: reg0 = cpu.ebp & 0xffff; break; //763561
case RET_O16_A16: ret_o16_a16(); break; //720729
case STORE0_SP: cpu.esp = (cpu.esp & ~0xffff) | (reg0 & 0xffff); break; //681228
case LOAD0_AL: reg0 = cpu.eax & 0xff; break; //680163
case ADD_O16_FLAGS: add_o16_flags(reg0, reg2, reg1); break; //667848
case SUB_O16_FLAGS: sub_o16_flags(reg0, reg2, reg1); break; //664323
case STORE0_DS: cpu.ds.setSelector(0xffff & reg0); break; //654678
case LOAD0_DX: reg0 = cpu.edx & 0xffff; break; //620350
case BITWISE_FLAGS_O8: bitwise_flags((byte)reg0); break; //606068
case STORE0_SI: cpu.esi = (cpu.esi & ~0xffff) | (reg0 & 0xffff); break; //601955
case XOR: reg0 ^= reg1; break; //552649
case STORE0_DX: cpu.edx = (cpu.edx & ~0xffff) | (reg0 & 0xffff); break; //516299
case ADDR_SI: addr0 += ((short)cpu.esi); break; //514379
case SUB_O8_FLAGS: sub_o8_flags(reg0, reg2, reg1); break; //500672
case JZ_O8: jz_o8((byte)reg0); break; //499451
case LOAD0_AH: reg0 = (cpu.eax >> 8) & 0xff; break; //497132
case STORE0_DI: cpu.edi = (cpu.edi & ~0xffff) | (reg0 & 0xffff); break; //490840
case LOAD0_SI: reg0 = cpu.esi & 0xffff; break; //473018
case ADDR_IW: addr0 += ((short)microcodes[position++]); break; //449628
case BITWISE_FLAGS_O16: bitwise_flags((short)reg0); break; //426086
case LOAD0_DS: reg0 = 0xffff & cpu.ds.getSelector(); break; //425449
case LOAD1_MEM_WORD: reg1 = 0xffff & seg0.getWord(addr0); break; //417691
case LOAD0_DI: reg0 = cpu.edi & 0xffff; break; //402655
case INC: reg0++; break; //377084
case STORE0_ES: cpu.es.setSelector(0xffff & reg0); break; //374908
case INC_O16_FLAGS: inc_flags((short)reg0); break; //369608
case AND: reg0 &= reg1; break; //364104
case STORE0_BH: cpu.ebx = (cpu.ebx & ~0xff00) | ((reg0 << 8) & 0xff00); break; //363053
case LOAD_SEG_ES: seg0 = cpu.es; break; //345778
case STORE0_AH: cpu.eax = (cpu.eax & ~0xff00) | ((reg0 << 8) & 0xff00); break; //341158
case LOAD1_CX: reg1 = cpu.ecx & 0xffff; break; //338002
case ADD_O8_FLAGS: add_o8_flags(reg0, reg2, reg1); break; //336258
case LOAD1_AX: reg1 = cpu.eax & 0xffff; break; //330347
case LOAD1_BH: reg1 = (cpu.ebx >> 8) & 0xff; break; //322337
case LOAD0_BH: reg0 = (cpu.ebx >> 8) & 0xff; break; //295205
case STORE0_MEM_BYTE: seg0.setByte(addr0, (byte)reg0); break; //259410
case LOAD0_ES: reg0 = 0xffff & cpu.es.getSelector(); break; //239972
case LOAD1_AH: reg1 = (cpu.eax >> 8) & 0xff; break; //233962
case ADC: reg2 = reg0; reg0 = reg2 + reg1 + (cpu.getCarryFlag() ? 1 : 0); break; //219410
case JUMP_O8: jump_o8((byte)reg0); break; //189393
case JNC_O8: jnc_o8((byte)reg0); break; //183798
case JC_O8: jc_o8((byte)reg0); break; //174366
case LOAD1_AL: reg1 = cpu.eax & 0xff; break; //169225
case ADC_O16_FLAGS: adc_o16_flags(reg0, reg2, reg1); break; //164196
case JUMP_O16: jump_o16((short)reg0); break; //159616
case LOAD_SEG_CS: seg0 = cpu.cs; break; //151531
case DEC: reg0--; break; //150476
case DEC_O16_FLAGS: dec_flags((short)reg0); break; //143631
case LOAD0_ADDR: reg0 = addr0; break; //131311
case SHL: reg1 &= 0x1f; reg2 = reg0; reg0 <<= reg1; break;
case STORE0_BL: cpu.ebx = (cpu.ebx & ~0xff) | (reg0 & 0xff); break;
case SHL_O16_FLAGS: shl_flags((short)reg0, (short)reg2, reg1); break;
case LOAD1_BX: reg1 = cpu.ebx & 0xffff; break;
case OR: reg0 |= reg1; break;
case STORE1_ES: cpu.es.setSelector(0xffff & reg1); break;
case STORE1_AX: cpu.eax = (cpu.eax & ~0xffff) | (reg1 & 0xffff); break;
case LOAD1_DI: reg1 = cpu.edi & 0xffff; break;
case LOAD1_MEM_BYTE: reg1 = 0xff & seg0.getByte(addr0); break;
case JCXZ: jcxz((byte)reg0); break;
case LOAD1_SI: reg1 = cpu.esi & 0xffff; break;
case STORE1_DS: cpu.ds.setSelector(0xffff & reg1); break;
case LOAD1_CL: reg1 = cpu.ecx & 0xff; break;
case JUMP_ABS_O16: cpu.eip = reg0; break;
case STORE0_CL: cpu.ecx = (cpu.ecx & ~0xff) | (reg0 & 0xff); break;
case ADDR_DI: addr0 += ((short)cpu.edi); break;
case SHR: reg2 = reg0; reg0 >>>= reg1; break;
case SHR_O16_FLAGS: shr_flags((short)reg0, reg2, reg1); break;
case JA_O8: ja_o8((byte)reg0); break;
case JNA_O8: jna_o8((byte)reg0); break;
default:
{
//copy local variables to instance storage
transferSeg0 = seg0;
transferAddr0 = addr0;
transferReg0 = reg0;
transferReg1 = reg1;
transferReg2 = reg2;
transferReg0l = reg0l;
transferEipUpdated = eipUpdated;
transferPosition = position - 1;
transferFReg0 = freg0;
transferFReg1 = freg1;
try {
fullExecute(cpu);
} finally {
seg0 = transferSeg0;
addr0 = transferAddr0;
reg0 = transferReg0;
reg1 = transferReg1;
reg2 = transferReg2;
reg0l = transferReg0l;
freg0 = transferFReg0;
freg1 = transferFReg1;
eipUpdated = transferEipUpdated;
position = transferPosition;
}
} break;
}
}
}
catch (ProcessorException e)
{
if (e.getVector() == -1)
throw new IllegalStateException("Execute Failed");
int nextPosition = position - 1; //this makes position point at the microcode that just barfed
if (eipUpdated)
cpu.eip -= cumulativeX86Length[nextPosition]; // undo the eipUpdate
if (!e.pointsToSelf()) {
cpu.eip += cumulativeX86Length[nextPosition];
} else {
for (int selfPosition = nextPosition; selfPosition >= 0; selfPosition--) {
if (cumulativeX86Length[selfPosition] != cumulativeX86Length[nextPosition]) {
cpu.eip += cumulativeX86Length[selfPosition];
break;
}
}
}
cpu.handleVirtual8086ModeException(e.getVector(), e.hasErrorCode(), e.getErrorCode());
}
return Math.max(executeCount, 0);
}
private final void jo_o8(byte offset)
{
if (cpu.getOverflowFlag()) jump_o8(offset);
}
private final void jno_o8(byte offset)
{
if (!cpu.getOverflowFlag()) jump_o8(offset);
}
private final void jc_o8(byte offset)
{
if (cpu.getCarryFlag()) jump_o8(offset);
}
private final void jnc_o8(byte offset)
{
if (!cpu.getCarryFlag()) jump_o8(offset);
}
private final void jz_o8(byte offset)
{
if (cpu.getZeroFlag()) jump_o8(offset);
}
private final void jnz_o8(byte offset)
{
if (!cpu.getZeroFlag()) jump_o8(offset);
}
private final void jna_o8(byte offset)
{
if (cpu.getCarryFlag() || cpu.getZeroFlag()) jump_o8(offset);
}
private final void ja_o8(byte offset)
{
if ((!cpu.getCarryFlag()) && (!cpu.getZeroFlag())) jump_o8(offset);
}
private final void js_o8(byte offset)
{
if (cpu.getSignFlag()) jump_o8(offset);
}
private final void jns_o8(byte offset)
{
if (!cpu.getSignFlag()) jump_o8(offset);
}
private final void jp_o8(byte offset)
{
if (cpu.getParityFlag()) jump_o8(offset);
}
private final void jnp_o8(byte offset)
{
if (!cpu.getParityFlag()) jump_o8(offset);
}
private final void jl_o8(byte offset)
{
if (cpu.getSignFlag() != cpu.getOverflowFlag()) jump_o8(offset);
}
private final void jnl_o8(byte offset)
{
if (cpu.getSignFlag() == cpu.getOverflowFlag()) jump_o8(offset);
}
private final void jng_o8(byte offset)
{
if (cpu.getZeroFlag() || (cpu.getSignFlag() != cpu.getOverflowFlag())) jump_o8(offset);
}
private final void jg_o8(byte offset)
{
if ((!cpu.getZeroFlag()) && (cpu.getSignFlag() == cpu.getOverflowFlag())) jump_o8(offset);
}
private final void jo_o16(short offset)
{
if (cpu.getOverflowFlag()) jump_o16(offset);
}
private final void jno_o16(short offset)
{
if (!cpu.getOverflowFlag()) jump_o16(offset);
}
private final void jc_o16(short offset)
{
if (cpu.getCarryFlag()) jump_o16(offset);
}
private final void jnc_o16(short offset)
{
if (!cpu.getCarryFlag()) jump_o16(offset);
}
private final void jz_o16(short offset)
{
if (cpu.getZeroFlag()) jump_o16(offset);
}
private final void jnz_o16(short offset)
{
if (!cpu.getZeroFlag()) jump_o16(offset);
}
private final void jna_o16(short offset)
{
if (cpu.getCarryFlag() || cpu.getZeroFlag()) jump_o16(offset);
}
private final void ja_o16(short offset)
{
if ((!cpu.getCarryFlag()) && (!cpu.getZeroFlag())) jump_o16(offset);
}
private final void js_o16(short offset)
{
if (cpu.getSignFlag()) jump_o16(offset);
}
private final void jns_o16(short offset)
{
if (!cpu.getSignFlag()) jump_o16(offset);
}
private final void jp_o16(short offset)
{
if (cpu.getParityFlag()) jump_o16(offset);
}
private final void jnp_o16(short offset)
{
if (!cpu.getParityFlag()) jump_o16(offset);
}
private final void jl_o16(short offset)
{
if (cpu.getSignFlag() != cpu.getOverflowFlag()) jump_o16(offset);
}
private final void jnl_o16(short offset)
{
if (cpu.getSignFlag() == cpu.getOverflowFlag()) jump_o16(offset);
}
private final void jng_o16(short offset)
{
if (cpu.getZeroFlag() || (cpu.getSignFlag() != cpu.getOverflowFlag())) jump_o16(offset);
}
private final void jg_o16(short offset)
{
if ((!cpu.getZeroFlag()) && (cpu.getSignFlag() == cpu.getOverflowFlag())) jump_o16(offset);
}
private final void jo_o32(int offset)
{
if (cpu.getOverflowFlag()) jump_o32(offset);
}
private final void jno_o32(int offset)
{
if (!cpu.getOverflowFlag()) jump_o32(offset);
}
private final void jc_o32(int offset)
{
if (cpu.getCarryFlag()) jump_o32(offset);
}
private final void jnc_o32(int offset)
{
if (!cpu.getCarryFlag()) jump_o32(offset);
}
private final void jz_o32(int offset)
{
if (cpu.getZeroFlag()) jump_o32(offset);
}
private final void jnz_o32(int offset)
{
if (!cpu.getZeroFlag()) jump_o32(offset);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -