42 lines
921 B
ArmAsm
42 lines
921 B
ArmAsm
// #LAYOUT# STD * #TAKE
|
|
// #LAYOUT# * KERNAL_0 #TAKE
|
|
// #LAYOUT# * * #IGNORE
|
|
|
|
|
|
default_nmi_handler:
|
|
|
|
// Implemented according to Computes Mapping the Commodore 64, page 74
|
|
// and to https://www.c64-wiki.com/wiki/Interrupt
|
|
|
|
// Save registers, sequence according to Computes Mapping the Commodore 64, page 73
|
|
pha
|
|
phx_trash_a
|
|
phy_trash_a
|
|
|
|
// XXX: RS-232 support is not implemented
|
|
|
|
// XXX confirm NMIs from CIA, or no other NMI will arrive!
|
|
|
|
#if CONFIG_PLATFORM_COMMODORE_64
|
|
|
|
jsr cartridge_check
|
|
bne !+
|
|
jmp (ICART_WARM_START)
|
|
!:
|
|
|
|
#endif
|
|
|
|
// According to C64 Wiki, if STOP key is pressed, the routine assumes warm start request
|
|
|
|
// XXX is it right? how to check that IRQ was caused by RESTORE?
|
|
|
|
jsr JSTOP
|
|
bcs !+
|
|
jmp return_from_interrupt // no STOP pressed
|
|
!:
|
|
// STOP + RESTORE - clean the address of the BRK instruction (it is not BRK) first
|
|
lda #$00
|
|
sta CMP0+0
|
|
sta CMP0+1
|
|
jmp (CBINV)
|