1
0
Fork 0

move some FillFlags calls into their respective cpu function;

change some cpu functions to directly return values


Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2864
This commit is contained in:
Sebastian Strohhäcker 2007-06-01 16:40:40 +00:00
parent fb1ef3c95d
commit 43de744e01
14 changed files with 99 additions and 134 deletions

View file

@ -68,10 +68,12 @@ bool CPU_LTR(Bitu selector);
void CPU_LIDT(Bitu limit,Bitu base);
void CPU_LGDT(Bitu limit,Bitu base);
void CPU_STR(Bitu & selector);
void CPU_SLDT(Bitu & selector);
void CPU_SIDT(Bitu & limit,Bitu & base);
void CPU_SGDT(Bitu & limit,Bitu & base);
Bitu CPU_STR(void);
Bitu CPU_SLDT(void);
Bitu CPU_SIDT_base(void);
Bitu CPU_SIDT_limit(void);
Bitu CPU_SGDT_base(void);
Bitu CPU_SGDT_limit(void);
void CPU_ARPL(Bitu & dest_sel,Bitu src_sel);
void CPU_LAR(Bitu selector,Bitu & ar);
@ -88,8 +90,8 @@ bool CPU_READ_DRX(Bitu dr,Bit32u & retvalue);
bool CPU_WRITE_TRX(Bitu dr,Bitu value);
bool CPU_READ_TRX(Bitu dr,Bit32u & retvalue);
void CPU_SMSW(Bitu & word);
Bitu CPU_LMSW(Bitu word);
Bitu CPU_SMSW(void);
bool CPU_LMSW(Bitu word);
void CPU_VERR(Bitu selector);
void CPU_VERW(Bitu selector);

View file

@ -284,14 +284,12 @@ l_M_Ed:
inst_op1_d=4;
break;
case D_IRETw:
FillFlags();
CPU_IRET(false,GetIP());
if (GETFLAG(IF) && PIC_IRQCheck) {
return CBRET_NONE;
}
continue;
case D_IRETd:
FillFlags();
CPU_IRET(true,GetIP());
if (GETFLAG(IF) && PIC_IRQCheck)
return CBRET_NONE;
@ -407,12 +405,10 @@ l_M_Ed:
cpu.direction=-1;
goto nextopcode;
case D_PUSHF:
FillFlags();
if (CPU_PUSHF(inst.code.extra)) RunException();
goto nextopcode;
case D_POPF:
if (CPU_POPF(inst.code.extra)) RunException();
lflags.type=t_UNKNOWN;
if (GETFLAG(IF) && PIC_IRQCheck) {
SaveIP();
return CBRET_NONE;
@ -481,7 +477,6 @@ l_M_Ed:
cpu.cr0&=(~CR0_TASKSWITCH);
goto nextopcode;
case D_ICEBP:
FillFlags();
CPU_SW_Interrupt_NoIOPLCheck(1,GetIP());
continue;
default:

View file

@ -3,7 +3,6 @@
#define GetIP() (inst.cseip-SegBase(cs))
#define RunException() { \
FillFlags(); \
CPU_Exception(cpu.exception.which,cpu.exception.error); \
continue; \
}

View file

@ -338,8 +338,8 @@ switch (inst.code.op) {
CPU_JMP(true,inst_op2_d,inst_op1_d,GetIP());
continue;
case O_INT:
FillFlags();
#if C_DEBUG
FillFlags();
if (((inst.entry & 0xFF)==0xcc) && DEBUG_Breakpoint())
return debugCallback;
else if (DEBUG_IntBreakpoint(inst_op1_b))
@ -379,18 +379,10 @@ switch (inst.code.op) {
if ((reg_flags & FLAG_VM) || (!cpu.pmode)) goto illegalopcode;
switch (inst.rm_index) {
case 0x00: /* SLDT */
{
Bitu selector;
CPU_SLDT(selector);
inst_op1_d=(Bit32u)selector;
}
inst_op1_d=(Bit32u)CPU_SLDT();
break;
case 0x01: /* STR */
{
Bitu selector;
CPU_STR(selector);
inst_op1_d=(Bit32u)selector;
}
inst_op1_d=(Bit32u)CPU_STR();
break;
case 0x02: /* LLDT */
if (cpu.cpl) EXCEPTION(EXCEPTION_GP);
@ -401,11 +393,9 @@ switch (inst.code.op) {
if (CPU_LTR(inst_op1_d)) RunException();
goto nextopcode; /* Else value will saved */
case 0x04: /* VERR */
FillFlags();
CPU_VERR(inst_op1_d);
goto nextopcode; /* Else value will saved */
case 0x05: /* VERW */
FillFlags();
CPU_VERW(inst_op1_d);
goto nextopcode; /* Else value will saved */
default:
@ -417,21 +407,13 @@ switch (inst.code.op) {
case O_GRP7d:
switch (inst.rm_index) {
case 0: /* SGDT */
{
Bitu limit,base;
CPU_SGDT(limit,base);
SaveMw(inst.rm_eaa,limit);
SaveMd(inst.rm_eaa+2,base);
goto nextopcode;
}
SaveMw(inst.rm_eaa,CPU_SGDT_limit());
SaveMd(inst.rm_eaa+2,CPU_SGDT_base());
goto nextopcode;
case 1: /* SIDT */
{
Bitu limit,base;
CPU_SIDT(limit,base);
SaveMw(inst.rm_eaa,limit);
SaveMd(inst.rm_eaa+2,base);
goto nextopcode;
}
SaveMw(inst.rm_eaa,CPU_SIDT_limit());
SaveMd(inst.rm_eaa+2,CPU_SIDT_base());
goto nextopcode;
case 2: /* LGDT */
if (cpu.pmode && cpu.cpl) EXCEPTION(EXCEPTION_GP);
CPU_LGDT(LoadMw(inst.rm_eaa),LoadMd(inst.rm_eaa+2)&((inst.code.op == O_GRP7w) ? 0xFFFFFF : 0xFFFFFFFF));
@ -441,11 +423,8 @@ switch (inst.code.op) {
CPU_LIDT(LoadMw(inst.rm_eaa),LoadMd(inst.rm_eaa+2)&((inst.code.op == O_GRP7w) ? 0xFFFFFF : 0xFFFFFFFF));
goto nextopcode;
case 4: /* SMSW */
{
Bitu word;CPU_SMSW(word);
inst_op1_d=word;
break;
}
inst_op1_d=CPU_SMSW();
break;
case 6: /* LMSW */
FillFlags();
if (CPU_LMSW(inst_op1_w)) RunException();
@ -481,7 +460,6 @@ switch (inst.code.op) {
case O_LAR:
{
if ((reg_flags & FLAG_VM) || (!cpu.pmode)) goto illegalopcode;
FillFlags();
Bitu ar=inst_op2_d;
CPU_LAR(inst_op1_w,ar);
inst_op1_d=(Bit32u)ar;
@ -490,7 +468,6 @@ switch (inst.code.op) {
case O_LSL:
{
if ((reg_flags & FLAG_VM) || (!cpu.pmode)) goto illegalopcode;
FillFlags();
Bitu limit=inst_op2_d;
CPU_LSL(inst_op1_w,limit);
inst_op1_d=(Bit32u)limit;
@ -499,7 +476,6 @@ switch (inst.code.op) {
case O_ARPL:
{
if ((reg_flags & FLAG_VM) || !cpu.pmode) goto illegalopcode;
FillFlags();
Bitu new_sel=inst_op1_d;
CPU_ARPL(new_sel,inst_op2_d);
inst_op1_d=(Bit32u)new_sel;

View file

@ -25,15 +25,14 @@
case 0x01: /* STR */
{
Bitu saveval;
if (!which) CPU_SLDT(saveval);
else CPU_STR(saveval);
if (!which) saveval=CPU_SLDT();
else saveval=CPU_STR();
if (rm >= 0xc0) {GetEArw;*earw=saveval;}
else {GetEAa;SaveMw(eaa,saveval);}
}
break;
case 0x02:case 0x03:case 0x04:case 0x05:
{
FillFlags();
Bitu loadval;
if (rm >= 0xc0 ) {GetEArw;loadval=*earw;}
else {GetEAa;loadval=LoadMw(eaa);}
@ -64,17 +63,15 @@
{
GetRM;Bitu which=(rm>>3)&7;
if (rm < 0xc0) { //First ones all use EA
GetEAa;Bitu limit,base;
GetEAa;Bitu limit;
switch (which) {
case 0x00: /* SGDT */
CPU_SGDT(limit,base);
SaveMw(eaa,limit);
SaveMd(eaa+2,base);
SaveMw(eaa,CPU_SGDT_limit());
SaveMd(eaa+2,CPU_SGDT_base());
break;
case 0x01: /* SIDT */
CPU_SIDT(limit,base);
SaveMw(eaa,limit);
SaveMd(eaa+2,base);
SaveMw(eaa,CPU_SIDT_limit());
SaveMd(eaa+2,CPU_SIDT_base());
break;
case 0x02: /* LGDT */
if (cpu.pmode && cpu.cpl) EXCEPTION(EXCEPTION_GP);
@ -85,8 +82,7 @@
CPU_LIDT(LoadMw(eaa),LoadMd(eaa+2) & 0xFFFFFF);
break;
case 0x04: /* SMSW */
CPU_SMSW(limit);
SaveMw(eaa,limit);
SaveMw(eaa,CPU_SMSW());
break;
case 0x06: /* LMSW */
limit=LoadMw(eaa);
@ -98,7 +94,7 @@
break;
}
} else {
GetEArw;Bitu limit;
GetEArw;
switch (which) {
case 0x02: /* LGDT */
if (cpu.pmode && cpu.cpl) EXCEPTION(EXCEPTION_GP);
@ -107,8 +103,7 @@
if (cpu.pmode && cpu.cpl) EXCEPTION(EXCEPTION_GP);
goto illegal_opcode;
case 0x04: /* SMSW */
CPU_SMSW(limit);
*earw=limit;
*earw=CPU_SMSW();
break;
case 0x06: /* LMSW */
if (CPU_LMSW(*earw)) RUNEXCEPTION();
@ -122,7 +117,6 @@
CASE_0F_W(0x02) /* LAR Gw,Ew */
{
if ((reg_flags & FLAG_VM) || (!cpu.pmode)) goto illegal_opcode;
FillFlags();
GetRMrw;Bitu ar=*rmrw;
if (rm >= 0xc0) {
GetEArw;CPU_LAR(*earw,ar);
@ -135,7 +129,6 @@
CASE_0F_W(0x03) /* LSL Gw,Ew */
{
if ((reg_flags & FLAG_VM) || (!cpu.pmode)) goto illegal_opcode;
FillFlags();
GetRMrw;Bitu limit=*rmrw;
if (rm >= 0xc0) {
GetEArw;CPU_LSL(*earw,limit);

View file

@ -170,7 +170,6 @@
CASE_D(0x63) /* ARPL Ed,Rd */
{
if (((cpu.pmode) && (reg_flags & FLAG_VM)) || (!cpu.pmode)) goto illegal_opcode;
FillFlags();
GetRMrw;
if (rm >= 0xc0 ) {
GetEArd;Bitu new_sel=(Bit16u)*eard;
@ -398,12 +397,10 @@
continue;
}
CASE_D(0x9c) /* PUSHFD */
FillFlags();
if (CPU_PUSHF(true)) RUNEXCEPTION();
break;
CASE_D(0x9d) /* POPFD */
if (CPU_POPF(true)) RUNEXCEPTION();
lflags.type=t_UNKNOWN;
#if CPU_TRAP_CHECK
if (GETFLAG(TF)) {
cpudecoder=CPU_Core_Normal_Trap_Run;
@ -511,7 +508,6 @@
}
CASE_D(0xcf) /* IRET */
{
FillFlags();
CPU_IRET(true,GETIP);
#if CPU_TRAP_CHECK
if (GETFLAG(TF)) {

View file

@ -25,8 +25,8 @@
case 0x01: /* STR */
{
Bitu saveval;
if (!which) CPU_SLDT(saveval);
else CPU_STR(saveval);
if (!which) saveval=CPU_SLDT();
else saveval=CPU_STR();
if (rm >= 0xc0) {GetEArw;*earw=(Bit16u)saveval;}
else {GetEAa;SaveMw(eaa,saveval);}
}
@ -34,7 +34,6 @@
case 0x02:case 0x03:case 0x04:case 0x05:
{
/* Just use 16-bit loads since were only using selectors */
FillFlags();
Bitu loadval;
if (rm >= 0xc0 ) {GetEArw;loadval=*earw;}
else {GetEAa;loadval=LoadMw(eaa);}
@ -66,17 +65,15 @@
{
GetRM;Bitu which=(rm>>3)&7;
if (rm < 0xc0) { //First ones all use EA
GetEAa;Bitu limit,base;
GetEAa;Bitu limit;
switch (which) {
case 0x00: /* SGDT */
CPU_SGDT(limit,base);
SaveMw(eaa,(Bit16u)limit);
SaveMd(eaa+2,(Bit32u)base);
SaveMw(eaa,(Bit16u)CPU_SGDT_limit());
SaveMd(eaa+2,(Bit32u)CPU_SGDT_base());
break;
case 0x01: /* SIDT */
CPU_SIDT(limit,base);
SaveMw(eaa,(Bit16u)limit);
SaveMd(eaa+2,(Bit32u)base);
SaveMw(eaa,(Bit16u)CPU_SIDT_limit());
SaveMd(eaa+2,(Bit32u)CPU_SIDT_base());
break;
case 0x02: /* LGDT */
if (cpu.pmode && cpu.cpl) EXCEPTION(EXCEPTION_GP);
@ -87,8 +84,7 @@
CPU_LIDT(LoadMw(eaa),LoadMd(eaa+2));
break;
case 0x04: /* SMSW */
CPU_SMSW(limit);
SaveMw(eaa,(Bit16u)limit);
SaveMw(eaa,(Bit16u)CPU_SMSW());
break;
case 0x06: /* LMSW */
limit=LoadMw(eaa);
@ -100,7 +96,7 @@
break;
}
} else {
GetEArd;Bitu limit;
GetEArd;
switch (which) {
case 0x02: /* LGDT */
if (cpu.pmode && cpu.cpl) EXCEPTION(EXCEPTION_GP);
@ -109,8 +105,7 @@
if (cpu.pmode && cpu.cpl) EXCEPTION(EXCEPTION_GP);
goto illegal_opcode;
case 0x04: /* SMSW */
CPU_SMSW(limit);
*eard=(Bit32u)limit;
*eard=(Bit32u)CPU_SMSW();
break;
case 0x06: /* LMSW */
if (CPU_LMSW(*eard)) RUNEXCEPTION();
@ -127,7 +122,6 @@
CASE_0F_D(0x02) /* LAR Gd,Ed */
{
if ((reg_flags & FLAG_VM) || (!cpu.pmode)) goto illegal_opcode;
FillFlags();
GetRMrd;Bitu ar=*rmrd;
if (rm >= 0xc0) {
GetEArw;CPU_LAR(*earw,ar);
@ -140,7 +134,6 @@
CASE_0F_D(0x03) /* LSL Gd,Ew */
{
if ((reg_flags & FLAG_VM) || (!cpu.pmode)) goto illegal_opcode;
FillFlags();
GetRMrd;Bitu limit=*rmrd;
/* Just load 16-bit values for selectors */
if (rm >= 0xc0) {

View file

@ -239,7 +239,6 @@
CASE_W(0x63) /* ARPL Ew,Rw */
{
if ((reg_flags & FLAG_VM) || (!cpu.pmode)) goto illegal_opcode;
FillFlags();
GetRMrw;
if (rm >= 0xc0 ) {
GetEArw;Bitu new_sel=*earw;
@ -574,12 +573,10 @@
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;
@ -740,8 +737,8 @@
CPU_RET(false,0,GETIP);
continue;
CASE_B(0xcc) /* INT3 */
FillFlags();
#if C_DEBUG
FillFlags();
if (DEBUG_Breakpoint())
return debugCallback;
#endif
@ -753,8 +750,8 @@
CASE_B(0xcd) /* INT Ib */
{
Bit8u num=Fetchb();
FillFlags();
#if C_DEBUG
FillFlags();
if (DEBUG_IntBreakpoint(num)) {
return debugCallback;
}
@ -767,7 +764,6 @@
}
CASE_B(0xce) /* INTO */
if (get_OF()) {
FillFlags();
CPU_SW_Interrupt(4,GETIP);
#if CPU_TRAP_CHECK
cpu.trap_skip=true;
@ -777,7 +773,6 @@
break;
CASE_W(0xcf) /* IRET */
{
FillFlags();
CPU_IRET(false,GETIP);
#if CPU_TRAP_CHECK
if (GETFLAG(TF)) {
@ -953,7 +948,6 @@
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;

View file

@ -42,7 +42,6 @@ static INLINE Bit32s Fetchds() {
#define RUNEXCEPTION() { \
FillFlags(); \
CPU_Exception(cpu.exception.which,cpu.exception.error); \
continue; \
}

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: cpu.cpp,v 1.99 2007-04-14 11:16:29 c2woody Exp $ */
/* $Id: cpu.cpp,v 1.100 2007-06-01 16:40:40 c2woody Exp $ */
#include <assert.h>
#include <sstream>
@ -27,6 +27,7 @@
#include "mapper.h"
#include "setup.h"
#include "paging.h"
#include "lazyflags.h"
#include "support.h"
Bitu DEBUG_EnableDebugger(void);
@ -62,10 +63,12 @@ Bitu CPU_AutoDetermineMode;
void CPU_Core_Full_Init(void);
void CPU_Core_Normal_Init(void);
void CPU_Core_Simple_Init(void);
#if (C_DYNAMIC_X86)
void CPU_Core_Dyn_X86_Init(void);
void CPU_Core_Dyn_X86_Cache_Init(bool enable_cache);
void CPU_Core_Dyn_X86_Cache_Close(void);
void CPU_Core_Dyn_X86_SetFPUMode(bool dh_fpu);
#endif
/* In debug mode exceptions are tested and dosbox exits when
* a unhandled exception state is detected.
@ -178,6 +181,7 @@ bool CPU_POPF(Bitu use32) {
if (use32)
CPU_SetFlags(CPU_Pop32(),mask);
else CPU_SetFlags(CPU_Pop16(),mask & 0xffff);
DestroyConditionFlags();
return false;
}
@ -186,6 +190,7 @@ bool CPU_PUSHF(Bitu use32) {
/* Not enough privileges to execute PUSHF */
return CPU_PrepareException(EXCEPTION_GP,0);
}
FillFlags();
if (use32)
CPU_Push32(reg_flags & 0xfcffff);
else CPU_Push16(reg_flags);
@ -258,6 +263,7 @@ enum TSwitchType {
};
bool CPU_SwitchTask(Bitu new_tss_selector,TSwitchType tstype,Bitu old_eip) {
FillFlags();
TaskStateSegment new_tss;
if (!new_tss.SetSelector(new_tss_selector))
E_Exit("Illegal TSS for switch, selector=%x, switchtype=%x",new_tss_selector,tstype);
@ -447,6 +453,7 @@ void CPU_Exception(Bitu which,Bitu error ) {
Bit8u lastint;
void CPU_Interrupt(Bitu num,Bitu type,Bitu oldeip) {
lastint=num;
FillFlags();
#if C_DEBUG
switch (num) {
case 0xcd:
@ -666,6 +673,7 @@ void CPU_IRET(bool use32,Bitu oldeip) {
CPU_SetFlags(CPU_Pop16(),FMASK_ALL & 0xffff);
}
cpu.code.big=false;
DestroyConditionFlags();
return;
} else { /* Protected mode IRET */
if (reg_flags & FLAG_VM) {
@ -686,6 +694,7 @@ void CPU_IRET(bool use32,Bitu oldeip) {
CPU_SetFlags(CPU_Pop16(),FMASK_NORMAL|FLAG_NT);
}
cpu.code.big=false;
DestroyConditionFlags();
return;
}
}
@ -717,6 +726,7 @@ void CPU_IRET(bool use32,Bitu oldeip) {
n_gs=CPU_Pop32() & 0xffff;
CPU_SetFlags(n_flags,FMASK_ALL | FLAG_VM);
DestroyConditionFlags();
cpu.cpl=3;
CPU_SetSegGeneral(ss,n_ss);
@ -779,6 +789,7 @@ void CPU_IRET(bool use32,Bitu oldeip) {
Bitu mask=cpu.cpl ? (FMASK_NORMAL | FLAG_NT) : FMASK_ALL;
if (GETFLAG_IOPL<cpu.cpl) mask &= (~FLAG_IF);
CPU_SetFlags(n_flags,mask);
DestroyConditionFlags();
LOG(LOG_CPU,LOG_NORMAL)("IRET:Same level:%X:%X big %d",n_cs_sel,n_eip,cpu.code.big);
} else {
/* Return to outer level */
@ -823,6 +834,7 @@ void CPU_IRET(bool use32,Bitu oldeip) {
Bitu mask=cpu.cpl ? (FMASK_NORMAL | FLAG_NT) : FMASK_ALL;
if (GETFLAG_IOPL<cpu.cpl) mask &= (~FLAG_IF);
CPU_SetFlags(n_flags,mask);
DestroyConditionFlags();
cpu.cpl=n_cs_rpl;
reg_eip=n_eip;
@ -1377,8 +1389,8 @@ RET_same_level:
}
void CPU_SLDT(Bitu & selector) {
selector=cpu.gdt.SLDT();
Bitu CPU_SLDT(void) {
return cpu.gdt.SLDT();
}
bool CPU_LLDT(Bitu selector) {
@ -1390,8 +1402,8 @@ bool CPU_LLDT(Bitu selector) {
return false;
}
void CPU_STR(Bitu & selector) {
selector=cpu_tss.selector;
Bitu CPU_STR(void) {
return cpu_tss.selector;
}
bool CPU_LTR(Bitu selector) {
@ -1433,14 +1445,18 @@ void CPU_LIDT(Bitu limit,Bitu base) {
cpu.idt.SetBase(base);
}
void CPU_SGDT(Bitu & limit,Bitu & base) {
limit=cpu.gdt.GetLimit();
base=cpu.gdt.GetBase();
Bitu CPU_SGDT_base(void) {
return cpu.gdt.GetBase();
}
Bitu CPU_SGDT_limit(void) {
return cpu.gdt.GetLimit();
}
void CPU_SIDT(Bitu & limit,Bitu & base) {
limit=cpu.idt.GetLimit();
base=cpu.idt.GetBase();
Bitu CPU_SIDT_base(void) {
return cpu.idt.GetBase();
}
Bitu CPU_SIDT_limit(void) {
return cpu.idt.GetLimit();
}
@ -1610,11 +1626,11 @@ bool CPU_READ_TRX(Bitu tr,Bit32u & retvalue) {
}
void CPU_SMSW(Bitu & word) {
word=cpu.cr0;
Bitu CPU_SMSW(void) {
return cpu.cr0;
}
Bitu CPU_LMSW(Bitu word) {
bool CPU_LMSW(Bitu word) {
if (cpu.pmode && (cpu.cpl>0)) return CPU_PrepareException(EXCEPTION_GP,0);
word&=0xf;
if (cpu.cr0 & 1) word|=1;
@ -1624,6 +1640,7 @@ Bitu CPU_LMSW(Bitu word) {
}
void CPU_ARPL(Bitu & dest_sel,Bitu src_sel) {
FillFlags();
if ((dest_sel & 3) < (src_sel & 3)) {
dest_sel=(dest_sel & 0xfffc) + (src_sel & 3);
// dest_sel|=0xff3f0000;
@ -1634,6 +1651,7 @@ void CPU_ARPL(Bitu & dest_sel,Bitu src_sel) {
}
void CPU_LAR(Bitu selector,Bitu & ar) {
FillFlags();
if (selector == 0) {
SETFLAGBIT(ZF,false);
return;
@ -1685,6 +1703,7 @@ void CPU_LAR(Bitu selector,Bitu & ar) {
}
void CPU_LSL(Bitu selector,Bitu & limit) {
FillFlags();
if (selector == 0) {
SETFLAGBIT(ZF,false);
return;
@ -1727,6 +1746,7 @@ void CPU_LSL(Bitu selector,Bitu & limit) {
}
void CPU_VERR(Bitu selector) {
FillFlags();
if (selector == 0) {
SETFLAGBIT(ZF,false);
return;
@ -1759,6 +1779,7 @@ void CPU_VERR(Bitu selector) {
}
void CPU_VERW(Bitu selector) {
FillFlags();
if (selector == 0) {
SETFLAGBIT(ZF,false);
return;

View file

@ -31,7 +31,7 @@ LazyFlags lflags;
/* CF Carry Flag -- Set on high-order bit carry or borrow; cleared
otherwise.
*/
Bitu get_CF(void) {
Bit32u get_CF(void) {
switch (lflags.type) {
case t_UNKNOWN:
@ -43,7 +43,6 @@ Bitu get_CF(void) {
case t_DECd:
case t_MUL:
return GETFLAG(CF);
break;
case t_ADDb:
return (lf_resb<lf_var1b);
case t_ADDw:
@ -129,7 +128,7 @@ Bitu get_CF(void) {
four bits of AL; cleared otherwise. Used for decimal
arithmetic.
*/
Bitu get_AF(void) {
Bit32u get_AF(void) {
Bitu type=lflags.type;
switch (type) {
case t_UNKNOWN:
@ -207,7 +206,7 @@ Bitu get_AF(void) {
/* ZF Zero Flag -- Set if result is zero; cleared otherwise.
*/
Bitu get_ZF(void) {
Bit32u get_ZF(void) {
Bitu type=lflags.type;
switch (type) {
case t_UNKNOWN:
@ -275,7 +274,7 @@ Bitu get_ZF(void) {
/* SF Sign Flag -- Set equal to high-order bit of result (0 is
positive, 1 if negative).
*/
Bitu get_SF(void) {
Bit32u get_SF(void) {
Bitu type=lflags.type;
switch (type) {
case t_UNKNOWN:
@ -341,7 +340,7 @@ Bitu get_SF(void) {
return false;
}
Bitu get_OF(void) {
Bit32u get_OF(void) {
Bitu type=lflags.type;
switch (type) {
case t_UNKNOWN:
@ -442,14 +441,14 @@ Bit16u parity_lookup[256] = {
FLAG_PF, 0, 0, FLAG_PF, 0, FLAG_PF, FLAG_PF, 0, 0, FLAG_PF, FLAG_PF, 0, FLAG_PF, 0, 0, FLAG_PF
};
Bitu get_PF(void) {
Bit32u get_PF(void) {
switch (lflags.type) {
case t_UNKNOWN:
return GETFLAG(PF);
default:
return (parity_lookup[lf_resb]);;
return (parity_lookup[lf_resb]);
};
return false;
return 0;
}
@ -860,4 +859,8 @@ Bitu FillFlags(void) {
return reg_flags;
}
void DestroyConditionFlags(void) {
lflags.type=t_UNKNOWN;
}
#endif

View file

@ -20,14 +20,15 @@
#define __LAZYFLAG_H
//Flag Handling
Bitu get_CF(void);
Bitu get_AF(void);
Bitu get_ZF(void);
Bitu get_SF(void);
Bitu get_OF(void);
Bitu get_PF(void);
Bit32u get_CF(void);
Bit32u get_AF(void);
Bit32u get_ZF(void);
Bit32u get_SF(void);
Bit32u get_OF(void);
Bit32u get_PF(void);
Bitu FillFlags(void);
void DestroyConditionFlags(void);
#include "regs.h"

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: debug.cpp,v 1.86 2007-05-09 14:35:51 c2woody Exp $ */
/* $Id: debug.cpp,v 1.87 2007-06-01 16:40:40 c2woody Exp $ */
#include "dosbox.h"
#if C_DEBUG
@ -1776,13 +1776,12 @@ static void LogCPUInfo(void)
sprintf(out1,"IDT base=%08X limit=%08X",cpu.idt.GetBase(),cpu.idt.GetLimit());
LOG(LOG_MISC,LOG_ERROR)(out1);
Bitu sel;
Bitu sel=CPU_STR();
Descriptor desc;
CPU_STR(sel);
cpu.gdt.GetDescriptor(sel,desc);
sprintf(out1,"TR selector=%04X, base=%08X limit=%08X*%X",sel,desc.GetBase(),desc.GetLimit(),desc.saved.seg.g?0x4000:1);
LOG(LOG_MISC,LOG_ERROR)(out1);
sel=cpu.gdt.SLDT();
sel=CPU_SLDT();
cpu.gdt.GetDescriptor(sel,desc);
sprintf(out1,"LDT selector=%04X, base=%08X limit=%08X*%X",sel,desc.GetBase(),desc.GetLimit(),desc.saved.seg.g?0x4000:1);
LOG(LOG_MISC,LOG_ERROR)(out1);

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: iohandler.cpp,v 1.26 2007-02-22 08:32:21 qbix79 Exp $ */
/* $Id: iohandler.cpp,v 1.27 2007-06-01 16:40:40 c2woody Exp $ */
#include <string.h>
#include "dosbox.h"
@ -227,7 +227,6 @@ void IO_WriteB(Bitu port,Bitu val) {
RealPt icb = CALLBACK_RealPointer(call_priv_io);
SegSet16(cs,RealSeg(icb));
reg_eip = RealOff(icb)+0x08;
FillFlags();
CPU_Exception(cpu.exception.which,cpu.exception.error);
DOSBOX_RunMachine();
@ -263,7 +262,6 @@ void IO_WriteW(Bitu port,Bitu val) {
RealPt icb = CALLBACK_RealPointer(call_priv_io);
SegSet16(cs,RealSeg(icb));
reg_eip = RealOff(icb)+0x0a;
FillFlags();
CPU_Exception(cpu.exception.which,cpu.exception.error);
DOSBOX_RunMachine();
@ -299,7 +297,6 @@ void IO_WriteD(Bitu port,Bitu val) {
RealPt icb = CALLBACK_RealPointer(call_priv_io);
SegSet16(cs,RealSeg(icb));
reg_eip = RealOff(icb)+0x0c;
FillFlags();
CPU_Exception(cpu.exception.which,cpu.exception.error);
DOSBOX_RunMachine();
@ -330,7 +327,6 @@ Bitu IO_ReadB(Bitu port) {
RealPt icb = CALLBACK_RealPointer(call_priv_io);
SegSet16(cs,RealSeg(icb));
reg_eip = RealOff(icb)+0x00;
FillFlags();
CPU_Exception(cpu.exception.which,cpu.exception.error);
DOSBOX_RunMachine();
@ -366,7 +362,6 @@ Bitu IO_ReadW(Bitu port) {
RealPt icb = CALLBACK_RealPointer(call_priv_io);
SegSet16(cs,RealSeg(icb));
reg_eip = RealOff(icb)+0x02;
FillFlags();
CPU_Exception(cpu.exception.which,cpu.exception.error);
DOSBOX_RunMachine();
@ -402,7 +397,6 @@ Bitu IO_ReadD(Bitu port) {
RealPt icb = CALLBACK_RealPointer(call_priv_io);
SegSet16(cs,RealSeg(icb));
reg_eip = RealOff(icb)+0x04;
FillFlags();
CPU_Exception(cpu.exception.which,cpu.exception.error);
DOSBOX_RunMachine();