From 65af677caa43a6bb88ec0fc06c146a17ddaa5c32 Mon Sep 17 00:00:00 2001 From: Paul Gardner-Stephen Date: Mon, 29 Apr 2019 22:36:25 +0930 Subject: [PATCH] factor out basic line number parsing routine --- c64/basic/basic_main_loop.s | 33 ++++++----------------------- c64/basic/basic_parse_line_number.s | 27 +++++++++++++++++++++++ 2 files changed, 34 insertions(+), 26 deletions(-) create mode 100644 c64/basic/basic_parse_line_number.s diff --git a/c64/basic/basic_main_loop.s b/c64/basic/basic_main_loop.s index 60909d0e..b3153ae4 100644 --- a/c64/basic/basic_main_loop.s +++ b/c64/basic/basic_main_loop.s @@ -79,32 +79,19 @@ rsl_l1: lda $0200,x lda #$00 sta tokenise_work1 - ;; Try to read linne number + ;; Try to read line number lda #<$0200 sta basic_current_statement_ptr+0 lda #>$0200 - sta basic_current_statement_ptr+1 - jsr injest_number + sta basic_current_statement_ptr+1 - ;; Copy offset of first position after number back out + jsr basic_parse_line_number + + ;; Get pointer to next char lda basic_current_statement_ptr+0 sta tokenise_work1 - - ;; Check if the number is a valid line number - ;; i.e., 16 bits, no exponent, no decimal - lda basic_fac1_mantissa+2 - ora basic_fac1_mantissa+3 - ora basic_fac1_exponent - beq + -ml_bad_line_number: - ;; Syntax error - ldx #10 - jmp do_basic_error -* lda tokenise_work4 - cmp #$ff - bne ml_bad_line_number - - ;; Got a valid line number. + + ;; Got a valid line number -- so do add/del line ;; Skip any spaces after the line number ldx tokenise_work1 @@ -122,12 +109,6 @@ skip_spaces: ;; memory free, or else it would auto CLR when you ran out of program space). jsr basic_do_clr - ;; Copy to line number holder - lda basic_fac1_mantissa+0 - sta basic_line_number+0 - lda basic_fac1_mantissa+1 - sta basic_line_number+1 - ;; Delete line if present jsr basic_find_line diff --git a/c64/basic/basic_parse_line_number.s b/c64/basic/basic_parse_line_number.s new file mode 100644 index 00000000..083cdf61 --- /dev/null +++ b/c64/basic/basic_parse_line_number.s @@ -0,0 +1,27 @@ + +basic_parse_line_number: + + jsr injest_number + + ;; Check if the number is a valid line number + ;; i.e., 16 bits, no exponent, no decimal + lda basic_fac1_mantissa+2 + ora basic_fac1_mantissa+3 + ora basic_fac1_exponent + beq + +ml_bad_line_number: + ldx #10 + jmp do_basic_error +* + ;; Line number are not allowed to have decimal points in them + lda tokenise_work4 + cmp #$ff + bne ml_bad_line_number + + ;; Got a valid line number. + lda basic_fac1_mantissa+0 + sta basic_line_number+0 + lda basic_fac1_mantissa+1 + sta basic_line_number+1 + clc + rts