mirror of
https://github.com/holub/mame
synced 2025-06-28 15:14:21 +03:00
create 68010 bus error stack frame / fix for 68010 RTE stack frame unwinding (#9293)
* 68010 RTE: don't set SR (which may change SP to USP) until after unwinding 1000 stack exception frame * 68010: create 1000 format stack frame on bus error
This commit is contained in:
parent
02cd26d37e
commit
f0fc52d32c
@ -6886,16 +6886,12 @@ e5c0 ffc0 roxl w A+-DXWL 01:8 7:14 234fc:5
|
|||||||
m_instr_mode = INSTRUCTION_YES;
|
m_instr_mode = INSTRUCTION_YES;
|
||||||
m_run_mode = RUN_MODE_NORMAL;
|
m_run_mode = RUN_MODE_NORMAL;
|
||||||
} else {
|
} else {
|
||||||
if (format_word == 0x8) /* type 1000 stack frame */
|
if (format_word == 0x8) /* 68010 - type 1000 stack frame */
|
||||||
{
|
{
|
||||||
new_sr = m68ki_pull_16();
|
new_sr = m68ki_pull_16();
|
||||||
new_pc = m68ki_pull_32();
|
new_pc = m68ki_pull_32();
|
||||||
m68ki_fake_pull_16(); /* format word */
|
m68ki_fake_pull_16(); /* format word */
|
||||||
m68ki_jump(new_pc);
|
m68ki_fake_pull_16(); /* special status word */
|
||||||
m68ki_set_sr(new_sr);
|
|
||||||
m_instr_mode = INSTRUCTION_YES;
|
|
||||||
m_run_mode = RUN_MODE_NORMAL;
|
|
||||||
m68ki_fake_pull_16(); /* special status */
|
|
||||||
m68ki_fake_pull_32(); /* fault address */
|
m68ki_fake_pull_32(); /* fault address */
|
||||||
m68ki_fake_pull_32(); /* reserved and data output buffer */
|
m68ki_fake_pull_32(); /* reserved and data output buffer */
|
||||||
m68ki_fake_pull_32(); /* reserved and data input buffer */
|
m68ki_fake_pull_32(); /* reserved and data input buffer */
|
||||||
@ -6908,6 +6904,10 @@ e5c0 ffc0 roxl w A+-DXWL 01:8 7:14 234fc:5
|
|||||||
m68ki_fake_pull_32();
|
m68ki_fake_pull_32();
|
||||||
m68ki_fake_pull_32();
|
m68ki_fake_pull_32();
|
||||||
m68ki_fake_pull_32();
|
m68ki_fake_pull_32();
|
||||||
|
m68ki_jump(new_pc);
|
||||||
|
m68ki_set_sr(new_sr);
|
||||||
|
m_instr_mode = INSTRUCTION_YES;
|
||||||
|
m_run_mode = RUN_MODE_NORMAL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -956,10 +956,17 @@ void m68000_base_device::execute_run()
|
|||||||
m_run_mode = RUN_MODE_BERR_AERR_RESET;
|
m_run_mode = RUN_MODE_BERR_AERR_RESET;
|
||||||
|
|
||||||
if (!CPU_TYPE_IS_020_PLUS())
|
if (!CPU_TYPE_IS_020_PLUS())
|
||||||
|
{
|
||||||
|
if (CPU_TYPE_IS_010())
|
||||||
|
{
|
||||||
|
m68ki_stack_frame_1000(m_ppc, sr, EXCEPTION_BUS_ERROR);
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
/* Note: This is implemented for 68000 only! */
|
/* Note: This is implemented for 68000 only! */
|
||||||
m68ki_stack_frame_buserr(sr);
|
m68ki_stack_frame_buserr(sr);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else if(!CPU_TYPE_IS_040_PLUS()) {
|
else if(!CPU_TYPE_IS_040_PLUS()) {
|
||||||
if (m_mmu_tmp_buserror_address == m_ppc)
|
if (m_mmu_tmp_buserror_address == m_ppc)
|
||||||
{
|
{
|
||||||
|
@ -26542,16 +26542,12 @@ void m68000_base_device::x4e73_rte_l_71()
|
|||||||
m_instr_mode = INSTRUCTION_YES;
|
m_instr_mode = INSTRUCTION_YES;
|
||||||
m_run_mode = RUN_MODE_NORMAL;
|
m_run_mode = RUN_MODE_NORMAL;
|
||||||
} else {
|
} else {
|
||||||
if (format_word == 0x8) /* type 1000 stack frame */
|
if (format_word == 0x8) /* 68010 - type 1000 stack frame */
|
||||||
{
|
{
|
||||||
new_sr = m68ki_pull_16();
|
new_sr = m68ki_pull_16();
|
||||||
new_pc = m68ki_pull_32();
|
new_pc = m68ki_pull_32();
|
||||||
m68ki_fake_pull_16(); /* format word */
|
m68ki_fake_pull_16(); /* format word */
|
||||||
m68ki_jump(new_pc);
|
m68ki_fake_pull_16(); /* special status word */
|
||||||
m68ki_set_sr(new_sr);
|
|
||||||
m_instr_mode = INSTRUCTION_YES;
|
|
||||||
m_run_mode = RUN_MODE_NORMAL;
|
|
||||||
m68ki_fake_pull_16(); /* special status */
|
|
||||||
m68ki_fake_pull_32(); /* fault address */
|
m68ki_fake_pull_32(); /* fault address */
|
||||||
m68ki_fake_pull_32(); /* reserved and data output buffer */
|
m68ki_fake_pull_32(); /* reserved and data output buffer */
|
||||||
m68ki_fake_pull_32(); /* reserved and data input buffer */
|
m68ki_fake_pull_32(); /* reserved and data input buffer */
|
||||||
@ -26564,6 +26560,10 @@ void m68000_base_device::x4e73_rte_l_71()
|
|||||||
m68ki_fake_pull_32();
|
m68ki_fake_pull_32();
|
||||||
m68ki_fake_pull_32();
|
m68ki_fake_pull_32();
|
||||||
m68ki_fake_pull_32();
|
m68ki_fake_pull_32();
|
||||||
|
m68ki_jump(new_pc);
|
||||||
|
m68ki_set_sr(new_sr);
|
||||||
|
m_instr_mode = INSTRUCTION_YES;
|
||||||
|
m_run_mode = RUN_MODE_NORMAL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user