Files
open-roms/c64/kernal/interrupts/nmi_lock.s
T
2020-06-04 22:19:10 +02:00

61 lines
1.1 KiB
ArmAsm

// #LAYOUT# STD * #TAKE
// #LAYOUT# * KERNAL_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// Routine to lock NMI interrupts, using a trick described here:
// - https://codebase64.org/doku.php?id=base:nmi_lock
//
#if CONFIG_TAPE_HEAD_ALIGN
// XXX consider broader usage of this method to make IO safer
nmi_lock:
// We will have to change NMI vector to point empty routine,
// which will not acknowledge the interrupt - thus preventing
// the NMI to be triggered again
// Our code considers zeropage address invalid, so put
// it there as a preparation
ldx #$00
stx NMINV+1
// We can now safelly replace the vector
lda #<return_from_interrupt_rti
sta NMINV+0
lda #>return_from_interrupt_rti
sta NMINV+1
// Stop timer A
stx CIA2_CRA // $DD0E
// Set timer A to 0, after starting NMI will occur immediately
stx CIA2_TIMALO // $DD04
stx CIA2_TIMAHI // $DD05
// Set timer A as source for NMI
lda #$81
sta CIA2_ICR // $DD0D
// Start timer A to trigger the NMI
lda #$01
sta CIA2_CRA // $DD0E
// All done. Unmaskable interrupts are now masked.
rts
#endif