1
0
Fork 0

use exception-checking code even in real mode (for code which is later ran in v86 mode), dynamic cores only

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3047
This commit is contained in:
Sebastian Strohhäcker 2007-11-15 21:06:18 +00:00
parent 6d7dd9f3ae
commit 0e6e7bea4c
3 changed files with 28 additions and 40 deletions

View file

@ -1582,11 +1582,9 @@ static void dyn_mov_ev_seg(void) {
}
static void dyn_load_seg(SegNames seg,DynReg * src) {
if (cpu.pmode) {
gen_call_function((void *)&CPU_SetSegGeneral,"%Rd%Id%Drw",DREG(TMPB),seg,src);
dyn_check_bool_exception(DREG(TMPB));
gen_releasereg(DREG(TMPB));
} else gen_call_function((void *)CPU_SetSegGeneral,"%Id%Drw",seg,src);
gen_call_function((void *)&CPU_SetSegGeneral,"%Rd%Id%Drw",DREG(TMPB),seg,src);
dyn_check_bool_exception(DREG(TMPB));
gen_releasereg(DREG(TMPB));
gen_releasereg(&DynRegs[G_ES+seg]);
}
@ -1625,18 +1623,12 @@ static void dyn_push_seg(SegNames seg) {
}
static void dyn_pop_seg(SegNames seg) {
if (!cpu.pmode) {
dyn_pop(DREG(TMPW));
dyn_load_seg(seg,DREG(TMPW));
gen_releasereg(DREG(TMPW));
} else {
gen_releasereg(DREG(ESP));
gen_call_function((void *)&CPU_PopSeg,"%Rd%Id%Id",DREG(TMPB),seg,decode.big_op);
dyn_check_bool_exception(DREG(TMPB));
gen_releasereg(DREG(TMPB));
gen_releasereg(&DynRegs[G_ES+seg]);
gen_releasereg(DREG(ESP));
}
gen_releasereg(DREG(ESP));
gen_call_function((void *)&CPU_PopSeg,"%Rd%Id%Id",DREG(TMPB),seg,decode.big_op);
dyn_check_bool_exception(DREG(TMPB));
gen_releasereg(DREG(TMPB));
gen_releasereg(&DynRegs[G_ES+seg]);
gen_releasereg(DREG(ESP));
}
static void dyn_pop_ev(void) {
@ -1874,17 +1866,13 @@ static void dyn_interrupt(Bitu num) {
}
static void dyn_add_iocheck(Bitu access_size) {
if (cpu.pmode) {
gen_call_function((void *)&CPU_IO_Exception,"%Dw%Id",DREG(EDX),access_size);
dyn_check_bool_exception_al();
}
gen_call_function((void *)&CPU_IO_Exception,"%Dw%Id",DREG(EDX),access_size);
dyn_check_bool_exception_al();
}
static void dyn_add_iocheck_var(Bit8u accessed_port,Bitu access_size) {
if (cpu.pmode) {
gen_call_function((void *)&CPU_IO_Exception,"%Id%Id",accessed_port,access_size);
dyn_check_bool_exception_al();
}
gen_call_function((void *)&CPU_IO_Exception,"%Id%Id",accessed_port,access_size);
dyn_check_bool_exception_al();
}
#ifdef X86_DYNFPU_DH_ENABLED
@ -2465,13 +2453,13 @@ restart_prefix:
case 0xfa: //CLI
gen_releasereg(DREG(FLAGS));
gen_call_function((void *)&CPU_CLI,"%Rd",DREG(TMPB));
if (cpu.pmode) dyn_check_bool_exception(DREG(TMPB));
dyn_check_bool_exception(DREG(TMPB));
gen_releasereg(DREG(TMPB));
break;
case 0xfb: //STI
gen_releasereg(DREG(FLAGS));
gen_call_function((void *)&CPU_STI,"%Rd",DREG(TMPB));
if (cpu.pmode) dyn_check_bool_exception(DREG(TMPB));
dyn_check_bool_exception(DREG(TMPB));
gen_releasereg(DREG(TMPB));
dyn_check_irqrequest();
if (max_opcodes<=0) max_opcodes=1; //Allow 1 extra opcode

View file

@ -530,11 +530,11 @@ restart_prefix:
case 0xfa: //CLI
gen_call_function_raw((void *)&CPU_CLI);
if (cpu.pmode) dyn_check_exception(FC_RETOP);
dyn_check_exception(FC_RETOP);
break;
case 0xfb: //STI
gen_call_function_raw((void *)&CPU_STI);
if (cpu.pmode) dyn_check_exception(FC_RETOP);
dyn_check_exception(FC_RETOP);
if (max_opcodes<=0) max_opcodes=1; //Allow 1 extra opcode
break;

View file

@ -402,7 +402,7 @@ static void dyn_push_seg(Bit8u seg) {
static void dyn_pop_seg(Bit8u seg) {
gen_call_function_II((void *)&CPU_PopSeg,seg,decode.big_op);
if (cpu.pmode) dyn_check_exception(FC_RETOP);
dyn_check_exception(FC_RETOP);
}
static void dyn_push_reg(Bit8u reg) {
@ -468,7 +468,7 @@ static void dyn_segprefix(Bit8u seg) {
gen_mov_word_to_reg(FC_RETOP,DRCD_REG_WORD(decode.modrm.rm,false),false);
}
gen_call_function_IR((void *)&CPU_SetSegGeneral,decode.modrm.reg,FC_RETOP);
if (cpu.pmode) dyn_check_exception(FC_RETOP);
dyn_check_exception(FC_RETOP);
}
static void dyn_load_seg_off_ea(Bit8u seg) {
@ -484,7 +484,7 @@ static void dyn_load_seg_off_ea(Bit8u seg) {
dyn_read_word(FC_ADDR,FC_RETOP,false);
gen_call_function_IR((void *)&CPU_SetSegGeneral,seg,FC_RETOP);
if (cpu.pmode) dyn_check_exception(FC_RETOP);
dyn_check_exception(FC_RETOP);
gen_restore_reg(FC_OP1);
gen_mov_word_from_reg(FC_OP1,DRCD_REG_WORD(decode.modrm.reg,decode.big_op),decode.big_op);
@ -1327,9 +1327,9 @@ static void dyn_write_port_word_direct(Bit8u port) {
static void dyn_read_port_byte(void) {
gen_mov_word_to_reg(FC_ADDR,DRCD_REG_WORD(DRC_REG_EDX,false),false);
gen_extend_word(false,FC_ADDR);
if (cpu.pmode) gen_protect_addr_reg();
gen_protect_addr_reg();
dyn_add_iocheck(FC_ADDR,1);
if (cpu.pmode) gen_restore_addr_reg();
gen_restore_addr_reg();
gen_call_function_R((void*)&IO_ReadB,FC_ADDR);
gen_mov_byte_from_reg_low(FC_RETOP,DRCD_REG_BYTE(DRC_REG_EAX,0));
}
@ -1337,9 +1337,9 @@ static void dyn_read_port_byte(void) {
static void dyn_read_port_word(void) {
gen_mov_word_to_reg(FC_ADDR,DRCD_REG_WORD(DRC_REG_EDX,false),false);
gen_extend_word(false,FC_ADDR);
if (cpu.pmode) gen_protect_addr_reg();
gen_protect_addr_reg();
dyn_add_iocheck(FC_ADDR,decode.big_op?4:2);
if (cpu.pmode) gen_restore_addr_reg();
gen_restore_addr_reg();
gen_call_function_R(decode.big_op?((void*)&IO_ReadD):((void*)&IO_ReadW),FC_ADDR);
gen_mov_word_from_reg(FC_RETOP,DRCD_REG_BYTE(DRC_REG_EAX,decode.big_op),decode.big_op);
}
@ -1347,22 +1347,22 @@ static void dyn_read_port_word(void) {
static void dyn_write_port_byte(void) {
gen_mov_word_to_reg(FC_ADDR,DRCD_REG_WORD(DRC_REG_EDX,false),false);
gen_extend_word(false,FC_ADDR);
if (cpu.pmode) gen_protect_addr_reg();
gen_protect_addr_reg();
dyn_add_iocheck(FC_ADDR,1);
gen_mov_byte_to_reg_low(FC_RETOP,DRCD_REG_BYTE(DRC_REG_EAX,0));
gen_extend_byte(false,FC_RETOP);
if (cpu.pmode) gen_restore_addr_reg();
gen_restore_addr_reg();
gen_call_function_RR((void*)&IO_WriteB,FC_ADDR,FC_RETOP);
}
static void dyn_write_port_word(void) {
gen_mov_word_to_reg(FC_ADDR,DRCD_REG_WORD(DRC_REG_EDX,false),false);
gen_extend_word(false,FC_ADDR);
if (cpu.pmode) gen_protect_addr_reg();
gen_protect_addr_reg();
dyn_add_iocheck(FC_ADDR,decode.big_op?4:2);
gen_mov_word_to_reg(FC_RETOP,DRCD_REG_WORD(DRC_REG_EAX,decode.big_op),decode.big_op);
if (!decode.big_op) gen_extend_word(false,FC_RETOP);
if (cpu.pmode) gen_restore_addr_reg();
gen_restore_addr_reg();
gen_call_function_RR(decode.big_op?((void*)&IO_WriteD):((void*)&IO_WriteW),FC_ADDR,FC_RETOP);
}