1
0
Fork 0

allow more than one seg override prefix, certain segment loading parameters are invalid (recompiling cores)

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3057
This commit is contained in:
Sebastian Strohhäcker 2007-12-08 15:43:30 +00:00
parent 57da409fe7
commit 60419734aa
3 changed files with 48 additions and 14 deletions

View file

@ -1589,8 +1589,7 @@ static void dyn_load_seg(SegNames seg,DynReg * src) {
}
static void dyn_load_seg_off_ea(SegNames seg) {
dyn_get_modrm();
if (GCC_UNLIKELY(decode.modrm.mod<3)) {
if (decode.modrm.mod<3) {
dyn_fill_ea();
gen_lea(DREG(TMPB),DREG(EA),0,0,decode.big_op ? 4:2);
dyn_read_word(DREG(TMPB),DREG(TMPB),false);
@ -1666,7 +1665,7 @@ static void dyn_leave(void) {
}
static void dyn_segprefix(SegNames seg) {
if (GCC_UNLIKELY((Bitu)(decode.segprefix))) IllegalOption("dyn_segprefix");
// if (GCC_UNLIKELY((Bitu)(decode.segprefix))) IllegalOption("dyn_segprefix");
decode.segprefix=&DynRegs[G_ES+seg];
}
@ -1988,8 +1987,16 @@ restart_prefix:
/* Imul Ev,Gv */
case 0xaf:dyn_imul_gvev(0);break;
/* LFS,LGS */
case 0xb4:dyn_load_seg_off_ea(fs);break;
case 0xb5:dyn_load_seg_off_ea(gs);break;
case 0xb4:
dyn_get_modrm();
if (GCC_UNLIKELY(decode.modrm.mod==3)) goto illegalopcode;
dyn_load_seg_off_ea(fs);
break;
case 0xb5:
dyn_get_modrm();
if (GCC_UNLIKELY(decode.modrm.mod==3)) goto illegalopcode;
dyn_load_seg_off_ea(gs);
break;
/* MOVZX Gv,Eb/Ew */
case 0xb6:dyn_mov_ev_gb(false);break;
case 0xb7:dyn_mov_ev_gw(false);break;
@ -2240,9 +2247,18 @@ restart_prefix:
//RET near Iw / Ret
case 0xc2:dyn_ret_near(decode_fetchw());goto finish_block;
case 0xc3:dyn_ret_near(0);goto finish_block;
//LES/LDS
case 0xc4:dyn_load_seg_off_ea(es);break;
case 0xc5:dyn_load_seg_off_ea(ds);break;
//LES
case 0xc4:
dyn_get_modrm();
if (GCC_UNLIKELY(decode.modrm.mod==3)) goto illegalopcode;
dyn_load_seg_off_ea(es);
break;
//LDS
case 0xc5:
dyn_get_modrm();
if (GCC_UNLIKELY(decode.modrm.mod==3)) goto illegalopcode;
dyn_load_seg_off_ea(ds);
break;
// MOV Eb/Ev,Ib/Iv
case 0xc6:dyn_mov_ebib();break;
case 0xc7:dyn_mov_eviv();break;

View file

@ -218,8 +218,18 @@ restart_prefix:
case 0xaf:dyn_imul_gvev(0);break;
case 0xb4:dyn_load_seg_off_ea(DRC_SEG_FS);break;
case 0xb5:dyn_load_seg_off_ea(DRC_SEG_GS);break;
// lfs
case 0xb4:
dyn_get_modrm();
if (GCC_UNLIKELY(decode.modrm.mod==3)) goto illegalopcode;
dyn_load_seg_off_ea(DRC_SEG_FS);
break;
// lgs
case 0xb5:
dyn_get_modrm();
if (GCC_UNLIKELY(decode.modrm.mod==3)) goto illegalopcode;
dyn_load_seg_off_ea(DRC_SEG_GS);
break;
// zero-extending moves
case 0xb6:dyn_movx_ev_gb(false);break;
@ -413,8 +423,17 @@ restart_prefix:
case 0xc2:dyn_ret_near(decode_fetchw());goto finish_block;
case 0xc3:dyn_ret_near(0);goto finish_block;
case 0xc4:dyn_load_seg_off_ea(DRC_SEG_ES);break;
case 0xc5:dyn_load_seg_off_ea(DRC_SEG_DS);break;
// les
case 0xc4:
dyn_get_modrm();
if (GCC_UNLIKELY(decode.modrm.mod==3)) goto illegalopcode;
dyn_load_seg_off_ea(DRC_SEG_ES);
break;
// lds
case 0xc5:
dyn_get_modrm();
if (GCC_UNLIKELY(decode.modrm.mod==3)) goto illegalopcode;
dyn_load_seg_off_ea(DRC_SEG_DS);break;
// 'mov []/reg8/16/32,imm8/16/32'
case 0xc6:dyn_dop_ebib_mov();break;

View file

@ -453,7 +453,7 @@ static void dyn_pop_ev(void) {
static void dyn_segprefix(Bit8u seg) {
if (GCC_UNLIKELY(decode.seg_prefix_used)) IllegalOptionDynrec("dyn_segprefix");
// if (GCC_UNLIKELY(decode.seg_prefix_used)) IllegalOptionDynrec("dyn_segprefix");
decode.seg_prefix=seg;
decode.seg_prefix_used=true;
}
@ -472,7 +472,6 @@ static void dyn_segprefix(Bit8u seg) {
}
static void dyn_load_seg_off_ea(Bit8u seg) {
dyn_get_modrm();
if (decode.modrm.mod<3) {
dyn_fill_ea(FC_ADDR);
gen_protect_addr_reg();