diff options
Diffstat (limited to 'src/devices/cpu/m68000/m68kcpu.h')
-rw-r--r-- | src/devices/cpu/m68000/m68kcpu.h | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/src/devices/cpu/m68000/m68kcpu.h b/src/devices/cpu/m68000/m68kcpu.h index 1502b09d775..aebe498f899 100644 --- a/src/devices/cpu/m68000/m68kcpu.h +++ b/src/devices/cpu/m68000/m68kcpu.h @@ -1188,8 +1188,11 @@ inline void m68ki_stack_frame_buserr(u32 sr) /* Format 8 stack frame (68010). * 68010 only. This is the 29 word bus/address error frame. */ -inline void m68ki_stack_frame_1000(u32 pc, u32 sr, u32 vector) +inline void m68ki_stack_frame_1000(u32 pc, u32 sr, u32 vector, u32 fault_address) { + int orig_rw = m_mmu_tmp_buserror_rw; // this gets splatted by the following pushes, so save it now + int orig_fc = m_mmu_tmp_buserror_fc; + /* VERSION * NUMBER * INTERNAL INFORMATION, 16 WORDS @@ -1222,10 +1225,10 @@ inline void m68ki_stack_frame_1000(u32 pc, u32 sr, u32 vector) m68ki_fake_push_16(); /* FAULT ADDRESS */ - m68ki_push_32(0); + m68ki_push_32(fault_address); /* SPECIAL STATUS WORD */ - m68ki_push_16(0); + m68ki_push_16(orig_fc | (orig_rw<<8)); /* 1000, VECTOR OFFSET */ m68ki_push_16(0x8000 | (vector<<2)); @@ -1240,7 +1243,7 @@ inline void m68ki_stack_frame_1000(u32 pc, u32 sr, u32 vector) /* Format 15 stack frame (68070). * 68070 only. This is the 17 word bus/address error frame. */ -inline void m68ki_stack_frame_1111(uint32_t pc, uint32_t sr, uint32_t vector) +inline void m68ki_stack_frame_1111(u32 pc, u32 sr, u32 vector, u32 fault_address) { /* INTERNAL INFORMATION */ m68ki_fake_push_16(); @@ -1255,7 +1258,7 @@ inline void m68ki_stack_frame_1111(uint32_t pc, uint32_t sr, uint32_t vector) m68ki_push_32(0); /* FAULT ADDRESS */ - m68ki_push_32(0); + m68ki_push_32(fault_address); /* DATA OUTPUT BUFFER */ m68ki_push_32(0); @@ -1598,12 +1601,12 @@ inline void m68ki_exception_address_error() else if (CPU_TYPE_IS_010()) { /* only the 68010 throws this unique type-1000 frame */ - m68ki_stack_frame_1000(m_ppc, sr, EXCEPTION_BUS_ERROR); + m68ki_stack_frame_1000(m_ppc, sr, EXCEPTION_BUS_ERROR, m_mmu_tmp_buserror_address); } else if (CPU_TYPE_IS_070()) { /* only the 68070 throws this unique type-1111 frame */ - m68ki_stack_frame_1111(m_ppc, sr, EXCEPTION_BUS_ERROR); + m68ki_stack_frame_1111(m_ppc, sr, EXCEPTION_BUS_ERROR, m_mmu_tmp_buserror_address); } else if (m_mmu_tmp_buserror_address == m_ppc) { |