⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 virtual8086modeublock.java

📁 JPC: x86 PC Hardware Emulator. 牛津大学开发的一个纯JAVA的x86系统结构硬件模拟器。
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
		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 + -