diff --git a/c64/basic/,aliases.s b/c64/basic/,aliases.s index a978b466..55ebe0eb 100644 --- a/c64/basic/,aliases.s +++ b/c64/basic/,aliases.s @@ -25,6 +25,7 @@ .alias basic_start_of_free_space_ptr $31 .alias basic_start_of_strings_ptr $33 .alias basic_top_of_memory_ptr $37 + .alias basic_current_line_ptr $3d .alias basic_numeric_work_area $57 ; $57 - $60 inclusive = 10 bytes @@ -115,3 +116,15 @@ .alias enable_case_switch $0291 .alias screen_scroll_disable $0292 .alias pal_or_ntsc $02A6 + + + ;; BASIC uses some extra bytes for memory access under ROMs located at $2A7 onwards + ;; IRQs are disabled when doing such accesses, and a default NMI handler only increments + ;; a counter, so that if an NMI occurs, it doesn't crash the machine, but can be captured. + .alias missed_nmi_flag $2A7 + .alias tiny_nmi_handler $2A8 + .alias peek_under_roms tiny_nmi_handler+peek_under_roms_routine-tiny_nmi_handler_routine + .alias poke_under_roms tiny_nmi_handler+poke_under_roms_routine-tiny_nmi_handler_routine + .alias memmap_allram tiny_nmi_handler+memmap_allram_routine-tiny_nmi_handler_routine + .alias memmap_normal tiny_nmi_handler+memmap_normal_routine-tiny_nmi_handler_routine + diff --git a/c64/basic/basic_delete_line.s b/c64/basic/basic_delete_line.s new file mode 100644 index 00000000..e15e44fd --- /dev/null +++ b/c64/basic/basic_delete_line.s @@ -0,0 +1,9 @@ + ;; Delete the current BASIC line, which is assumed to have already + ;; been found with basic_find_line. + ;; Really only consists of copying memory down. + ;; The only complication is that we have to do the copy with ROMs + ;; banked out. Oh, yes, and we have to update all the links in + ;; the following basic lines. +basic_delete_line: + sec + rts diff --git a/c64/basic/basic_find_line.s b/c64/basic/basic_find_line.s new file mode 100644 index 00000000..a5ea3786 --- /dev/null +++ b/c64/basic/basic_find_line.s @@ -0,0 +1,46 @@ + ;; Find the BASIC line with number basic_line_number + + +basic_find_line: + ;; Get pointer to start of BASIC text + lda basic_start_of_text_ptr+0 + sta basic_current_line_ptr+0 + lda basic_start_of_text_ptr+1 + sta basic_current_line_ptr+1 + +basic_find_line_loop: + ;; Then search for line number + ;; Line number + ldy #2 + ldx #tiny_nmi_handler + sta $FFFF + + rts + +ram_routines_start: + +tiny_nmi_handler_routine: + inc missed_nmi_flag + rti + +peek_under_roms_routine: + stx peek_under_roms+7 ;Offset of arg of lda ($00),y + jsr memmap_allram + lda ($00),y + jmp memmap_normal + +poke_under_roms_routine: + stx poke_under_roms+7 ;Offset of arg of lda ($00),y + jsr memmap_allram + sta ($00),y + ;; FALL THROUGH +memmap_normal_routine: + pha + lda #$37 + sta $01 + pla + cli + rts + +memmap_allram_routine: + sei + lda #$04 + sta $01 + rts + +ram_routines_end: + .alias ram_routines_len ram_routines_end-ram_routines_start +