📄 prefix_none.h
字号:
#endif#if CPU_PIC_CHECK if (GETFLAG(IF) && PIC_IRQCheck) return CBRET_NONE;#endif continue; } CASE_B(0xd0) /* GRP2 Eb,1 */ GRP2B(1);break; CASE_W(0xd1) /* GRP2 Ew,1 */ GRP2W(1);break; CASE_B(0xd2) /* GRP2 Eb,CL */ GRP2B(reg_cl);break; CASE_W(0xd3) /* GRP2 Ew,CL */ GRP2W(reg_cl);break; CASE_B(0xd4) /* AAM Ib */ AAM(Fetchb());break; CASE_B(0xd5) /* AAD Ib */ AAD(Fetchb());break; CASE_B(0xd6) /* SALC */ reg_al = get_CF() ? 0xFF : 0; break; CASE_B(0xd7) /* XLAT */ if (TEST_PREFIX_ADDR) { reg_al=LoadMb(BaseDS+(Bit32u)(reg_ebx+reg_al)); } else { reg_al=LoadMb(BaseDS+(Bit16u)(reg_bx+reg_al)); } break;#ifdef CPU_FPU CASE_B(0xd8) /* FPU ESC 0 */ FPU_ESC(0);break; CASE_B(0xd9) /* FPU ESC 1 */ FPU_ESC(1);break; CASE_B(0xda) /* FPU ESC 2 */ FPU_ESC(2);break; CASE_B(0xdb) /* FPU ESC 3 */ FPU_ESC(3);break; CASE_B(0xdc) /* FPU ESC 4 */ FPU_ESC(4);break; CASE_B(0xdd) /* FPU ESC 5 */ FPU_ESC(5);break; CASE_B(0xde) /* FPU ESC 6 */ FPU_ESC(6);break; CASE_B(0xdf) /* FPU ESC 7 */ FPU_ESC(7);break;#else CASE_B(0xd8) /* FPU ESC 0 */ CASE_B(0xd9) /* FPU ESC 1 */ CASE_B(0xda) /* FPU ESC 2 */ CASE_B(0xdb) /* FPU ESC 3 */ CASE_B(0xdc) /* FPU ESC 4 */ CASE_B(0xdd) /* FPU ESC 5 */ CASE_B(0xde) /* FPU ESC 6 */ CASE_B(0xdf) /* FPU ESC 7 */ { LOG(LOG_CPU,LOG_NORMAL)("FPU used"); Bit8u rm=Fetchb(); if (rm<0xc0) GetEAa; } break;#endif CASE_W(0xe0) /* LOOPNZ */ if (TEST_PREFIX_ADDR) { JumpCond16_b(--reg_ecx && !get_ZF()); } else { JumpCond16_b(--reg_cx && !get_ZF()); } break; CASE_W(0xe1) /* LOOPZ */ if (TEST_PREFIX_ADDR) { JumpCond16_b(--reg_ecx && get_ZF()); } else { JumpCond16_b(--reg_cx && get_ZF()); } break; CASE_W(0xe2) /* LOOP */ if (TEST_PREFIX_ADDR) { JumpCond16_b(--reg_ecx); } else { JumpCond16_b(--reg_cx); } break; CASE_W(0xe3) /* JCXZ */ JumpCond16_b(!(reg_ecx & AddrMaskTable[core.prefixes& PREFIX_ADDR])); break; CASE_B(0xe4) /* IN AL,Ib */ { Bitu port=Fetchb(); if (CPU_IO_Exception(port,1)) RUNEXCEPTION(); reg_al=IO_ReadB(port); break; } CASE_W(0xe5) /* IN AX,Ib */ { Bitu port=Fetchb(); if (CPU_IO_Exception(port,2)) RUNEXCEPTION(); reg_al=IO_ReadW(port); break; } CASE_B(0xe6) /* OUT Ib,AL */ { Bitu port=Fetchb(); if (CPU_IO_Exception(port,1)) RUNEXCEPTION(); IO_WriteB(port,reg_al); break; } CASE_W(0xe7) /* OUT Ib,AX */ { Bitu port=Fetchb(); if (CPU_IO_Exception(port,2)) RUNEXCEPTION(); IO_WriteW(port,reg_ax); break; } CASE_W(0xe8) /* CALL Jw */ { Bit16u addip=Fetchws(); SAVEIP; Push_16(reg_eip); reg_eip=(Bit16u)(reg_eip+addip); continue; } CASE_W(0xe9) /* JMP Jw */ { Bit16u addip=Fetchws(); SAVEIP; reg_eip=(Bit16u)(reg_eip+addip); continue; } CASE_W(0xea) /* JMP Ap */ { Bit16u newip=Fetchw(); Bit16u newcs=Fetchw(); FillFlags(); CPU_JMP(false,newcs,newip,GETIP);#if CPU_TRAP_CHECK if (GETFLAG(TF)) { cpudecoder=CPU_Core_Normal_Trap_Run; return CBRET_NONE; }#endif continue; } CASE_W(0xeb) /* JMP Jb */ { Bit16s addip=Fetchbs(); SAVEIP; reg_eip=(Bit16u)(reg_eip+addip); continue; } CASE_B(0xec) /* IN AL,DX */ if (CPU_IO_Exception(reg_dx,1)) RUNEXCEPTION(); reg_al=IO_ReadB(reg_dx); break; CASE_W(0xed) /* IN AX,DX */ if (CPU_IO_Exception(reg_dx,2)) RUNEXCEPTION(); reg_ax=IO_ReadW(reg_dx); break; CASE_B(0xee) /* OUT DX,AL */ if (CPU_IO_Exception(reg_dx,1)) RUNEXCEPTION(); IO_WriteB(reg_dx,reg_al); break; CASE_W(0xef) /* OUT DX,AX */ if (CPU_IO_Exception(reg_dx,2)) RUNEXCEPTION(); IO_WriteW(reg_dx,reg_ax); break; CASE_B(0xf0) /* LOCK */ LOG(LOG_CPU,LOG_NORMAL)("CPU:LOCK"); /* FIXME: see case D_LOCK in core_full/load.h */ break; CASE_B(0xf1) /* ICEBP */ FillFlags(); CPU_SW_Interrupt_NoIOPLCheck(1,GETIP);#if CPU_TRAP_CHECK cpu.trap_skip=true;#endif continue; CASE_B(0xf2) /* REPNZ */ DO_PREFIX_REP(false); break; CASE_B(0xf3) /* REPZ */ DO_PREFIX_REP(true); break; CASE_B(0xf4) /* HLT */ if (cpu.pmode && cpu.cpl) EXCEPTION(EXCEPTION_GP); FillFlags(); CPU_HLT(GETIP); return CBRET_NONE; //Needs to return for hlt cpu core CASE_B(0xf5) /* CMC */ FillFlags(); SETFLAGBIT(CF,!(reg_flags & FLAG_CF)); break; CASE_B(0xf6) /* GRP3 Eb(,Ib) */ { GetRM;Bitu which=(rm>>3)&7; switch (which) { case 0x00: /* TEST Eb,Ib */ case 0x01: /* TEST Eb,Ib Undocumented*/ { if (rm >= 0xc0 ) {GetEArb;TESTB(*earb,Fetchb(),LoadRb,0)} else {GetEAa;TESTB(eaa,Fetchb(),LoadMb,0);} break; } case 0x02: /* NOT Eb */ { if (rm >= 0xc0 ) {GetEArb;*earb=~*earb;} else {GetEAa;SaveMb(eaa,~LoadMb(eaa));} break; } case 0x03: /* NEG Eb */ { lflags.type=t_NEGb; if (rm >= 0xc0 ) { GetEArb;lf_var1b=*earb;lf_resb=0-lf_var1b; *earb=lf_resb; } else { GetEAa;lf_var1b=LoadMb(eaa);lf_resb=0-lf_var1b; SaveMb(eaa,lf_resb); } break; } case 0x04: /* MUL AL,Eb */ RMEb(MULB); break; case 0x05: /* IMUL AL,Eb */ RMEb(IMULB); break; case 0x06: /* DIV Eb */ RMEb(DIVB); break; case 0x07: /* IDIV Eb */ RMEb(IDIVB); break; } break; } CASE_W(0xf7) /* GRP3 Ew(,Iw) */ { GetRM;Bitu which=(rm>>3)&7; switch (which) { case 0x00: /* TEST Ew,Iw */ case 0x01: /* TEST Ew,Iw Undocumented*/ { if (rm >= 0xc0 ) {GetEArw;TESTW(*earw,Fetchw(),LoadRw,SaveRw);} else {GetEAa;TESTW(eaa,Fetchw(),LoadMw,SaveMw);} break; } case 0x02: /* NOT Ew */ { if (rm >= 0xc0 ) {GetEArw;*earw=~*earw;} else {GetEAa;SaveMw(eaa,~LoadMw(eaa));} break; } case 0x03: /* NEG Ew */ { lflags.type=t_NEGw; if (rm >= 0xc0 ) { GetEArw;lf_var1w=*earw;lf_resw=0-lf_var1w; *earw=lf_resw; } else { GetEAa;lf_var1w=LoadMw(eaa);lf_resw=0-lf_var1w; SaveMw(eaa,lf_resw); } break; } case 0x04: /* MUL AX,Ew */ RMEw(MULW); break; case 0x05: /* IMUL AX,Ew */ RMEw(IMULW) break; case 0x06: /* DIV Ew */ RMEw(DIVW) break; case 0x07: /* IDIV Ew */ RMEw(IDIVW) break; } break; } CASE_B(0xf8) /* CLC */ FillFlags(); SETFLAGBIT(CF,false); break; CASE_B(0xf9) /* STC */ FillFlags(); SETFLAGBIT(CF,true); break; CASE_B(0xfa) /* CLI */ if (CPU_CLI()) RUNEXCEPTION(); break; CASE_B(0xfb) /* STI */ if (CPU_STI()) RUNEXCEPTION();#if CPU_PIC_CHECK if (GETFLAG(IF) && PIC_IRQCheck) goto decode_end;#endif break; CASE_B(0xfc) /* CLD */ SETFLAGBIT(DF,false); cpu.direction=1; break; CASE_B(0xfd) /* STD */ SETFLAGBIT(DF,true); cpu.direction=-1; break; CASE_B(0xfe) /* GRP4 Eb */ { GetRM;Bitu which=(rm>>3)&7; switch (which) { case 0x00: /* INC Eb */ RMEb(INCB); break; case 0x01: /* DEC Eb */ RMEb(DECB); break; case 0x07: /* CallBack */ { Bitu cb=Fetchw(); FillFlags();SAVEIP; return cb; } default: E_Exit("Illegal GRP4 Call %d",(rm>>3) & 7); break; } break; } CASE_W(0xff) /* GRP5 Ew */ { GetRM;Bitu which=(rm>>3)&7; switch (which) { case 0x00: /* INC Ew */ RMEw(INCW); break; case 0x01: /* DEC Ew */ RMEw(DECW); break; case 0x02: /* CALL Ev */ if (rm >= 0xc0 ) {GetEArw;reg_eip=*earw;} else {GetEAa;reg_eip=LoadMw(eaa);} Push_16(GETIP); continue; case 0x03: /* CALL Ep */ { if (rm >= 0xc0) goto illegal_opcode; GetEAa; Bit16u newip=LoadMw(eaa); Bit16u newcs=LoadMw(eaa+2); FillFlags(); CPU_CALL(false,newcs,newip,GETIP);#if CPU_TRAP_CHECK if (GETFLAG(TF)) { cpudecoder=CPU_Core_Normal_Trap_Run; return CBRET_NONE; }#endif continue; } break; case 0x04: /* JMP Ev */ if (rm >= 0xc0 ) {GetEArw;reg_eip=*earw;} else {GetEAa;reg_eip=LoadMw(eaa);} continue; case 0x05: /* JMP Ep */ { if (rm >= 0xc0) goto illegal_opcode; GetEAa; Bit16u newip=LoadMw(eaa); Bit16u newcs=LoadMw(eaa+2); FillFlags(); CPU_JMP(false,newcs,newip,GETIP);#if CPU_TRAP_CHECK if (GETFLAG(TF)) { cpudecoder=CPU_Core_Normal_Trap_Run; return CBRET_NONE; }#endif continue; } break; case 0x06: /* PUSH Ev */ if (rm >= 0xc0 ) {GetEArw;Push_16(*earw);} else {GetEAa;Push_16(LoadMw(eaa));} break; default: E_Exit("CPU:GRP5:Illegal Call %2X",which); break; } break; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -