1
0
Fork 0

Fix flag behaviour of several shift/rotate instructions, cause exceptions and fix potention 'pop ss' problems

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@4256
This commit is contained in:
Sjoerd van der Berg 2019-09-08 12:42:21 +00:00
parent 53666d5f27
commit bca40f5561
5 changed files with 33 additions and 65 deletions

View file

@ -228,14 +228,6 @@
#define ROLB(op1,op2,load,save) \
if (!(op2&0x7)) { \
if (op2&0x18) { \
FillFlagsNoCFOF(); \
SETFLAGBIT(CF,op1 & 1); \
SETFLAGBIT(OF,(op1 & 1) ^ (op1 >> 7)); \
} \
break; \
} \
FillFlagsNoCFOF(); \
lf_var1b=load(op1); \
lf_var2b=op2&0x07; \
@ -246,14 +238,6 @@
SETFLAGBIT(OF,(lf_resb & 1) ^ (lf_resb >> 7));
#define ROLW(op1,op2,load,save) \
if (!(op2&0xf)) { \
if (op2&0x10) { \
FillFlagsNoCFOF(); \
SETFLAGBIT(CF,op1 & 1); \
SETFLAGBIT(OF,(op1 & 1) ^ (op1 >> 15)); \
} \
break; \
} \
FillFlagsNoCFOF(); \
lf_var1w=load(op1); \
lf_var2b=op2&0xf; \
@ -264,7 +248,6 @@
SETFLAGBIT(OF,(lf_resw & 1) ^ (lf_resw >> 15));
#define ROLD(op1,op2,load,save) \
if (!op2) break; \
FillFlagsNoCFOF(); \
lf_var1d=load(op1); \
lf_var2b=op2; \
@ -276,14 +259,6 @@
#define RORB(op1,op2,load,save) \
if (!(op2&0x7)) { \
if (op2&0x18) { \
FillFlagsNoCFOF(); \
SETFLAGBIT(CF,op1>>7); \
SETFLAGBIT(OF,(op1>>7) ^ ((op1>>6) & 1)); \
} \
break; \
} \
FillFlagsNoCFOF(); \
lf_var1b=load(op1); \
lf_var2b=op2&0x07; \
@ -294,14 +269,6 @@
SETFLAGBIT(OF,(lf_resb ^ (lf_resb<<1)) & 0x80);
#define RORW(op1,op2,load,save) \
if (!(op2&0xf)) { \
if (op2&0x10) { \
FillFlagsNoCFOF(); \
SETFLAGBIT(CF,op1>>15); \
SETFLAGBIT(OF,(op1>>15) ^ ((op1>>14) & 1)); \
} \
break; \
} \
FillFlagsNoCFOF(); \
lf_var1w=load(op1); \
lf_var2b=op2&0xf; \
@ -312,7 +279,6 @@
SETFLAGBIT(OF,(lf_resw ^ (lf_resw<<1)) & 0x8000);
#define RORD(op1,op2,load,save) \
if (!op2) break; \
FillFlagsNoCFOF(); \
lf_var1d=load(op1); \
lf_var2b=op2; \
@ -366,8 +332,6 @@
SETFLAGBIT(OF,(reg_flags & 1) ^ (lf_resd >> 31)); \
}
#define RCRB(op1,op2,load,save) \
if (op2%9) { \
Bit8u cf=(Bit8u)FillFlags()&0x1; \
@ -413,21 +377,18 @@
#define SHLB(op1,op2,load,save) \
if (!op2) break; \
lf_var1b=load(op1);lf_var2b=op2; \
lf_resb=lf_var1b << lf_var2b; \
save(op1,lf_resb); \
lflags.type=t_SHLb;
#define SHLW(op1,op2,load,save) \
if (!op2) break; \
lf_var1w=load(op1);lf_var2b=op2 ; \
lf_resw=lf_var1w << lf_var2b; \
save(op1,lf_resw); \
lflags.type=t_SHLw;
#define SHLD(op1,op2,load,save) \
if (!op2) break; \
lf_var1d=load(op1);lf_var2b=op2; \
lf_resd=lf_var1d << lf_var2b; \
save(op1,lf_resd); \
@ -435,21 +396,18 @@
#define SHRB(op1,op2,load,save) \
if (!op2) break; \
lf_var1b=load(op1);lf_var2b=op2; \
lf_resb=lf_var1b >> lf_var2b; \
save(op1,lf_resb); \
lflags.type=t_SHRb;
#define SHRW(op1,op2,load,save) \
if (!op2) break; \
lf_var1w=load(op1);lf_var2b=op2; \
lf_resw=lf_var1w >> lf_var2b; \
save(op1,lf_resw); \
lflags.type=t_SHRw;
#define SHRD(op1,op2,load,save) \
if (!op2) break; \
lf_var1d=load(op1);lf_var2b=op2; \
lf_resd=lf_var1d >> lf_var2b; \
save(op1,lf_resd); \
@ -457,7 +415,6 @@
#define SARB(op1,op2,load,save) \
if (!op2) break; \
lf_var1b=load(op1);lf_var2b=op2; \
if (lf_var2b>8) lf_var2b=8; \
if (lf_var1b & 0x80) { \
@ -470,7 +427,6 @@
lflags.type=t_SARb;
#define SARW(op1,op2,load,save) \
if (!op2) break; \
lf_var1w=load(op1);lf_var2b=op2; \
if (lf_var2b>16) lf_var2b=16; \
if (lf_var1w & 0x8000) { \
@ -483,7 +439,6 @@
lflags.type=t_SARw;
#define SARD(op1,op2,load,save) \
if (!op2) break; \
lf_var2b=op2;lf_var1d=load(op1); \
if (lf_var1d & 0x80000000) { \
lf_resd=(lf_var1d >> lf_var2b)| \
@ -836,6 +791,7 @@
if (rm >= 0xc0) { \
GetEArb; \
Bit8u val=blah & 0x1f; \
if (!val) break; \
switch (which) { \
case 0x00:ROLB(*earb,val,LoadRb,SaveRb);break; \
case 0x01:RORB(*earb,val,LoadRb,SaveRb);break; \
@ -849,6 +805,7 @@
} else { \
GetEAa; \
Bit8u val=blah & 0x1f; \
if (!val) break; \
switch (which) { \
case 0x00:ROLB(eaa,val,LoadMb,SaveMb);break; \
case 0x01:RORB(eaa,val,LoadMb,SaveMb);break; \
@ -870,6 +827,7 @@
if (rm >= 0xc0) { \
GetEArw; \
Bit8u val=blah & 0x1f; \
if (!val) break; \
switch (which) { \
case 0x00:ROLW(*earw,val,LoadRw,SaveRw);break; \
case 0x01:RORW(*earw,val,LoadRw,SaveRw);break; \
@ -883,6 +841,7 @@
} else { \
GetEAa; \
Bit8u val=blah & 0x1f; \
if (!val) break; \
switch (which) { \
case 0x00:ROLW(eaa,val,LoadMw,SaveMw);break; \
case 0x01:RORW(eaa,val,LoadMw,SaveMw);break; \
@ -903,6 +862,7 @@
if (rm >= 0xc0) { \
GetEArd; \
Bit8u val=blah & 0x1f; \
if (!val) break; \
switch (which) { \
case 0x00:ROLD(*eard,val,LoadRd,SaveRd);break; \
case 0x01:RORD(*eard,val,LoadRd,SaveRd);break; \
@ -916,6 +876,7 @@
} else { \
GetEAa; \
Bit8u val=blah & 0x1f; \
if (!val) break; \
switch (which) { \
case 0x00:ROLD(eaa,val,LoadMd,SaveMd);break; \
case 0x01:RORD(eaa,val,LoadMd,SaveMd);break; \