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:
parent
6d7dd9f3ae
commit
0e6e7bea4c
3 changed files with 28 additions and 40 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue