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

📄 virtual8086modeublock.java

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

	    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 + -