From e4ddf9ec0cbd10e03a8251582930f7bac1626fa4 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 6 Aug 2019 22:00:50 +0200 Subject: [PATCH] STOP + RESTORE now works (bad news: works even without STOP) --- Makefile | 2 +- STATUS.md | 4 ++-- c64/kernal/cint.s | 4 +--- .../interrupts/ea31.default_irq_handler.s | 3 ++- .../interrupts/fe47.default_nmi_handler.s | 23 +++++++++++++++---- .../interrupts/fe66.default_brk_handler.s | 4 ++++ c64/kernal/interrupts/irq_handler.s | 2 ++ c64/kernal/interrupts/nmi_handler.s | 13 ++++++++++- c64/kernal/jumptable/ff9f.jscnkey.s | 2 +- c64/kernal/jumptable/ffea.judtim.s | 2 +- c64/kernal/{scan_keyboard.s => scnkey.s} | 4 +--- c64/kernal/{update_jiffy_clock.s => udtim.s} | 2 +- 12 files changed, 46 insertions(+), 19 deletions(-) rename c64/kernal/{scan_keyboard.s => scnkey.s} (99%) rename c64/kernal/{update_jiffy_clock.s => udtim.s} (92%) diff --git a/Makefile b/Makefile index 4c852918..739ada5d 100644 --- a/Makefile +++ b/Makefile @@ -147,7 +147,7 @@ test: build/newkern_generic build/newbasic_generic x64 -kernal build/newkern_generic -basic build/newbasic_generic -8 empty.d64 testremote: build/newkern_generic build/newbasic_generic - x64 -kernal build/newkern-generic -basic build/newbasic-generic -remotemonitor + x64 -kernal build/newkern_generic -basic build/newbasic_generic -remotemonitor testm65: build/newc65 m65 -b ../mega65-core/bin/mega65r1.bit -k ../mega65-core/bin/KICKUP.M65 -R build/newc65 -4 diff --git a/STATUS.md b/STATUS.md index 82d800a3..94abe4c2 100644 --- a/STATUS.md +++ b/STATUS.md @@ -102,10 +102,10 @@ NOTE: Even the 'DONE' routines won't support features described as missing in on | `$FFD8` | `SAVE` | NOT DONE | | | `$FFDB` | `SETTIM` | NOT DONE | | | `$FFDE` | `RDTIM` | NOT DONE | | -| `$FFE1` | `STOP` | PARTIAL | no connection with UDTIM | +| `$FFE1` | `STOP` | PARTIAL | | | `$FFE4` | `GETIN` | PARTIAL | only some devices supported | | `$FFE7` | `CLALL` | DONE | | -| `$FFEA` | `UDTIM` | NOT DONE | | +| `$FFEA` | `UDTIM` | NOT DONE | checking for STOP key present in SCNKEY instead | | `$FFED` | `SCREEN` | DONE | | | `$FFF0` | `PLOT` | NOT DONE | | | `$FFF3` | `IOBASE` | DONE | | diff --git a/c64/kernal/cint.s b/c64/kernal/cint.s index 25c31472..243ba5ff 100644 --- a/c64/kernal/cint.s +++ b/c64/kernal/cint.s @@ -48,9 +48,7 @@ cint_brk: ; entry for BRK and STOP+RESTORE - XXX, where should it start? ;; Set default I/O devices (see SCINIT description at http://sta.c64.org/cbm64krnfunc.html) jsr clrchn_reset - + ;; Fallthrough/jump to screen clear routine (Compute's Mapping the 64 p215) jmp clear_screen - rts - diff --git a/c64/kernal/interrupts/ea31.default_irq_handler.s b/c64/kernal/interrupts/ea31.default_irq_handler.s index ab74f1c8..944fe430 100644 --- a/c64/kernal/interrupts/ea31.default_irq_handler.s +++ b/c64/kernal/interrupts/ea31.default_irq_handler.s @@ -2,7 +2,8 @@ default_irq_handler: jsr blink_cursor - jsr scan_keyboard + jsr JSCNKEY + jsr JUDTIM ; update jiffy clock ;; Acknowledge CIA interrupt and return jmp clear_cia1_interrupt_flag_and_return_from_interrupt diff --git a/c64/kernal/interrupts/fe47.default_nmi_handler.s b/c64/kernal/interrupts/fe47.default_nmi_handler.s index fac6d0a7..3be62222 100644 --- a/c64/kernal/interrupts/fe47.default_nmi_handler.s +++ b/c64/kernal/interrupts/fe47.default_nmi_handler.s @@ -1,12 +1,25 @@ default_nmi_handler: - ;; XXX implement according to Compute's Mapping the Commodore 64, page 74 + ;; Implemented according to Compute's Mapping the Commodore 64, page 74 + ;; and to https://www.c64-wiki.com/wiki/Interrupt + + ;; Save registers, sequence according to Compute's Mapping the Commodore 64, page 73 + pha + txa + pha + tya + pha + + ;; XXX: RS-232 support is not implemented - ;; XXX check if the source was RESTORE key, quit if it wasn't (no RS-232 support) ;; XXX if cartridge present, enter it through warm start vector - ;; XXX if stop pressed, go to default_brk_handler - inc $D020 - rti + ;; According to C64 Wiki, if STOP key is pressed, the routine assumes warm start request + + jsr JSTOP + bcs + + jmp return_from_interrupt ; no STOP pressed +* + jmp (CBINV) ; STOP + RESTORE diff --git a/c64/kernal/interrupts/fe66.default_brk_handler.s b/c64/kernal/interrupts/fe66.default_brk_handler.s index 230be89d..6b1f4c73 100644 --- a/c64/kernal/interrupts/fe66.default_brk_handler.s +++ b/c64/kernal/interrupts/fe66.default_brk_handler.s @@ -3,9 +3,13 @@ default_brk_handler: ;; Implemented according to Compute's Mapping the Commodore 64, pages 73-74 + sei ; disable IRQs, to be sure they won't interfere + jsr JRESTOR jsr JIOINIT jsr CINT_BRK + cli + jmp (IBASIC_WARM_START) diff --git a/c64/kernal/interrupts/irq_handler.s b/c64/kernal/interrupts/irq_handler.s index 74d1eb78..0a3634ab 100644 --- a/c64/kernal/interrupts/irq_handler.s +++ b/c64/kernal/interrupts/irq_handler.s @@ -15,6 +15,8 @@ irq_handler: tya pha + ;; XXX check if caused by BRK, react accordingly + ;; Call interrupt routine (only if initialised) lda CINV ora CINV+1 diff --git a/c64/kernal/interrupts/nmi_handler.s b/c64/kernal/interrupts/nmi_handler.s index 220ec401..90c05444 100644 --- a/c64/kernal/interrupts/nmi_handler.s +++ b/c64/kernal/interrupts/nmi_handler.s @@ -1,7 +1,18 @@ nmi_handler: - ;; XXX provide real implementation + sei ;; don't allow IRQ to interfere, see https://www.c64-wiki.com/wiki/Interrupt + ;; Call interrupt routine (only if initialised) + pha + lda NMINV + ora NMINV+1 + bne + + pla jmp (NMINV) +* + ;; Vector not initialized - call default interrupt routine + pla + jmp default_nmi_handler + diff --git a/c64/kernal/jumptable/ff9f.jscnkey.s b/c64/kernal/jumptable/ff9f.jscnkey.s index 6da0b26f..2f445ce4 100644 --- a/c64/kernal/jumptable/ff9f.jscnkey.s +++ b/c64/kernal/jumptable/ff9f.jscnkey.s @@ -1,3 +1,3 @@ ; Scan keyboard ; C64 Programmer's Reference Guide Page 273 - jmp scan_keyboard + jmp SCNKEY diff --git a/c64/kernal/jumptable/ffea.judtim.s b/c64/kernal/jumptable/ffea.judtim.s index d637dff8..5cb58e73 100644 --- a/c64/kernal/jumptable/ffea.judtim.s +++ b/c64/kernal/jumptable/ffea.judtim.s @@ -1,4 +1,4 @@ ; $FFEA - Update jiffy clock vector ; (http://codebase64.org/doku.php?id=base:kernalreference) - jmp update_jiffy_clock + jmp UDTIM diff --git a/c64/kernal/scan_keyboard.s b/c64/kernal/scnkey.s similarity index 99% rename from c64/kernal/scan_keyboard.s rename to c64/kernal/scnkey.s index 8b9de00f..f5dd30cb 100644 --- a/c64/kernal/scan_keyboard.s +++ b/c64/kernal/scnkey.s @@ -69,7 +69,7 @@ ;// Operational Variables .alias MaxKeyRollover 3 -scan_keyboard: +scnkey: lda #$00 sta BufferQuantity @@ -538,5 +538,3 @@ KeyCanRepeat: KeyRepeatWait: pla jmp ConsiderNextKey - - diff --git a/c64/kernal/update_jiffy_clock.s b/c64/kernal/udtim.s similarity index 92% rename from c64/kernal/update_jiffy_clock.s rename to c64/kernal/udtim.s index 7e05883a..b502112f 100644 --- a/c64/kernal/update_jiffy_clock.s +++ b/c64/kernal/udtim.s @@ -8,5 +8,5 @@ ;; CPU registers that has to be preserved (see [RG64]): .Y ;; -update_jiffy_clock: +udtim: rts