From 5e3564631a2979000e5bcdf78ac2817eba2ee6e7 Mon Sep 17 00:00:00 2001 From: mooinglemur Date: Sun, 9 Jun 2024 22:51:22 -0700 Subject: [PATCH 1/3] [KERNAL] 65C816 native NMI sets up for native return from emulated call --- kernal/x16/65c816/interrupt.s | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/kernal/x16/65c816/interrupt.s b/kernal/x16/65c816/interrupt.s index d76d823b..630fcde6 100644 --- a/kernal/x16/65c816/interrupt.s +++ b/kernal/x16/65c816/interrupt.s @@ -1,3 +1,5 @@ +.include "banks.inc" + .import iclall, igetin .import cbinv, cinv, nminv .import __irq, __irq_65c816_saved, __irq_native_ret @@ -17,7 +19,7 @@ rom_bank = 1 .pushcpu .setcpu "65816" -.macro c816_interrupt_impl vector +.macro c816_interrupt_impl rep #$30 ; 16-bit accumulator and index .I16 .A16 @@ -49,7 +51,6 @@ rom_bank = 1 phx ; save X and Y phy - jmp (vector) .A8 .I8 .endmacro @@ -90,7 +91,6 @@ rom_bank = 1 lda $07, S pha - jmp (addr) .endmacro .segment "C816_COP_EMULATED" @@ -107,7 +107,8 @@ c816_nmib: jmp (innmi) c816_irqb: - c816_interrupt_impl inirq + c816_interrupt_impl + jmp (inirq) .segment "C816_BRK" c816_brk: @@ -115,7 +116,8 @@ c816_brk: .segment "MEMDRV" c816_brk_impl: - c816_interrupt_impl inbrk + c816_interrupt_impl + jmp (inbrk) .segment "C816_COP_NATIVE" c816_cop_native: @@ -154,9 +156,11 @@ __irq_65c816_first: nnirq: irq_brk_common_impl cinv, key, irq_emulated_impl + jmp (cinv) nnbrk: - irq_brk_common_impl cbinv + irq_brk_common_impl + jmp (cbinv) __interrupt_65c816_native_ret: clc @@ -173,15 +177,9 @@ __interrupt_65c816_native_kernal_impl_ret: rti nnnmi: - .A16 - .I16 - sec - xce - .A8 - .I8 - clc - stz rom_bank - jmp (nminv) + c816_interrupt_impl + irq_brk_common_impl + jmp nmi nncop: nnabort: From 9eb451d2d035541a92400a489549366523077c60 Mon Sep 17 00:00:00 2001 From: mooinglemur Date: Sun, 9 Jun 2024 23:03:56 -0700 Subject: [PATCH 2/3] native->emulated NMI doesn't expect any stack push after the RTI frame --- kernal/x16/65c816/interrupt.s | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/kernal/x16/65c816/interrupt.s b/kernal/x16/65c816/interrupt.s index 630fcde6..070d548c 100644 --- a/kernal/x16/65c816/interrupt.s +++ b/kernal/x16/65c816/interrupt.s @@ -55,7 +55,7 @@ rom_bank = 1 .I8 .endmacro -.macro irq_brk_common_impl addr, emulated_kernal_vector, emulated_kernal_impl +.macro intr_common_impl addr, emulated_kernal_vector, emulated_kernal_impl .A16 .I16 tsx @@ -83,6 +83,10 @@ rom_bank = 1 clc php +.endmacro + +.macro irq_brk_common_impl addr, emulated_kernal_vector, emulated_kernal_impl + intr_common_impl addr, emulated_kernal_vector, emulated_kernal_impl lda $0B, S pha @@ -178,7 +182,7 @@ __interrupt_65c816_native_kernal_impl_ret: nnnmi: c816_interrupt_impl - irq_brk_common_impl + intr_common_impl jmp nmi nncop: From 6c66f94f24f6529aa5dbec7a5026d033eb8b281f Mon Sep 17 00:00:00 2001 From: mooinglemur Date: Sun, 9 Jun 2024 23:06:07 -0700 Subject: [PATCH 3/3] cleanup --- kernal/x16/65c816/interrupt.s | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/kernal/x16/65c816/interrupt.s b/kernal/x16/65c816/interrupt.s index 070d548c..2385e695 100644 --- a/kernal/x16/65c816/interrupt.s +++ b/kernal/x16/65c816/interrupt.s @@ -95,6 +95,7 @@ rom_bank = 1 lda $07, S pha + jmp (addr) .endmacro .segment "C816_COP_EMULATED" @@ -160,11 +161,9 @@ __irq_65c816_first: nnirq: irq_brk_common_impl cinv, key, irq_emulated_impl - jmp (cinv) nnbrk: - irq_brk_common_impl - jmp (cbinv) + irq_brk_common_impl cbinv __interrupt_65c816_native_ret: clc