summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/m68000/m68kcpu.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/m68000/m68kcpu.h')
-rw-r--r--src/devices/cpu/m68000/m68kcpu.h17
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)
{