diff --git a/c64/basic/basic_do_new.s b/c64/basic/basic_do_new.s new file mode 100644 index 00000000..c50d10b1 --- /dev/null +++ b/c64/basic/basic_do_new.s @@ -0,0 +1,90 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# M65 * #TAKE +// #LAYOUT# X16 BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + + +basic_do_new: + +#if (ROM_LAYOUT_M65 && SEGMENT_BASIC_0) + + jsr map_BASIC_1 + jsr_ind VB1__basic_do_new + jmp map_NORMAL + +basic_do_clr: + + jsr map_BASIC_1 + jsr_ind VB1__basic_do_clr + jmp map_NORMAL + +#else + + // Setup pointers to memory storage XXX should depend on text start vector + lda #<$0801 + sta TXTTAB+0 + lda #>$0801 + sta TXTTAB+1 + sta VARTAB+1 + lda #<$0803 + sta VARTAB+0 + + // Zero line pointer + // XXX - We should also zero $0800, i.e., TXTTAB - 1 + ldy #$00 + tya + sta (TXTTAB),y + iny + sta (TXTTAB),y + + + // Get top of memory. + // If a cart is present, then it is $7FFF, + // if not, then it is $F7FF, since we support having + // programs and variables under ROM. + // i.e., we support 56KB RAM for BASIC, keeping some space + // free for some optimisation structures, e.g., FOR/NEXT loop + // records (without them going on the stack), GOSUB stack + // (same story), expression value cache? + + sec // Read, not write value + jsr JMEMTOP + cpx #$80 + beq !+ +#if CONFIG_MEMORY_MODEL_60K + lda #>$F7FF +#else // CONFIG_MEMORY_MODEL_38K + lda #>$A000 +#endif + .byte $2C +!: +#if CONFIG_MEMORY_MODEL_60K + lda #>$F7FF +#else // CONFIG_MEMORY_MODEL_38K + lda #>$A000 +#endif + sta MEMSIZ+1 + sta FRETOP+1 +#if CONFIG_MEMORY_MODEL_60K + lda #<$F7FF +#else // CONFIG_MEMORY_MODEL_38K + lda #<$A000 +#endif + sta MEMSIZ+0 + sta FRETOP+0 + + // FALL THROUGH + +basic_do_clr: + + // Clear variables, arrays and strings + lda VARTAB+0 + sta ARYTAB+0 + sta STREND+0 + lda VARTAB+1 + sta ARYTAB+1 + sta STREND+1 + + rts + +#endif // ROM layout diff --git a/c64/basic/board_m65/4000.mega65_vectable_basic_1.s b/c64/basic/board_m65/4000.mega65_vectable_basic_1.s index 46c49a83..992f8e7c 100644 --- a/c64/basic/board_m65/4000.mega65_vectable_basic_1.s +++ b/c64/basic/board_m65/4000.mega65_vectable_basic_1.s @@ -15,6 +15,8 @@ .label VB1__tokenise_line = $4000 + 2 * 1 .label VB1__list_single_line = $4000 + 2 * 2 .label VB1__print_packed_message = $4000 + 2 * 3 + .label VB1__basic_do_clr = $4000 + 2 * 4 + .label VB1__basic_do_new = $4000 + 2 * 5 #else @@ -24,5 +26,7 @@ .word tokenise_line .word list_single_line .word print_packed_message + .word basic_do_clr + .word basic_do_new #endif diff --git a/c64/basic/board_m65/mega65_imports.s b/c64/basic/board_m65/mega65_imports.s index e611cab3..fb4e5161 100644 --- a/c64/basic/board_m65/mega65_imports.s +++ b/c64/basic/board_m65/mega65_imports.s @@ -10,8 +10,8 @@ .label peek_under_roms = BASIC_0.proxy_B1_peek_under_roms .label JCHROUT = BASIC_0.proxy_B1_JCHROUT +.label JMEMTOP = KERNAL_0.JMEMTOP .label plot_set = KERNAL_0.plot_set -.label basic_do_new = BASIC_0.proxy_B1_basic_do_new .label rom_revision_basic_string = BASIC_0.rom_revision_basic_string .label print_integer = BASIC_0.proxy_B1_print_integer .label print_return = BASIC_0.proxy_B1_print_return diff --git a/c64/basic/board_m65/mega65_proxies.s b/c64/basic/board_m65/mega65_proxies.s index f6f2fbf7..6da2f738 100644 --- a/c64/basic/board_m65/mega65_proxies.s +++ b/c64/basic/board_m65/mega65_proxies.s @@ -24,13 +24,6 @@ proxy_B1_JCHROUT: jmp map_BASIC_1 -proxy_B1_basic_do_new: - - jsr map_NORMAL - jsr basic_do_new - jmp map_BASIC_1 - - proxy_B1_print_integer: jsr map_NORMAL diff --git a/c64/basic/commands/cmd_clr.s b/c64/basic/commands/cmd_clr.s new file mode 100644 index 00000000..8f7b7af5 --- /dev/null +++ b/c64/basic/commands/cmd_clr.s @@ -0,0 +1,12 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# * BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + + +cmd_clr: + + jsr basic_do_clr + + // CLR command does not stop execution + // (Cconfirmed on a c64) + jmp basic_execute_statement diff --git a/c64/basic/commands/cmd_new.s b/c64/basic/commands/cmd_new.s index fc455a77..31c6681b 100644 --- a/c64/basic/commands/cmd_new.s +++ b/c64/basic/commands/cmd_new.s @@ -4,81 +4,9 @@ cmd_new: + jsr basic_do_new // NEW command terminates execution // (Confirmed on a C64) jmp basic_main_loop - -cmd_clr: - jsr basic_do_clr - // CLR command does not stop execution - // (Cconfirmed on a c64) - jmp basic_execute_statement - -basic_do_new: - // Setup pointers to memory storage XXX should depend on text start vector - lda #<$0801 - sta TXTTAB+0 - lda #>$0801 - sta TXTTAB+1 - sta VARTAB+1 - lda #<$0803 - sta VARTAB+0 - - // Zero line pointer - // XXX - We should also zero $0800, i.e., TXTTAB - 1 - ldy #$00 - tya - sta (TXTTAB),y - iny - sta (TXTTAB),y - - - // Get top of memory. - // If a cart is present, then it is $7FFF, - // if not, then it is $F7FF, since we support having - // programs and variables under ROM. - // i.e., we support 56KB RAM for BASIC, keeping some space - // free for some optimisation structures, e.g., FOR/NEXT loop - // records (without them going on the stack), GOSUB stack - // (same story), expression value cache? - - sec // Read, not write value - jsr JMEMTOP - cpx #$80 - beq !+ -#if CONFIG_MEMORY_MODEL_60K - lda #>$F7FF -#else // CONFIG_MEMORY_MODEL_38K - lda #>$A000 -#endif - .byte $2C -!: -#if CONFIG_MEMORY_MODEL_60K - lda #>$F7FF -#else // CONFIG_MEMORY_MODEL_38K - lda #>$A000 -#endif - sta MEMSIZ+1 - sta FRETOP+1 -#if CONFIG_MEMORY_MODEL_60K - lda #<$F7FF -#else // CONFIG_MEMORY_MODEL_38K - lda #<$A000 -#endif - sta MEMSIZ+0 - sta FRETOP+0 - - // FALL THROUGH - -basic_do_clr: - // Clear variables, arrays and strings - lda VARTAB+0 - sta ARYTAB+0 - sta STREND+0 - lda VARTAB+1 - sta ARYTAB+1 - sta STREND+1 - - rts