📄 prefix_none.h
字号:
} } else { GetEAa;Bit16u iw=(Bit16s)Fetchbs(); switch (which) { case 0x00:ADDW(eaa,iw,LoadMw,SaveMw);break; case 0x01: ORW(eaa,iw,LoadMw,SaveMw);break; case 0x02:ADCW(eaa,iw,LoadMw,SaveMw);break; case 0x03:SBBW(eaa,iw,LoadMw,SaveMw);break; case 0x04:ANDW(eaa,iw,LoadMw,SaveMw);break; case 0x05:SUBW(eaa,iw,LoadMw,SaveMw);break; case 0x06:XORW(eaa,iw,LoadMw,SaveMw);break; case 0x07:CMPW(eaa,iw,LoadMw,SaveMw);break; } } break; } CASE_B(0x84) /* TEST Eb,Gb */ RMEbGb(TESTB); break; CASE_W(0x85) /* TEST Ew,Gw */ RMEwGw(TESTW); break; CASE_B(0x86) /* XCHG Eb,Gb */ { GetRMrb;Bit8u oldrmrb=*rmrb; if (rm >= 0xc0 ) {GetEArb;*rmrb=*earb;*earb=oldrmrb;} else {GetEAa;*rmrb=LoadMb(eaa);SaveMb(eaa,oldrmrb);} break; } CASE_W(0x87) /* XCHG Ew,Gw */ { GetRMrw;Bit16u oldrmrw=*rmrw; if (rm >= 0xc0 ) {GetEArw;*rmrw=*earw;*earw=oldrmrw;} else {GetEAa;*rmrw=LoadMw(eaa);SaveMw(eaa,oldrmrw);} break; } CASE_B(0x88) /* MOV Eb,Gb */ { GetRMrb; if (rm >= 0xc0 ) {GetEArb;*earb=*rmrb;} else { if (cpu.pmode) { if (GCC_UNLIKELY((rm==0x05) && (!cpu.code.big))) { Descriptor desc; cpu.gdt.GetDescriptor(SegValue(core.base_val_ds),desc); if ((desc.Type()==DESC_CODE_R_NC_A) || (desc.Type()==DESC_CODE_R_NC_NA)) { CPU_Exception(EXCEPTION_GP,SegValue(core.base_val_ds) & 0xfffc); continue; } } } GetEAa;SaveMb(eaa,*rmrb); } break; } CASE_W(0x89) /* MOV Ew,Gw */ { GetRMrw; if (rm >= 0xc0 ) {GetEArw;*earw=*rmrw;} else {GetEAa;SaveMw(eaa,*rmrw);} break; } CASE_B(0x8a) /* MOV Gb,Eb */ { GetRMrb; if (rm >= 0xc0 ) {GetEArb;*rmrb=*earb;} else {GetEAa;*rmrb=LoadMb(eaa);} break; } CASE_W(0x8b) /* MOV Gw,Ew */ { GetRMrw; if (rm >= 0xc0 ) {GetEArw;*rmrw=*earw;} else {GetEAa;*rmrw=LoadMw(eaa);} break; } CASE_W(0x8c) /* Mov Ew,Sw */ { GetRM;Bit16u val;Bitu which=(rm>>3)&7; switch (which) { case 0x00: /* MOV Ew,ES */ val=SegValue(es);break; case 0x01: /* MOV Ew,CS */ val=SegValue(cs);break; case 0x02: /* MOV Ew,SS */ val=SegValue(ss);break; case 0x03: /* MOV Ew,DS */ val=SegValue(ds);break; case 0x04: /* MOV Ew,FS */ val=SegValue(fs);break; case 0x05: /* MOV Ew,GS */ val=SegValue(gs);break; default: LOG(LOG_CPU,LOG_ERROR)("CPU:8c:Illegal RM Byte"); goto illegal_opcode; } if (rm >= 0xc0 ) {GetEArw;*earw=val;} else {GetEAa;SaveMw(eaa,val);} break; } CASE_W(0x8d) /* LEA Gw */ { //Little hack to always use segprefixed version BaseDS=BaseSS=0; GetRMrw; if (TEST_PREFIX_ADDR) { *rmrw=(Bit16u)(*EATable[256+rm])(); } else { *rmrw=(Bit16u)(*EATable[rm])(); } break; } CASE_B(0x8e) /* MOV Sw,Ew */ { GetRM;Bit16u val;Bitu which=(rm>>3)&7; if (rm >= 0xc0 ) {GetEArw;val=*earw;} else {GetEAa;val=LoadMw(eaa);} switch (which) { case 0x02: /* MOV SS,Ew */ CPU_Cycles++; //Always do another instruction case 0x00: /* MOV ES,Ew */ case 0x03: /* MOV DS,Ew */ case 0x05: /* MOV GS,Ew */ case 0x04: /* MOV FS,Ew */ if (CPU_SetSegGeneral((SegNames)which,val)) RUNEXCEPTION(); break; default: goto illegal_opcode; } break; } CASE_W(0x8f) /* POP Ew */ { Bit16u val=Pop_16(); GetRM; if (rm >= 0xc0 ) {GetEArw;*earw=val;} else {GetEAa;SaveMw(eaa,val);} break; } CASE_B(0x90) /* NOP */ break; CASE_W(0x91) /* XCHG CX,AX */ { Bit16u temp=reg_ax;reg_ax=reg_cx;reg_cx=temp; } break; CASE_W(0x92) /* XCHG DX,AX */ { Bit16u temp=reg_ax;reg_ax=reg_dx;reg_dx=temp; } break; CASE_W(0x93) /* XCHG BX,AX */ { Bit16u temp=reg_ax;reg_ax=reg_bx;reg_bx=temp; } break; CASE_W(0x94) /* XCHG SP,AX */ { Bit16u temp=reg_ax;reg_ax=reg_sp;reg_sp=temp; } break; CASE_W(0x95) /* XCHG BP,AX */ { Bit16u temp=reg_ax;reg_ax=reg_bp;reg_bp=temp; } break; CASE_W(0x96) /* XCHG SI,AX */ { Bit16u temp=reg_ax;reg_ax=reg_si;reg_si=temp; } break; CASE_W(0x97) /* XCHG DI,AX */ { Bit16u temp=reg_ax;reg_ax=reg_di;reg_di=temp; } break; CASE_W(0x98) /* CBW */ reg_ax=(Bit8s)reg_al;break; CASE_W(0x99) /* CWD */ if (reg_ax & 0x8000) reg_dx=0xffff;else reg_dx=0; break; CASE_W(0x9a) /* CALL Ap */ { FillFlags(); Bit16u newip=Fetchw();Bit16u newcs=Fetchw(); CPU_CALL(false,newcs,newip,GETIP);#if CPU_TRAP_CHECK if (GETFLAG(TF)) { cpudecoder=CPU_Core_Normal_Trap_Run; return CBRET_NONE; }#endif continue; } CASE_B(0x9b) /* WAIT */ break; /* No waiting here */ CASE_W(0x9c) /* PUSHF */ FillFlags(); if (CPU_PUSHF(false)) RUNEXCEPTION(); break; CASE_W(0x9d) /* POPF */ if (CPU_POPF(false)) RUNEXCEPTION(); lflags.type=t_UNKNOWN;#if CPU_TRAP_CHECK if (GETFLAG(TF)) { cpudecoder=CPU_Core_Normal_Trap_Run; goto decode_end; }#endif#if CPU_PIC_CHECK if (GETFLAG(IF) && PIC_IRQCheck) goto decode_end;#endif break; CASE_B(0x9e) /* SAHF */ SETFLAGSb(reg_ah); break; CASE_B(0x9f) /* LAHF */ FillFlags(); reg_ah=reg_flags&0xff; break; CASE_B(0xa0) /* MOV AL,Ob */ { GetEADirect; reg_al=LoadMb(eaa); } break; CASE_W(0xa1) /* MOV AX,Ow */ { GetEADirect; reg_ax=LoadMw(eaa); } break; CASE_B(0xa2) /* MOV Ob,AL */ { GetEADirect; SaveMb(eaa,reg_al); } break; CASE_W(0xa3) /* MOV Ow,AX */ { GetEADirect; SaveMw(eaa,reg_ax); } break; CASE_B(0xa4) /* MOVSB */ DoString(R_MOVSB);break; CASE_W(0xa5) /* MOVSW */ DoString(R_MOVSW);break; CASE_B(0xa6) /* CMPSB */ DoString(R_CMPSB);break; CASE_W(0xa7) /* CMPSW */ DoString(R_CMPSW);break; CASE_B(0xa8) /* TEST AL,Ib */ ALIb(TESTB);break; CASE_W(0xa9) /* TEST AX,Iw */ AXIw(TESTW);break; CASE_B(0xaa) /* STOSB */ DoString(R_STOSB);break; CASE_W(0xab) /* STOSW */ DoString(R_STOSW);break; CASE_B(0xac) /* LODSB */ DoString(R_LODSB);break; CASE_W(0xad) /* LODSW */ DoString(R_LODSW);break; CASE_B(0xae) /* SCASB */ DoString(R_SCASB);break; CASE_W(0xaf) /* SCASW */ DoString(R_SCASW);break; CASE_B(0xb0) /* MOV AL,Ib */ reg_al=Fetchb();break; CASE_B(0xb1) /* MOV CL,Ib */ reg_cl=Fetchb();break; CASE_B(0xb2) /* MOV DL,Ib */ reg_dl=Fetchb();break; CASE_B(0xb3) /* MOV BL,Ib */ reg_bl=Fetchb();break; CASE_B(0xb4) /* MOV AH,Ib */ reg_ah=Fetchb();break; CASE_B(0xb5) /* MOV CH,Ib */ reg_ch=Fetchb();break; CASE_B(0xb6) /* MOV DH,Ib */ reg_dh=Fetchb();break; CASE_B(0xb7) /* MOV BH,Ib */ reg_bh=Fetchb();break; CASE_W(0xb8) /* MOV AX,Iw */ reg_ax=Fetchw();break; CASE_W(0xb9) /* MOV CX,Iw */ reg_cx=Fetchw();break; CASE_W(0xba) /* MOV DX,Iw */ reg_dx=Fetchw();break; CASE_W(0xbb) /* MOV BX,Iw */ reg_bx=Fetchw();break; CASE_W(0xbc) /* MOV SP,Iw */ reg_sp=Fetchw();break; CASE_W(0xbd) /* MOV BP.Iw */ reg_bp=Fetchw();break; CASE_W(0xbe) /* MOV SI,Iw */ reg_si=Fetchw();break; CASE_W(0xbf) /* MOV DI,Iw */ reg_di=Fetchw();break; CASE_B(0xc0) /* GRP2 Eb,Ib */ GRP2B(Fetchb());break; CASE_W(0xc1) /* GRP2 Ew,Ib */ GRP2W(Fetchb());break; CASE_W(0xc2) /* RETN Iw */ reg_eip=Pop_16(); reg_esp+=Fetchw(); continue; CASE_W(0xc3) /* RETN */ reg_eip=Pop_16(); continue; CASE_W(0xc4) /* LES */ { GetRMrw;GetEAa; if (CPU_SetSegGeneral(es,LoadMw(eaa+2))) RUNEXCEPTION(); *rmrw=LoadMw(eaa); break; } CASE_W(0xc5) /* LDS */ { GetRMrw;GetEAa; if (CPU_SetSegGeneral(ds,LoadMw(eaa+2))) RUNEXCEPTION(); *rmrw=LoadMw(eaa); break; } CASE_B(0xc6) /* MOV Eb,Ib */ { GetRM; if (rm >= 0xc0) {GetEArb;*earb=Fetchb();} else {GetEAa;SaveMb(eaa,Fetchb());} break; } CASE_W(0xc7) /* MOV EW,Iw */ { GetRM; if (rm >= 0xc0) {GetEArw;*earw=Fetchw();} else {GetEAa;SaveMw(eaa,Fetchw());} break; } CASE_W(0xc8) /* ENTER Iw,Ib */ { Bitu bytes=Fetchw(); Bitu level=Fetchb(); CPU_ENTER(false,bytes,level); } break; CASE_W(0xc9) /* LEAVE */ reg_esp&=cpu.stack.notmask; reg_esp|=(reg_ebp&cpu.stack.mask); reg_bp=Pop_16(); break; CASE_W(0xca) /* RETF Iw */ { Bitu words=Fetchw(); FillFlags(); CPU_RET(false,words,GETIP); continue; } CASE_W(0xcb) /* RETF */ FillFlags(); CPU_RET(false,0,GETIP); continue; CASE_B(0xcc) /* INT3 */ FillFlags();#if C_DEBUG if (DEBUG_Breakpoint()) return debugCallback;#endif CPU_SW_Interrupt_NoIOPLCheck(3,GETIP);#if CPU_TRAP_CHECK cpu.trap_skip=true;#endif continue; CASE_B(0xcd) /* INT Ib */ { Bit8u num=Fetchb(); FillFlags();#if C_DEBUG if (DEBUG_IntBreakpoint(num)) { return debugCallback; }#endif CPU_SW_Interrupt(num,GETIP);#if CPU_TRAP_CHECK cpu.trap_skip=true;#endif continue; } CASE_B(0xce) /* INTO */ if (get_OF()) { FillFlags(); CPU_SW_Interrupt(4,GETIP);#if CPU_TRAP_CHECK cpu.trap_skip=true;#endif continue; } break; CASE_W(0xcf) /* IRET */ { FillFlags(); CPU_IRET(false,GETIP);#if CPU_TRAP_CHECK if (GETFLAG(TF)) { cpudecoder=CPU_Core_Normal_Trap_Run; return CBRET_NONE; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -