static int feature_exception3_data = 0;
static int feature_exception3_instruction = 0;
static int feature_sr_mask = 0;
+static int feature_undefined_ccr = 0;
static int feature_min_interrupt_mask = 0;
static int feature_loop_mode = 0;
static int feature_loop_mode_register = -1;
static uae_u16 get_ccr_ignore(struct instr *dp, uae_u16 extra)
{
uae_u16 ccrignoremask = 0;
- if ((cpu_lvl == 2 || cpu_lvl == 3) && (test_exception == 5 || exception_extra_frame_type == 5)) {
- if ((dp->mnemo == i_DIVS) || (dp->mnemo == i_DIVL && (extra & 0x0800) && !(extra & 0x0400))) {
- // 68020/030 DIVS.W/.L + Divide by Zero: V state is not stable.
- ccrignoremask |= 2; // mask CCR=V
+ if (!feature_undefined_ccr) {
+ if (test_exception == 5 || exception_extra_frame_type == 5) {
+ if (dp->mnemo == i_DIVS || dp->mnemo == i_DIVU || dp->mnemo == i_DIVL) {
+ // DIV + Divide by Zero: flags are undefined
+ ccrignoremask |= 0x08 | 0x04 | 0x02 | 0x01;
+ }
+ } else {
+ if ((dp->mnemo == i_DIVS || dp->mnemo == i_DIVU || dp->mnemo == i_DIVL) && (regs.sr & 0x02)) {
+ // DIV + V: other flags are undefined
+ ccrignoremask |= 0x08 | 0x04 | 0x01;
+ }
+ }
+ if (dp->mnemo == i_CHK2) {
+ // CHK: N and V are undefined
+ ccrignoremask |= 0x08 | 0x02;
+ }
+ if (dp->mnemo == i_CHK) {
+ // CHK: N and V are undefined
+ ccrignoremask |= 0x04 | 0x02 | 0x01;
}
}
return ccrignoremask;
feature_sr_mask = 0;
ini_getvalx(ini, sections, _T("feature_sr_mask"), &feature_sr_mask);
+ feature_undefined_ccr = 0;
+ ini_getvalx(ini, sections, _T("feature_undefined_ccr"), &feature_undefined_ccr);
+
feature_min_interrupt_mask = 0;
ini_getvalx(ini, sections, _T("feature_min_interrupt_mask"), &feature_min_interrupt_mask);
; Note: instructions that generate privilege violation exception will automatically add extra S=1 round.
feature_sr_mask=0x0000
+; Do not check undefined flags
+; Currently supported: CHK, CHK2, DIV
+feature_undefined_ccr=0
+
; Forced register, always use this value in all tests
; D0-D7, A0-A6, FP0-FP7, SR, CCR, FPSR, FPCR, FPIAR
; reg=0x1234 or reg=100
cpu=68000-68010
enabled=0
feature_sr_mask=0x8000
+feature_undefined_ccr=1
mode=all
; interrupt exception
cpu=68000-68010
feature_sr_mask=0x8000
feature_interrupts=1
+feature_undefined_ccr=1
mode=jsr,jmp,bsr,bcc,dbcc,nop,exg,swap,stop,mvsr2,mv2sr,andsr,eorsr,orsr
min_opcode_test_rounds=100
cpu=68000-68010
feature_target_src_ea=0x37fff1,0x7111
feature_target_dst_ea=
+feature_undefined_ccr=1
mode=all
; destination EA address error (MOVE, MOVEM)
feature_target_src_ea=
feature_target_dst_ea=0x37fff1,0x7111
verbose=0
+feature_undefined_ccr=1
mode=move,movea,mvmel,mvmle
; user stack address error
cpu=68000-68010
feature_usp=2
verbose=0
+feature_undefined_ccr=1
mode=rts,rtd,rtr,jsr,bsr,link,unlk,pea
; exception vector address error
cpu=68000-68010
feature_exception_vectors=0x000123
verbose=0
+feature_undefined_ccr=1
mode=mv2sr.w,mvusp2r,mvr2usp,illegal,chk,trap,trapv,divu,divs,orsr.w
; interrupt exception with odd interrupt vectors
cpu=68000-68010
mode=nop,ext,swap
feature_interrupts=1
+feature_undefined_ccr=1
feature_exception_vectors=0x000123
; prefetch bus error (requires extra hardware)
test_memory_size=0xa0000
test_memory_size=0x100000
opcode_memory_start=0x87ffa0
+feature_undefined_ccr=1
mode=all
; source EA read bus error (requires extra hardware)
test_memory_start=0x860000
test_memory_size=0x100000
opcode_memory_start=0x87ffa0
+feature_undefined_ccr=1
mode=all
; destination EA read bus error (requires extra hardware)
test_memory_start=0x860000
test_memory_size=0x100000
opcode_memory_start=0x87ffa0
+feature_undefined_ccr=1
mode=all
; source EA (=RMW instructions like NOT have only source EA) write bus error (requires extra hardware)
test_memory_start=0x880000
test_memory_size=0x100000
mode=moves
-;mode=all
+feature_undefined_ccr=1
+mode=all
; destination EA write bus error (requires extra hardware)
[test=BEDSTW]
opcode_memory_start=0x8fffa0
test_memory_start=0x880000
test_memory_size=0x100000
+feature_undefined_ccr=1
mode=all
feature_loop_mode=3
feature_loop_mode_register=7
min_opcode_test_rounds=100
+feature_undefined_ccr=1
mode=all
; **************