From 69ea9abefd4b2b619d42eaa426924a25fdcaf9e6 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 8 Aug 2019 18:28:20 +0200 Subject: [PATCH] finished IRQ handler, fixed cartridge startup --- STATUS.md | 1 - c64/aliases/,aliases_rom_cart.s | 5 +++++ c64/kernal/cartridge_check.s | 8 ++++---- c64/kernal/cartridge_signature.s | 3 +++ c64/kernal/interrupts/fe47.default_nmi_handler.s | 5 ++++- c64/kernal/interrupts/irq_handler.s | 15 +++++++++++++-- c64/kernal/reset_entry.s | 4 +++- 7 files changed, 32 insertions(+), 9 deletions(-) create mode 100644 c64/aliases/,aliases_rom_cart.s create mode 100644 c64/kernal/cartridge_signature.s diff --git a/STATUS.md b/STATUS.md index 71c5f15f..15d8e3d0 100644 --- a/STATUS.md +++ b/STATUS.md @@ -26,7 +26,6 @@ The following ROM features are currently missing: * floating point routines * tape support * RS-232 support -* NMI cartridge handling and BRK handling are not implemented yet * breaking Kernal routines with RUN/STOP key * PAL/NTSC is detected, but for now only startup banner uses the result diff --git a/c64/aliases/,aliases_rom_cart.s b/c64/aliases/,aliases_rom_cart.s new file mode 100644 index 00000000..c2e25c1e --- /dev/null +++ b/c64/aliases/,aliases_rom_cart.s @@ -0,0 +1,5 @@ + + ;; Cartridge ROM locations + .alias ICART_COLD_START $8000 ; $8000-$8001, cartridge cold start vector + .alias ICART_WARM_START $8002 ; $8002-$8003, cartridge warm start vector (RESTORE key) + .alias CART_SIG $8004 ; 5 bytes, signature for cartridge detection diff --git a/c64/kernal/cartridge_check.s b/c64/kernal/cartridge_check.s index de748d4e..26106ae8 100644 --- a/c64/kernal/cartridge_check.s +++ b/c64/kernal/cartridge_check.s @@ -3,13 +3,13 @@ cartridge_check: ldx #$04 cartridge_check_l1: - lda $8002,x + lda CART_SIG,x cmp cartridge_signature,x bne no_cartridge dex bpl cartridge_check_l1 - jmp ($8000) -cartridge_signature: - .byte $C3,$C2,$CD,$38,$30 + sec + rts no_cartridge: + clc rts diff --git a/c64/kernal/cartridge_signature.s b/c64/kernal/cartridge_signature.s new file mode 100644 index 00000000..2b0c5f90 --- /dev/null +++ b/c64/kernal/cartridge_signature.s @@ -0,0 +1,3 @@ + +cartridge_signature: + .byte $C3,$C2,$CD,$38,$30 diff --git a/c64/kernal/interrupts/fe47.default_nmi_handler.s b/c64/kernal/interrupts/fe47.default_nmi_handler.s index 3be62222..0d0a0ea1 100644 --- a/c64/kernal/interrupts/fe47.default_nmi_handler.s +++ b/c64/kernal/interrupts/fe47.default_nmi_handler.s @@ -13,7 +13,10 @@ default_nmi_handler: ;; XXX: RS-232 support is not implemented - ;; XXX if cartridge present, enter it through warm start vector + jsr cartridge_check + bcc + + jmp (ICART_WARM_START) +* ;; According to C64 Wiki, if STOP key is pressed, the routine assumes warm start request diff --git a/c64/kernal/interrupts/irq_handler.s b/c64/kernal/interrupts/irq_handler.s index 06175ff9..be0b40d3 100644 --- a/c64/kernal/interrupts/irq_handler.s +++ b/c64/kernal/interrupts/irq_handler.s @@ -15,9 +15,14 @@ irq_handler: tya pha - ;; XXX check if caused by BRK, react accordingly + ;; Check if caused by BRK - ;; Call interrupt routine (only if initialised) + tsx + lda $0104, x ; get the pre-interrupt processor state + and #$10 + bne irq_handler_brk + + ;; Not caused by BRK - call interrupt routine (only if initialised) lda CINV ora CINV+1 beq + @@ -25,3 +30,9 @@ irq_handler: * ;; Vector not initialized - call default interrupt routine jmp default_irq_handler + +irq_handler_brk: + + ;; Interrupt caused by BRK + jmp (CBINV) + diff --git a/c64/kernal/reset_entry.s b/c64/kernal/reset_entry.s index 0febf335..fbddb4d3 100644 --- a/c64/kernal/reset_entry.s +++ b/c64/kernal/reset_entry.s @@ -13,7 +13,9 @@ reset_entry: ; C64 PRG p269 jsr cartridge_check - + bcc + + jmp (ICART_COLD_START) +* ; The following routine is based on reading the public KERNAL jumptable routine ; list, and making unimaginative assumptions about what should be done on reset. ; Initialising IO is obviously required. also indicated by c64 prg p269.