Far jmps/calls interrupts restart the core
Changes for new lazy flag testing Removed carry flag only changing type Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@1403
This commit is contained in:
parent
f28bdda7b1
commit
b4753c5c62
6 changed files with 155 additions and 203 deletions
|
@ -156,6 +156,13 @@ static Bits CPU_Core_Normal_Decode_Trap(void);
|
|||
|
||||
static Bits CPU_Core_Normal_Decode(void) {
|
||||
decode_start:
|
||||
if (cpu.code.big) {
|
||||
core.index_default=0x200;
|
||||
core.prefix_default=PREFIX_ADDR;
|
||||
} else {
|
||||
core.index_default=0;
|
||||
core.prefix_default=0;
|
||||
}
|
||||
LOADIP;
|
||||
lflags.type=t_UNKNOWN;
|
||||
while (CPU_Cycles>0) {
|
||||
|
@ -214,16 +221,7 @@ static Bits CPU_Core_Normal_Decode_Trap(void) {
|
|||
|
||||
|
||||
void CPU_Core_Normal_Start(bool big) {
|
||||
|
||||
if (GETFLAG(TF)) cpudecoder=CPU_Core_Normal_Decode_Trap;
|
||||
else cpudecoder=CPU_Core_Normal_Decode;
|
||||
|
||||
if (big) {
|
||||
core.index_default=0x200;
|
||||
core.prefix_default=PREFIX_ADDR;
|
||||
} else {
|
||||
core.index_default=0;
|
||||
core.prefix_default=0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -178,69 +178,69 @@
|
|||
}
|
||||
break;
|
||||
CASE_0F_W(0x80) /* JO */
|
||||
JumpSIw(get_OF());break;
|
||||
JumpSIw(TFLG_O);break;
|
||||
CASE_0F_W(0x81) /* JNO */
|
||||
JumpSIw(!get_OF());break;
|
||||
JumpSIw(TFLG_NO);break;
|
||||
CASE_0F_W(0x82) /* JB */
|
||||
JumpSIw(get_CF());break;
|
||||
JumpSIw(TFLG_B);break;
|
||||
CASE_0F_W(0x83) /* JNB */
|
||||
JumpSIw(!get_CF());break;
|
||||
JumpSIw(TFLG_NB);break;
|
||||
CASE_0F_W(0x84) /* JZ */
|
||||
JumpSIw(get_ZF());break;
|
||||
JumpSIw(TFLG_Z);break;
|
||||
CASE_0F_W(0x85) /* JNZ */
|
||||
JumpSIw(!get_ZF());break;
|
||||
JumpSIw(TFLG_NZ);break;
|
||||
CASE_0F_W(0x86) /* JBE */
|
||||
JumpSIw(get_CF() || get_ZF());break;
|
||||
JumpSIw(TFLG_BE);break;
|
||||
CASE_0F_W(0x87) /* JNBE */
|
||||
JumpSIw(!get_CF() && !get_ZF());break;
|
||||
JumpSIw(TFLG_NBE);break;
|
||||
CASE_0F_W(0x88) /* JS */
|
||||
JumpSIw(get_SF());break;
|
||||
JumpSIw(TFLG_S);break;
|
||||
CASE_0F_W(0x89) /* JNS */
|
||||
JumpSIw(!get_SF());break;
|
||||
JumpSIw(TFLG_NS);break;
|
||||
CASE_0F_W(0x8a) /* JP */
|
||||
JumpSIw(get_PF());break;
|
||||
JumpSIw(TFLG_P);break;
|
||||
CASE_0F_W(0x8b) /* JNP */
|
||||
JumpSIw(!get_PF());break;
|
||||
JumpSIw(TFLG_NP);break;
|
||||
CASE_0F_W(0x8c) /* JL */
|
||||
JumpSIw(get_SF() != get_OF());break;
|
||||
JumpSIw(TFLG_L);break;
|
||||
CASE_0F_W(0x8d) /* JNL */
|
||||
JumpSIw(get_SF() == get_OF());break;
|
||||
JumpSIw(TFLG_NL);break;
|
||||
CASE_0F_W(0x8e) /* JLE */
|
||||
JumpSIw(get_ZF() || (get_SF() != get_OF()));break;
|
||||
JumpSIw(TFLG_LE);break;
|
||||
CASE_0F_W(0x8f) /* JNLE */
|
||||
JumpSIw((get_SF() == get_OF()) && !get_ZF());break;
|
||||
JumpSIw(TFLG_NLE);break;
|
||||
CASE_0F_B(0x90) /* SETO */
|
||||
SETcc(get_OF());break;
|
||||
SETcc(TFLG_O);break;
|
||||
CASE_0F_B(0x91) /* SETNO */
|
||||
SETcc(!get_OF());break;
|
||||
SETcc(TFLG_NO);break;
|
||||
CASE_0F_B(0x92) /* SETB */
|
||||
SETcc(get_CF());break;
|
||||
SETcc(TFLG_B);break;
|
||||
CASE_0F_B(0x93) /* SETNB */
|
||||
SETcc(!get_CF());break;
|
||||
SETcc(TFLG_NB);break;
|
||||
CASE_0F_B(0x94) /* SETZ */
|
||||
SETcc(get_ZF());break;
|
||||
SETcc(TFLG_Z);break;
|
||||
CASE_0F_B(0x95) /* SETNZ */
|
||||
SETcc(!get_ZF()); break;
|
||||
SETcc(TFLG_NZ); break;
|
||||
CASE_0F_B(0x96) /* SETBE */
|
||||
SETcc(get_CF() || get_ZF());break;
|
||||
SETcc(TFLG_BE);break;
|
||||
CASE_0F_B(0x97) /* SETNBE */
|
||||
SETcc(!get_CF() && !get_ZF());break;
|
||||
SETcc(TFLG_NBE);break;
|
||||
CASE_0F_B(0x98) /* SETS */
|
||||
SETcc(get_SF());break;
|
||||
SETcc(TFLG_S);break;
|
||||
CASE_0F_B(0x99) /* SETNS */
|
||||
SETcc(!get_SF());break;
|
||||
SETcc(TFLG_NS);break;
|
||||
CASE_0F_B(0x9a) /* SETP */
|
||||
SETcc(get_PF());break;
|
||||
SETcc(TFLG_P);break;
|
||||
CASE_0F_B(0x9b) /* SETNP */
|
||||
SETcc(!get_PF());break;
|
||||
SETcc(TFLG_NP);break;
|
||||
CASE_0F_B(0x9c) /* SETL */
|
||||
SETcc(get_SF() != get_OF());break;
|
||||
SETcc(TFLG_L);break;
|
||||
CASE_0F_B(0x9d) /* SETNL */
|
||||
SETcc(get_SF() == get_OF());break;
|
||||
SETcc(TFLG_NL);break;
|
||||
CASE_0F_B(0x9e) /* SETLE */
|
||||
SETcc(get_ZF() || (get_SF() != get_OF()));break;
|
||||
SETcc(TFLG_LE);break;
|
||||
CASE_0F_B(0x9f) /* SETNLE */
|
||||
SETcc((get_SF() == get_OF()) && !get_ZF());break;
|
||||
SETcc(TFLG_NLE);break;
|
||||
|
||||
CASE_0F_W(0xa0) /* PUSH FS */
|
||||
Push_16(SegValue(fs));break;
|
||||
|
@ -250,7 +250,7 @@
|
|||
CPU_CPUID();break;
|
||||
CASE_0F_W(0xa3) /* BT Ew,Gw */
|
||||
{
|
||||
GetRMrw;
|
||||
FillFlags();GetRMrw;
|
||||
Bit16u mask=1 << (*rmrw & 15);
|
||||
if (rm >= 0xc0 ) {
|
||||
GetEArw;
|
||||
|
@ -259,7 +259,6 @@
|
|||
GetEAa;Bit16u old=LoadMw(eaa);
|
||||
SETFLAGBIT(CF,(old & mask));
|
||||
}
|
||||
SetTypeCF();
|
||||
break;
|
||||
}
|
||||
CASE_0F_W(0xa4) /* SHLD Ew,Gw,Ib */
|
||||
|
@ -274,7 +273,7 @@
|
|||
CPU_SetSegGeneral(gs,Pop_16());break;
|
||||
CASE_0F_W(0xab) /* BTS Ew,Gw */
|
||||
{
|
||||
GetRMrw;
|
||||
FillFlags();GetRMrw;
|
||||
Bit16u mask=1 << (*rmrw & 15);
|
||||
if (rm >= 0xc0 ) {
|
||||
GetEArw;
|
||||
|
@ -285,7 +284,6 @@
|
|||
SETFLAGBIT(CF,(old & mask));
|
||||
SaveMw(eaa,old | mask);
|
||||
}
|
||||
SetTypeCF();
|
||||
break;
|
||||
}
|
||||
CASE_0F_W(0xac) /* SHRD Ew,Gw,Ib */
|
||||
|
@ -305,7 +303,7 @@
|
|||
}
|
||||
CASE_0F_W(0xb3) /* BTR Ew,Gw */
|
||||
{
|
||||
GetRMrw;
|
||||
FillFlags();GetRMrw;
|
||||
Bit16u mask=1 << (*rmrw & 15);
|
||||
if (rm >= 0xc0 ) {
|
||||
GetEArw;
|
||||
|
@ -316,7 +314,6 @@
|
|||
SETFLAGBIT(CF,(old & mask));
|
||||
SaveMw(eaa,old & ~mask);
|
||||
}
|
||||
SetTypeCF();
|
||||
break;
|
||||
}
|
||||
CASE_0F_W(0xb4) /* LFS Ew */
|
||||
|
@ -348,7 +345,7 @@
|
|||
}
|
||||
CASE_0F_W(0xba) /* GRP8 Ew,Ib */
|
||||
{
|
||||
GetRM;
|
||||
FillFlags();GetRM;
|
||||
if (rm >= 0xc0 ) {
|
||||
GetEArw;
|
||||
Bit16u mask=1 << (Fetchb() & 15);
|
||||
|
@ -388,12 +385,11 @@
|
|||
E_Exit("CPU:0F:BA:Illegal subfunction %X",rm & 0x38);
|
||||
}
|
||||
}
|
||||
SetTypeCF();
|
||||
break;
|
||||
}
|
||||
CASE_0F_W(0xbb) /* BTC Ew,Gw */
|
||||
{
|
||||
GetRMrw;
|
||||
FillFlags();GetRMrw;
|
||||
Bit16u mask=1 << (*rmrw & 15);
|
||||
if (rm >= 0xc0 ) {
|
||||
GetEArw;
|
||||
|
@ -404,7 +400,6 @@
|
|||
SETFLAGBIT(CF,(old & mask));
|
||||
SaveMw(eaa,old ^ mask);
|
||||
}
|
||||
SetTypeCF();
|
||||
break;
|
||||
}
|
||||
CASE_0F_W(0xbc) /* BSF Gw,Ew */
|
||||
|
|
|
@ -341,13 +341,9 @@
|
|||
CASE_D(0x9a) /* CALL FAR Ad */
|
||||
{
|
||||
Bit32u newip=Fetchd();Bit16u newcs=Fetchw();
|
||||
SAVEIP;
|
||||
if (CPU_CALL(true,newcs,newip)) {
|
||||
LOADIP;
|
||||
} else {
|
||||
FillFlags();return CBRET_NONE;
|
||||
}
|
||||
break;
|
||||
LEAVECORE;
|
||||
CPU_CALL(true,newcs,newip);
|
||||
goto decode_start;
|
||||
}
|
||||
CASE_D(0x9c) /* PUSHFD */
|
||||
FillFlags();
|
||||
|
@ -475,38 +471,32 @@
|
|||
break;
|
||||
CASE_D(0xca) /* RETF Iw */
|
||||
{
|
||||
if (CPU_RET(true,Fetchw())) {
|
||||
LOADIP;
|
||||
} else {
|
||||
FillFlags();return CBRET_NONE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
Bitu words=Fetchw();
|
||||
LEAVECORE;
|
||||
CPU_RET(true,words);
|
||||
goto decode_start;
|
||||
}
|
||||
CASE_D(0xcb) /* RETF */
|
||||
{
|
||||
if (CPU_RET(true,0)) {
|
||||
LOADIP;
|
||||
} else {
|
||||
FillFlags();return CBRET_NONE;
|
||||
}
|
||||
break;
|
||||
LEAVECORE;
|
||||
CPU_RET(true,0);
|
||||
goto decode_start;
|
||||
}
|
||||
CASE_D(0xcf) /* IRET */
|
||||
{
|
||||
if (CPU_IRET(true)) {
|
||||
LEAVECORE;
|
||||
CPU_IRET(true);
|
||||
#if CPU_TRAP_CHECK
|
||||
if (GETFLAG(TF)) {
|
||||
cpudecoder=CPU_Core_Normal_Decode_Trap;
|
||||
return CBRET_NONE;
|
||||
}
|
||||
if (GETFLAG(TF)) {
|
||||
cpudecoder=CPU_Core_Normal_Decode_Trap;
|
||||
return CBRET_NONE;
|
||||
}
|
||||
#endif
|
||||
#ifdef CPU_PIC_CHECK
|
||||
if (GETFLAG(IF) && PIC_IRQCheck) return CBRET_NONE;
|
||||
if (GETFLAG(IF) && PIC_IRQCheck) return CBRET_NONE;
|
||||
#endif
|
||||
//TODO TF check
|
||||
goto decode_start;
|
||||
} else return CBRET_NONE;
|
||||
break;
|
||||
goto decode_start;
|
||||
}
|
||||
CASE_D(0xd1) /* GRP2 Ed,1 */
|
||||
GRP2D(1);break;
|
||||
|
@ -532,13 +522,9 @@
|
|||
{
|
||||
Bit32u newip=Fetchd();
|
||||
Bit16u newcs=Fetchw();
|
||||
SAVEIP;
|
||||
if (CPU_JMP(true,newcs,newip)) {
|
||||
LOADIP;
|
||||
} else {
|
||||
FillFlags();return CBRET_NONE;
|
||||
}
|
||||
break;
|
||||
LEAVECORE;
|
||||
CPU_JMP(true,newcs,newip);
|
||||
goto decode_start;
|
||||
}
|
||||
CASE_D(0xed) /* IN EAX,DX */
|
||||
reg_eax=IO_ReadD(reg_dx);
|
||||
|
@ -609,12 +595,9 @@
|
|||
GetEAa;
|
||||
Bit32u newip=LoadMd(eaa);
|
||||
Bit16u newcs=LoadMw(eaa+4);
|
||||
SAVEIP;
|
||||
if (CPU_CALL(true,newcs,newip)) {
|
||||
LOADIP;
|
||||
} else {
|
||||
FillFlags();return CBRET_NONE;
|
||||
}
|
||||
LEAVECORE;
|
||||
CPU_CALL(true,newcs,newip);
|
||||
goto decode_start;
|
||||
}
|
||||
break;
|
||||
case 0x04: /* JMP NEAR Ed */
|
||||
|
@ -626,12 +609,9 @@
|
|||
GetEAa;
|
||||
Bit32u newip=LoadMd(eaa);
|
||||
Bit16u newcs=LoadMw(eaa+4);
|
||||
SAVEIP;
|
||||
if (CPU_JMP(true,newcs,newip)) {
|
||||
LOADIP;
|
||||
} else {
|
||||
FillFlags();return CBRET_NONE;
|
||||
}
|
||||
LEAVECORE;
|
||||
CPU_JMP(true,newcs,newip);
|
||||
goto decode_start;
|
||||
}
|
||||
break;
|
||||
case 0x06: /* Push Ed */
|
||||
|
|
|
@ -124,37 +124,37 @@
|
|||
}
|
||||
break;
|
||||
CASE_0F_D(0x80) /* JO */
|
||||
JumpSId(get_OF());break;
|
||||
JumpSId(TFLG_O);break;
|
||||
CASE_0F_D(0x81) /* JNO */
|
||||
JumpSId(!get_OF());break;
|
||||
JumpSId(TFLG_NO);break;
|
||||
CASE_0F_D(0x82) /* JB */
|
||||
JumpSId(get_CF());break;
|
||||
JumpSId(TFLG_B);break;
|
||||
CASE_0F_D(0x83) /* JNB */
|
||||
JumpSId(!get_CF());break;
|
||||
JumpSId(TFLG_NB);break;
|
||||
CASE_0F_D(0x84) /* JZ */
|
||||
JumpSId(get_ZF());break;
|
||||
JumpSId(TFLG_Z);break;
|
||||
CASE_0F_D(0x85) /* JNZ */
|
||||
JumpSId(!get_ZF());break;
|
||||
JumpSId(TFLG_NZ);break;
|
||||
CASE_0F_D(0x86) /* JBE */
|
||||
JumpSId(get_CF() || get_ZF());break;
|
||||
JumpSId(TFLG_BE);break;
|
||||
CASE_0F_D(0x87) /* JNBE */
|
||||
JumpSId(!get_CF() && !get_ZF());break;
|
||||
JumpSId(TFLG_NBE);break;
|
||||
CASE_0F_D(0x88) /* JS */
|
||||
JumpSId(get_SF());break;
|
||||
JumpSId(TFLG_S);break;
|
||||
CASE_0F_D(0x89) /* JNS */
|
||||
JumpSId(!get_SF());break;
|
||||
JumpSId(TFLG_NS);break;
|
||||
CASE_0F_D(0x8a) /* JP */
|
||||
JumpSId(get_PF());break;
|
||||
JumpSId(TFLG_P);break;
|
||||
CASE_0F_D(0x8b) /* JNP */
|
||||
JumpSId(!get_PF());break;
|
||||
JumpSId(TFLG_NP);break;
|
||||
CASE_0F_D(0x8c) /* JL */
|
||||
JumpSId(get_SF() != get_OF());break;
|
||||
JumpSId(TFLG_L);break;
|
||||
CASE_0F_D(0x8d) /* JNL */
|
||||
JumpSId(get_SF() == get_OF());break;
|
||||
JumpSId(TFLG_NL);break;
|
||||
CASE_0F_D(0x8e) /* JLE */
|
||||
JumpSId(get_ZF() || (get_SF() != get_OF()));break;
|
||||
JumpSId(TFLG_LE);break;
|
||||
CASE_0F_D(0x8f) /* JNLE */
|
||||
JumpSId((get_SF() == get_OF()) && !get_ZF());break;
|
||||
JumpSId(TFLG_NLE);break;
|
||||
|
||||
CASE_0F_D(0xa0) /* PUSH FS */
|
||||
Push_32(SegValue(fs));break;
|
||||
|
@ -163,7 +163,7 @@
|
|||
|
||||
CASE_0F_D(0xa3) /* BT Ed,Gd */
|
||||
{
|
||||
GetRMrd;
|
||||
FillFlags();GetRMrd;
|
||||
Bit32u mask=1 << (*rmrd & 31);
|
||||
if (rm >= 0xc0 ) {
|
||||
GetEArd;
|
||||
|
@ -172,7 +172,6 @@
|
|||
GetEAa;Bit32u old=LoadMd(eaa);
|
||||
SETFLAGBIT(CF,(old & mask));
|
||||
}
|
||||
SetTypeCF();
|
||||
break;
|
||||
}
|
||||
CASE_0F_D(0xa4) /* SHLD Ed,Gd,Ib */
|
||||
|
@ -187,7 +186,7 @@
|
|||
CPU_SetSegGeneral(gs,(Bit16u)Pop_32());break;
|
||||
CASE_0F_D(0xab) /* BTS Ed,Gd */
|
||||
{
|
||||
GetRMrd;
|
||||
FillFlags();GetRMrd;
|
||||
Bit32u mask=1 << (*rmrd & 31);
|
||||
if (rm >= 0xc0 ) {
|
||||
GetEArd;
|
||||
|
@ -198,7 +197,6 @@
|
|||
SETFLAGBIT(CF,(old & mask));
|
||||
SaveMd(eaa,old | mask);
|
||||
}
|
||||
SetTypeCF();
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -247,7 +245,7 @@
|
|||
}
|
||||
CASE_0F_D(0xba) /* GRP8 Ed,Ib */
|
||||
{
|
||||
GetRM;
|
||||
FillFlags();GetRM;
|
||||
if (rm >= 0xc0 ) {
|
||||
GetEArd;
|
||||
Bit32u mask=1 << (Fetchb() & 31);
|
||||
|
@ -290,12 +288,11 @@
|
|||
E_Exit("CPU:66:0F:BA:Illegal subfunction %X",rm & 0x38);
|
||||
}
|
||||
}
|
||||
SetTypeCF();
|
||||
break;
|
||||
}
|
||||
CASE_0F_D(0xbb) /* BTC Ed,Gd */
|
||||
{
|
||||
GetRMrd;
|
||||
FillFlags();GetRMrd;
|
||||
Bit32u mask=1 << (*rmrd & 31);
|
||||
if (rm >= 0xc0 ) {
|
||||
GetEArd;
|
||||
|
@ -306,7 +303,6 @@
|
|||
SETFLAGBIT(CF,(old & mask));
|
||||
SaveMd(eaa,old ^ mask);
|
||||
}
|
||||
SetTypeCF();
|
||||
break;
|
||||
}
|
||||
CASE_0F_D(0xbc) /* BSF Gd,Ed */
|
||||
|
|
|
@ -277,37 +277,37 @@
|
|||
CASE_W(0x6f) /* OUTSW */
|
||||
DoString(R_OUTSW);break;
|
||||
CASE_B(0x70) /* JO */
|
||||
JumpSIb(get_OF());break;
|
||||
JumpSIb(TFLG_O);break;
|
||||
CASE_B(0x71) /* JNO */
|
||||
JumpSIb(!get_OF());break;
|
||||
JumpSIb(TFLG_NO);break;
|
||||
CASE_B(0x72) /* JB */
|
||||
JumpSIb(get_CF());break;
|
||||
JumpSIb(TFLG_B);break;
|
||||
CASE_B(0x73) /* JNB */
|
||||
JumpSIb(!get_CF());break;
|
||||
JumpSIb(TFLG_NB);break;
|
||||
CASE_B(0x74) /* JZ */
|
||||
JumpSIb(get_ZF());break;
|
||||
JumpSIb(TFLG_Z);break;
|
||||
CASE_B(0x75) /* JNZ */
|
||||
JumpSIb(!get_ZF());break;
|
||||
JumpSIb(TFLG_NZ);break;
|
||||
CASE_B(0x76) /* JBE */
|
||||
JumpSIb(get_CF() || get_ZF());break;
|
||||
JumpSIb(TFLG_BE);break;
|
||||
CASE_B(0x77) /* JNBE */
|
||||
JumpSIb(!get_CF() && !get_ZF());break;
|
||||
JumpSIb(TFLG_NBE);break;
|
||||
CASE_B(0x78) /* JS */
|
||||
JumpSIb(get_SF());break;
|
||||
JumpSIb(TFLG_S);break;
|
||||
CASE_B(0x79) /* JNS */
|
||||
JumpSIb(!get_SF());break;
|
||||
JumpSIb(TFLG_NS);break;
|
||||
CASE_B(0x7a) /* JP */
|
||||
JumpSIb(get_PF());break;
|
||||
JumpSIb(TFLG_P);break;
|
||||
CASE_B(0x7b) /* JNP */
|
||||
JumpSIb(!get_PF());break;
|
||||
JumpSIb(TFLG_NP);break;
|
||||
CASE_B(0x7c) /* JL */
|
||||
JumpSIb(get_SF() != get_OF());break;
|
||||
JumpSIb(TFLG_L);break;
|
||||
CASE_B(0x7d) /* JNL */
|
||||
JumpSIb(get_SF() == get_OF());break;
|
||||
JumpSIb(TFLG_NL);break;
|
||||
CASE_B(0x7e) /* JLE */
|
||||
JumpSIb(get_ZF() || (get_SF() != get_OF()));break;
|
||||
JumpSIb(TFLG_LE);break;
|
||||
CASE_B(0x7f) /* JNLE */
|
||||
JumpSIb((get_SF() == get_OF()) && !get_ZF());break;
|
||||
JumpSIb(TFLG_NLE);break;
|
||||
CASE_B(0x80) /* Grpl Eb,Ib */
|
||||
CASE_B(0x82) /* Grpl Eb,Ib Mirror instruction*/
|
||||
{
|
||||
|
@ -547,13 +547,9 @@
|
|||
CASE_W(0x9a) /* CALL Ap */
|
||||
{
|
||||
Bit16u newip=Fetchw();Bit16u newcs=Fetchw();
|
||||
SAVEIP;
|
||||
if (CPU_CALL(false,newcs,newip)) {
|
||||
LOADIP;
|
||||
} else {
|
||||
FillFlags();return CBRET_NONE;
|
||||
}
|
||||
break;
|
||||
LEAVECORE;
|
||||
CPU_CALL(false,newcs,newip);
|
||||
goto decode_start;
|
||||
}
|
||||
CASE_B(0x9b) /* WAIT */
|
||||
break; /* No waiting here */
|
||||
|
@ -737,32 +733,27 @@
|
|||
reg_bp=Pop_16();
|
||||
break;
|
||||
CASE_W(0xca) /* RETF Iw */
|
||||
{
|
||||
if (CPU_RET(false,Fetchw())) {
|
||||
LOADIP;
|
||||
} else {
|
||||
FillFlags();return CBRET_NONE;
|
||||
}
|
||||
break;
|
||||
{
|
||||
Bitu words=Fetchw();
|
||||
LEAVECORE;
|
||||
CPU_RET(false,words);
|
||||
goto decode_start;
|
||||
}
|
||||
CASE_W(0xcb) /* RETF */
|
||||
{
|
||||
if (CPU_RET(false,0)) {
|
||||
LOADIP;
|
||||
} else {
|
||||
FillFlags();return CBRET_NONE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
LEAVECORE;
|
||||
CPU_RET(false,0);
|
||||
goto decode_start;
|
||||
CASE_B(0xcc) /* INT3 */
|
||||
LEAVECORE;
|
||||
#if C_DEBUG
|
||||
if (DEBUG_Breakpoint()) {
|
||||
return debugCallback;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
CPU_SW_Interrupt(3);
|
||||
#if CPU_TRAP_CHECK
|
||||
core.trap.skip=true;
|
||||
if (!Interrupt(3)) return CBRET_NONE;
|
||||
#endif
|
||||
goto decode_start;
|
||||
CASE_B(0xcd) /* INT Ib */
|
||||
{
|
||||
|
@ -773,37 +764,39 @@
|
|||
return debugCallback;
|
||||
}
|
||||
#endif
|
||||
CPU_SW_Interrupt(num);
|
||||
#if CPU_TRAP_CHECK
|
||||
core.trap.skip=true;
|
||||
if (!Interrupt(num)) return CBRET_NONE;
|
||||
goto decode_start; //Restore IP with a LOADIP
|
||||
#endif
|
||||
goto decode_start;
|
||||
}
|
||||
break;
|
||||
CASE_B(0xce) /* INTO */
|
||||
if (get_OF()) {
|
||||
LEAVECORE;
|
||||
CPU_SW_Interrupt(4);
|
||||
#if CPU_TRAP_CHECK
|
||||
core.trap.skip=true;
|
||||
if (!Interrupt(4)) return CBRET_NONE;
|
||||
goto decode_start; //Restore IP with a LOADIP
|
||||
#endif
|
||||
goto decode_start;
|
||||
|
||||
}
|
||||
break;
|
||||
CASE_W(0xcf) /* IRET */
|
||||
{
|
||||
if (CPU_IRET(false)) {
|
||||
LEAVECORE;
|
||||
CPU_IRET(false);
|
||||
#ifdef CPU_PIC_CHECK
|
||||
if (GETFLAG(IF) && PIC_IRQCheck) return CBRET_NONE;
|
||||
if (GETFLAG(IF) && PIC_IRQCheck) return CBRET_NONE;
|
||||
#endif
|
||||
#if CPU_TRAP_CHECK
|
||||
if (GETFLAG(TF)) {
|
||||
cpudecoder=CPU_Core_Normal_Decode_Trap;
|
||||
return CBRET_NONE;
|
||||
}
|
||||
if (GETFLAG(TF)) {
|
||||
cpudecoder=CPU_Core_Normal_Decode_Trap;
|
||||
return CBRET_NONE;
|
||||
}
|
||||
#endif
|
||||
goto decode_start;
|
||||
} else {
|
||||
return CBRET_NONE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
CASE_B(0xd0) /* GRP2 Eb,1 */
|
||||
GRP2B(1);break;
|
||||
CASE_W(0xd1) /* GRP2 Ew,1 */
|
||||
|
@ -930,13 +923,9 @@
|
|||
{
|
||||
Bit16u newip=Fetchw();
|
||||
Bit16u newcs=Fetchw();
|
||||
SAVEIP;
|
||||
if (CPU_JMP(false,newcs,newip)) {
|
||||
LOADIP;
|
||||
} else {
|
||||
FillFlags();return CBRET_NONE;
|
||||
}
|
||||
break;
|
||||
LEAVECORE;
|
||||
CPU_JMP(false,newcs,newip);
|
||||
goto decode_start;
|
||||
}
|
||||
CASE_B(0xeb) /* JMP Jb */
|
||||
ADDIPFAST(Fetchbs());break;
|
||||
|
@ -963,8 +952,8 @@
|
|||
CPU_HLT();
|
||||
return CBRET_NONE;
|
||||
CASE_B(0xf5) /* CMC */
|
||||
SETFLAGBIT(CF,!get_CF());
|
||||
SetTypeCF() ;
|
||||
FillFlags();
|
||||
SETFLAGBIT(CF,!(reg_flags & FLAG_CF));
|
||||
break;
|
||||
CASE_B(0xf6) /* GRP3 Eb(,Ib) */
|
||||
{
|
||||
|
@ -1055,12 +1044,12 @@
|
|||
break;
|
||||
}
|
||||
CASE_B(0xf8) /* CLC */
|
||||
FillFlags();
|
||||
SETFLAGBIT(CF,false);
|
||||
SetTypeCF();
|
||||
break;
|
||||
CASE_B(0xf9) /* STC */
|
||||
FillFlags();
|
||||
SETFLAGBIT(CF,true);
|
||||
SetTypeCF();
|
||||
break;
|
||||
CASE_B(0xfa) /* CLI */
|
||||
SETFLAGBIT(IF,false);
|
||||
|
@ -1118,12 +1107,9 @@
|
|||
GetEAa;
|
||||
Bit16u newip=LoadMw(eaa);
|
||||
Bit16u newcs=LoadMw(eaa+2);
|
||||
SAVEIP;
|
||||
if (CPU_CALL(false,newcs,newip)) {
|
||||
LOADIP;
|
||||
} else {
|
||||
FillFlags();return CBRET_NONE;
|
||||
}
|
||||
LEAVECORE;
|
||||
CPU_CALL(false,newcs,newip);
|
||||
goto decode_start;
|
||||
}
|
||||
break;
|
||||
case 0x04: /* JMP Ev */
|
||||
|
@ -1135,12 +1121,10 @@
|
|||
GetEAa;
|
||||
Bit16u newip=LoadMw(eaa);
|
||||
Bit16u newcs=LoadMw(eaa+2);
|
||||
SAVEIP;
|
||||
if (CPU_JMP(false,newcs,newip)) {
|
||||
LOADIP;
|
||||
} else {
|
||||
FillFlags();return CBRET_NONE;
|
||||
} }
|
||||
LEAVECORE;
|
||||
CPU_JMP(false,newcs,newip);
|
||||
goto decode_start;
|
||||
}
|
||||
break;
|
||||
case 0x06: /* PUSH Ev */
|
||||
if (rm >= 0xc0 ) {GetEArw;Push_16(*earw);}
|
||||
|
|
|
@ -47,9 +47,8 @@ static INLINE void ADDIPFAST(Bits blah) {
|
|||
Bit8u new_num=blah; \
|
||||
core.ip_lookup=core.op_start; \
|
||||
LEAVECORE; \
|
||||
if (Interrupt(new_num)) { \
|
||||
goto decode_start; \
|
||||
} else return CBRET_NONE; \
|
||||
CPU_Exception(new_num); \
|
||||
goto decode_start; \
|
||||
}
|
||||
|
||||
static INLINE Bit8u Fetchb() {
|
||||
|
|
Loading…
Add table
Reference in a new issue