From 410b9f72d21afa1687aba2fa35a7d7bfd22ecb67 Mon Sep 17 00:00:00 2001 From: Sjoerd van der Berg Date: Sat, 28 Feb 2004 09:21:02 +0000 Subject: [PATCH] Added some exceptions for illegal opcodes. Double 0x67 prefixes should work now. Thnx c2woody Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@1688 --- src/cpu/core_normal.cpp | 12 +++++++++--- src/cpu/core_normal/prefix_66.h | 1 + src/cpu/core_normal/prefix_none.h | 1 + 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/cpu/core_normal.cpp b/src/cpu/core_normal.cpp index ca04fbfe..e4128d9c 100644 --- a/src/cpu/core_normal.cpp +++ b/src/cpu/core_normal.cpp @@ -94,8 +94,8 @@ extern Bitu cycle_count; core.seg_prefix_base=SegBase(_SEG); \ goto restart_prefix; -#define DO_PREFIX_ADDR() \ - core.prefixes^=PREFIX_ADDR; \ +#define DO_PREFIX_ADDR() \ + core.prefixes|=(core.prefix_default ^ PREFIX_ADDR) & PREFIX_ADDR; \ goto restart_prefix; #define DO_PREFIX_REP(_ZERO) \ @@ -194,9 +194,15 @@ restart_opcode: #endif } } - decode_end: +decode_end: LEAVECORE; return CBRET_NONE; + +illegal_opcode: + LEAVECORE; + reg_eip-=core.ip_lookup-core.op_start; + CPU_Exception(6,0); + goto decode_start; } Bits CPU_Core_Normal_Trap_Run(void) { diff --git a/src/cpu/core_normal/prefix_66.h b/src/cpu/core_normal/prefix_66.h index df16c9a3..3e10ce47 100644 --- a/src/cpu/core_normal/prefix_66.h +++ b/src/cpu/core_normal/prefix_66.h @@ -167,6 +167,7 @@ break; CASE_D(0x63) /* ARPL Ed,Rd */ { + if (((cpu.pmode) && (reg_flags & FLAG_VM)) || (!cpu.pmode)) goto illegal_opcode; FillFlags(); GetRMrw; if (rm >= 0xc0 ) { diff --git a/src/cpu/core_normal/prefix_none.h b/src/cpu/core_normal/prefix_none.h index 6d79d972..f5354374 100644 --- a/src/cpu/core_normal/prefix_none.h +++ b/src/cpu/core_normal/prefix_none.h @@ -237,6 +237,7 @@ break; CASE_W(0x63) /* ARPL Ew,Rw */ { + if (((cpu.pmode) && (reg_flags & FLAG_VM)) || (!cpu.pmode)) goto illegal_opcode; FillFlags(); GetRMrw; if (rm >= 0xc0 ) {