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

📄 virtual8086modeublock.java

📁 JPC: x86 PC Hardware Emulator. 牛津大学开发的一个纯JAVA的x86系统结构硬件模拟器。
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
	    case REP_LODSW_A16: rep_lodsw_a16(seg0); break;
	    case REP_LODSD_A16: rep_lodsd_a16(seg0); break;
	    case LODSB_A32: lodsb_a32(seg0); break;
	    case LODSW_A32: lodsw_a32(seg0); break;
	    case LODSD_A32: lodsd_a32(seg0); break;
	    case REP_LODSB_A32: rep_lodsb_a32(seg0); break;
	    case REP_LODSW_A32: rep_lodsw_a32(seg0); break;
	    case REP_LODSD_A32: rep_lodsd_a32(seg0); break;

	    case MOVSB_A16: movsb_a16(seg0); break;
	    case MOVSW_A16: movsw_a16(seg0); break;
	    case MOVSD_A16: movsd_a16(seg0); break;
	    case REP_MOVSB_A16: rep_movsb_a16(seg0); break;
	    case REP_MOVSW_A16: rep_movsw_a16(seg0); break;
	    case REP_MOVSD_A16: rep_movsd_a16(seg0); break;
	    case MOVSB_A32: movsb_a32(seg0); break;
	    case MOVSW_A32: movsw_a32(seg0); break;
	    case MOVSD_A32: movsd_a32(seg0); break;
	    case REP_MOVSB_A32: rep_movsb_a32(seg0); break;
	    case REP_MOVSW_A32: rep_movsw_a32(seg0); break;
	    case REP_MOVSD_A32: rep_movsd_a32(seg0); break;

	    case OUTSB_A16: outsb_a16(reg0, seg0); break;
	    case OUTSW_A16: outsw_a16(reg0, seg0); break;
	    case OUTSD_A16: outsd_a16(reg0, seg0); break;
	    case REP_OUTSB_A16: rep_outsb_a16(reg0, seg0); break;
	    case REP_OUTSW_A16: rep_outsw_a16(reg0, seg0); break;
	    case REP_OUTSD_A16: rep_outsd_a16(reg0, seg0); break;

	    case SCASB_A16: scasb_a16(reg0); break;
	    case SCASW_A16: scasw_a16(reg0); break;
	    case SCASD_A16: scasd_a16(reg0); break;
	    case REPE_SCASB_A16: repe_scasb_a16(reg0); break;
	    case REPE_SCASW_A16: repe_scasw_a16(reg0); break;
	    case REPE_SCASD_A16: repe_scasd_a16(reg0); break;
	    case REPNE_SCASB_A16: repne_scasb_a16(reg0); break;
	    case REPNE_SCASW_A16: repne_scasw_a16(reg0); break;
	    case REPNE_SCASD_A16: repne_scasd_a16(reg0); break;

	    case STOSB_A16: stosb_a16(reg0); break;
	    case STOSW_A16: stosw_a16(reg0); break;
	    case STOSD_A16: stosd_a16(reg0); break;
	    case REP_STOSB_A16: rep_stosb_a16(reg0); break;
	    case REP_STOSW_A16: rep_stosw_a16(reg0); break;
	    case REP_STOSD_A16: rep_stosd_a16(reg0); break;
	    case STOSB_A32: stosb_a32(reg0); break;
	    case STOSW_A32: stosw_a32(reg0); break;
	    case STOSD_A32: stosd_a32(reg0); break;
	    case REP_STOSB_A32: rep_stosb_a32(reg0); break;
	    case REP_STOSW_A32: rep_stosw_a32(reg0); break;
	    case REP_STOSD_A32: rep_stosd_a32(reg0); break;

	    case LOOP_ECX: cpu.ecx--; if (cpu.ecx != 0) jump_o8((byte)reg0); break;
	    case LOOP_CX: cpu.ecx = (cpu.ecx & ~0xffff) | ((cpu.ecx - 1) & 0xffff); if ((0xffff & cpu.ecx) != 0) jump_o8((byte)reg0); break;
	    case LOOPZ_ECX: cpu.ecx--; if ((cpu.ecx != 0) && cpu.getZeroFlag()) jump_o8((byte)reg0); break;
	    case LOOPZ_CX: cpu.ecx = (cpu.ecx & ~0xffff) | ((cpu.ecx - 1) & 0xffff); if (((0xffff & cpu.ecx) != 0) && cpu.getZeroFlag()) jump_o8((byte)reg0); break;
	    case LOOPNZ_ECX: cpu.ecx--; if ((cpu.ecx != 0) && !cpu.getZeroFlag()) jump_o8((byte)reg0); break;
	    case LOOPNZ_CX: cpu.ecx = (cpu.ecx & ~0xffff) | ((cpu.ecx - 1) & 0xffff); if (((0xffff & cpu.ecx) != 0) && !cpu.getZeroFlag()) jump_o8((byte)reg0); break;

	    case JO_O8:  jo_o8((byte)reg0); break;
	    case JNO_O8: jno_o8((byte)reg0); break;
	    case JC_O8:  jc_o8((byte)reg0); break;
	    case JNC_O8: jnc_o8((byte)reg0); break;
	    case JZ_O8:  jz_o8((byte)reg0); break;
	    case JNZ_O8: jnz_o8((byte)reg0); break;
	    case JNA_O8: jna_o8((byte)reg0); break;
	    case JA_O8:  ja_o8((byte)reg0); break;
	    case JS_O8:  js_o8((byte)reg0); break;
	    case JNS_O8: jns_o8((byte)reg0); break;
	    case JP_O8:  jp_o8((byte)reg0); break;
	    case JNP_O8: jnp_o8((byte)reg0); break;
	    case JL_O8:  jl_o8((byte)reg0); break;
	    case JNL_O8: jnl_o8((byte)reg0); break;
	    case JNG_O8: jng_o8((byte)reg0); break;
	    case JG_O8:  jg_o8((byte)reg0); break;

	    case JO_O16:  jo_o16((short)reg0); break;
	    case JNO_O16: jno_o16((short)reg0); break;
	    case JC_O16:  jc_o16((short)reg0); break;
	    case JNC_O16: jnc_o16((short)reg0); break;
	    case JZ_O16:  jz_o16((short)reg0); break;
	    case JNZ_O16: jnz_o16((short)reg0); break;
	    case JNA_O16: jna_o16((short)reg0); break;
	    case JA_O16:  ja_o16((short)reg0); break;
	    case JS_O16:  js_o16((short)reg0); break;
	    case JNS_O16: jns_o16((short)reg0); break;
	    case JP_O16:  jp_o16((short)reg0); break;
	    case JNP_O16: jnp_o16((short)reg0); break;
	    case JL_O16:  jl_o16((short)reg0); break;
	    case JNL_O16: jnl_o16((short)reg0); break;
	    case JNG_O16: jng_o16((short)reg0); break;
	    case JG_O16:  jg_o16((short)reg0); break;

	    case JO_O32:  jo_o32(reg0); break;
	    case JNO_O32: jno_o32(reg0); break;
	    case JC_O32:  jc_o32(reg0); break;
	    case JNC_O32: jnc_o32(reg0); break;
	    case JZ_O32:  jz_o32(reg0); break;
	    case JNZ_O32: jnz_o32(reg0); break;
	    case JNA_O32: jna_o32(reg0); break;
	    case JA_O32:  ja_o32(reg0); break;
	    case JS_O32:  js_o32(reg0); break;
	    case JNS_O32: jns_o32(reg0); break;
	    case JP_O32:  jp_o32(reg0); break;
	    case JNP_O32: jnp_o32(reg0); break;
	    case JL_O32:  jl_o32(reg0); break;
	    case JNL_O32: jnl_o32(reg0); break;
	    case JNG_O32: jng_o32(reg0); break;
	    case JG_O32:  jg_o32(reg0); break;

	    case JCXZ: jcxz((byte)reg0); break;
	    case JECXZ: jecxz((byte)reg0); break;
		
	    case INC: reg0++; break;
	    case DEC: reg0--; break;

	    case FWAIT: fpu.checkExceptions(); break;
	    case HALT: throw exceptionGP;


// 	    case RDTSC: long tsc = cpu.getClockCount(); reg0 = (int)tsc; reg1 = (int)(tsc >>> 32); break;
// 	    case WRMSR: cpu.setMSR(reg0, (reg2 & 0xffffffffl) | ((reg1 & 0xffffffffl) << 32)); break;
// 	    case RDMSR: long msr = cpu.getMSR(reg0); reg0 = (int)msr; reg1 = (int)(msr >>> 32); 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: cpu.setCR0((cpu.getCR0() & ~0xf) | (reg0 & 0xf)); break;

// 	    case LGDT_O16: cpu.gdtr = cpu.createDescriptorTableSegment(reg1 & 0x00ffffff, reg0); break;
// 	    case LGDT_O32: cpu.gdtr = cpu.createDescriptorTableSegment(reg1, reg0); break;
// 	    case LIDT_O16: cpu.idtr = cpu.createDescriptorTableSegment(reg1 & 0x00ffffff, reg0); break;
// 	    case LIDT_O32: cpu.idtr = cpu.createDescriptorTableSegment(reg1, reg0); break;
 
	    case CPUID: cpuid(); break;

// 	    case CLTS: cpu.setCR3(cpu.getCR3() & ~0x4); break;

	    case BITWISE_FLAGS_O8: bitwise_flags((byte)reg0); break;
	    case BITWISE_FLAGS_O16: bitwise_flags((short)reg0); break;
	    case BITWISE_FLAGS_O32: bitwise_flags(reg0); break;

	    case SUB_O8_FLAGS:  sub_o8_flags(reg0, reg2, reg1); break;
	    case SUB_O16_FLAGS: sub_o16_flags(reg0, reg2, reg1); break;
	    case SUB_O32_FLAGS: sub_o32_flags(reg0l, reg2, reg1); break;

	    case REP_SUB_O8_FLAGS:  rep_sub_o8_flags(reg0, reg2, reg1); break;
	    case REP_SUB_O16_FLAGS: rep_sub_o16_flags(reg0, reg2, reg1); break;
	    case REP_SUB_O32_FLAGS: rep_sub_o32_flags(reg0, reg2, reg1); break;

	    case ADD_O8_FLAGS:  add_o8_flags(reg0, reg2, reg1); break;
	    case ADD_O16_FLAGS: add_o16_flags(reg0, reg2, reg1); break;
	    case ADD_O32_FLAGS: add_o32_flags(reg0l, reg2, reg1); break;

	    case ADC_O8_FLAGS:  adc_o8_flags(reg0, reg2, reg1); break;
	    case ADC_O16_FLAGS: adc_o16_flags(reg0, reg2, reg1); break;
	    case ADC_O32_FLAGS: adc_o32_flags(reg0l, reg2, reg1); break;

	    case SBB_O8_FLAGS:  sbb_o8_flags(reg0, reg2, reg1); break;
	    case SBB_O16_FLAGS: sbb_o16_flags(reg0, reg2, reg1); break;
	    case SBB_O32_FLAGS: sbb_o32_flags(reg0l, reg2, reg1); break;

	    case INC_O8_FLAGS:  inc_flags((byte)reg0); break;
	    case INC_O16_FLAGS: inc_flags((short)reg0); break;
	    case INC_O32_FLAGS: inc_flags(reg0); break;

	    case DEC_O8_FLAGS:  dec_flags((byte)reg0); break;
	    case DEC_O16_FLAGS: dec_flags((short)reg0); break;
	    case DEC_O32_FLAGS: dec_flags(reg0); break;

	    case SHL_O8_FLAGS: shl_flags((byte)reg0, (byte)reg2, reg1); break;
	    case SHL_O32_FLAGS: shl_flags(reg0, reg2, reg1); break;

	    case SHR_O8_FLAGS: shr_flags((byte)reg0, reg2, reg1); break;
	    case SHR_O16_FLAGS: shr_flags((short)reg0, reg2, reg1); break;
	    case SHR_O32_FLAGS: shr_flags(reg0, reg2, reg1); break;
      
	    case SAR_O8_FLAGS: sar_flags((byte)reg0, (byte)reg2, reg1); break;
	    case SAR_O16_FLAGS: sar_flags((short)reg0, (short)reg2, reg1); break;
	    case SAR_O32_FLAGS: sar_flags(reg0, reg2, reg1); break;

	    case RCL_O8_FLAGS:  rcl_o8_flags(reg0, reg1); break;
	    case RCL_O16_FLAGS: rcl_o16_flags(reg0, reg1); break;
	    case RCL_O32_FLAGS: rcl_o32_flags(reg0l, reg1); break;
    
	    case RCR_O8_FLAGS:  rcr_o8_flags(reg0, reg1); break;
	    case RCR_O16_FLAGS: rcr_o16_flags(reg0, reg1); break;
	    case RCR_O32_FLAGS: rcr_o32_flags(reg0l, reg1); break;
    
	    case ROL_O8_FLAGS:  rol_flags((byte)reg0, reg1); break;
	    case ROL_O16_FLAGS: rol_flags((short)reg0, reg1); break;
	    case ROL_O32_FLAGS: rol_flags(reg0, reg1); break;
    
	    case ROR_O8_FLAGS:  ror_flags((byte)reg0, reg1); break;
	    case ROR_O16_FLAGS: ror_flags((short)reg0, reg1); break;
	    case ROR_O32_FLAGS: ror_flags(reg0, reg1); break;

	    case NEG_O8_FLAGS:  neg_flags((byte)reg0); break;
	    case NEG_O16_FLAGS: neg_flags((short)reg0); break;
	    case NEG_O32_FLAGS: neg_flags(reg0); break;

	    case FLOAD0_ST0: 
		freg0 = fpu.ST(0); 
		validateOperand(freg0);
		break;
	    case FLOAD0_STN:
		freg0 = fpu.ST(microcodes[position++]); 
		validateOperand(freg0);
		break;
	    case FLOAD0_MEM_SINGLE: {
		//     0x7f800001 thru 0x7fbfffff // SNaN Singalling
		//     0x7fc00000 thru 0x7fffffff // QNaN Quiet
		//     0xff800001 thru 0xffbfffff // SNaN Signalling
		//     0xffc00000 thru 0xffffffff // QNaN Quiet
		int n = seg0.getDoubleWord(addr0);
		freg0 = Float.intBitsToFloat(n);
		if ((Double.isNaN(freg0)) && ((n & (1 << 22)) == 0))
		    fpu.setInvalidOperation();
		validateOperand(freg0);               
	    }   break;
	    case FLOAD0_MEM_DOUBLE: {
		long n = seg0.getQuadWord(addr0);
		freg0 = Double.longBitsToDouble(n);
		if ((Double.isNaN(freg0)) && ((n & (0x01l << 51)) == 0))
		    fpu.setInvalidOperation();
		validateOperand(freg0);               
	    }   break;
	    case FLOAD0_REG0:
		freg0 = (double) reg0; 
		validateOperand(freg0);
		break;
	    case FLOAD0_REG0L:
		freg0 = (double) reg0l; 
		validateOperand(freg0);
		break;
	    case FLOAD0_1:
		freg0 = 1.0; 
		//                     validateOperand(freg0);
		break;
	    case FLOAD0_L2TEN:
		freg0 = L2TEN; 
		//                     validateOperand(freg0);
		break;
	    case FLOAD0_L2E:
		freg0 = L2E; 
		//                     validateOperand(freg0);
		break;
	    case FLOAD0_PI:
		freg0 = Math.PI; 
		//                     validateOperand(freg0);
		break;
	    case FLOAD0_LOG2:
		freg0 = LOG2; 
		//                     validateOperand(freg0);
		break;
	    case FLOAD0_LN2:
		freg0 = LN2; 
		//                     validateOperand(freg0);
		break;
	    case FLOAD0_POS0:
		freg0 = POS0; 
		//                     validateOperand(freg0);
		break;
		
	    case FLOAD1_ST0:
		freg1 = fpu.ST(0); 
		validateOperand(freg1);
		break;
	    case FLOAD1_STN:
		freg1 = fpu.ST(microcodes[position++]); 
		validateOperand(freg1);
		break;
	    case FLOAD1_MEM_SINGLE: {
		int n = seg0.getDoubleWord(addr0);
		freg1 = Float.intBitsToFloat(n);
		if ((Double.isNaN(freg1)) && ((n & (1 << 22)) == 0))
		    fpu.setInvalidOperation();
		validateOperand(freg1);
	    }   break;
	    case FLOAD1_MEM_DOUBLE: {
		long n = seg0.getQuadWord(addr0);
		freg1 = Double.longBitsToDouble(n);
		if ((Double.isNaN(freg1)) && ((n & (0x01l << 51)) == 0))
		    fpu.setInvalidOperation();
		validateOperand(freg1);
	    }   break;
	    case FLOAD1_REG0:
		freg1 = (double) reg0; 
		validateOperand(freg1);
		break;
	    case FLOAD1_REG0L:
		freg1 = (double) reg0l;
		validateOperand(freg1);
		break;

	    case FSTORE0_ST0:  fpu.setST(0, freg0); break;
	    case FSTORE0_STN:  fpu.setST(microcodes[position++], freg0); break;
	    case FSTORE0_MEM_SINGLE: {
		int n = Float.floatToRawIntBits((float) freg0);
		seg0.setDoubleWord(addr0, n); 
	    }   break;
	    case FSTORE0_MEM_DOUBLE: {
		long n = Double.doubleToRawLongBits(freg0);
		seg0.setQuadWord(addr0, n); 
	    }   break;
	    case FSTORE0_REG0: reg0 = (int) freg0; break;
                
	    case FSTORE1_ST0:  fpu.setST(0, freg1); break;
	    case FSTORE1_STN:  fpu.setST(microcodes[position++], freg1); break;
	    case FSTORE1_MEM_SINGLE: {
		int n = Float.floatToRawIntBits((float) freg1);
		seg0.setDoubleWord(addr0, n); 
	    }   break;
	    case FSTORE1_MEM_DOUBLE: {
		long n = Double.doubleToRawLongBits(freg1);
		seg0.setQuadWord(addr0, n); 
	    }   break;
	    case FSTORE1_REG0:  reg0 = (int) freg1; break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -