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

📄 protectedmodeublock.java

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