1
0
Fork 0

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:
Sjoerd van der Berg 2003-11-05 19:48:49 +00:00
parent f28bdda7b1
commit b4753c5c62
6 changed files with 155 additions and 203 deletions

View file

@ -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;
}
}

View file

@ -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 */

View file

@ -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 */

View file

@ -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 */

View file

@ -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);}

View file

@ -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() {