code size optimization in BASIC
This commit is contained in:
1 parent
07674b4e23
commit
dd85061c47
6 files changed
+86
-55
No files matched your search
@@ -144,7 +144,7 @@ tk_pack_loop_next:
|
||||
cmp #TK__MAX_KEYWORD_LEN
|
||||
beq !+ // if max length reached - quit
|
||||
|
||||
// Check for characters that can only end the token
|
||||
// Check for characters that can only end the keyword
|
||||
|
||||
lda BUF-1, x
|
||||
cmp #$41
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
// #LAYOUT# * * #IGNORE
|
||||
|
||||
//
|
||||
// Consummes assign operator in a BASIC code, Carry set if not found. Injests all spaces.
|
||||
// Consummes assign operator in a BASIC code, triggers error if not found
|
||||
//
|
||||
|
||||
|
||||
@@ -11,19 +11,6 @@ injest_assign:
|
||||
|
||||
jsr fetch_character_skip_spaces
|
||||
cmp #$B2 // assign operator character
|
||||
beq injest_assign_found
|
||||
|
||||
// Not found
|
||||
#if !HAS_OPCODES_65CE02
|
||||
jsr unconsume_character
|
||||
#else
|
||||
dew TXTPTR
|
||||
#endif
|
||||
bne_16 do_SYNTAX_error
|
||||
|
||||
sec
|
||||
rts
|
||||
|
||||
injest_assign_found:
|
||||
|
||||
clc
|
||||
rts
|
||||
@@ -47,15 +47,10 @@ array_create_fetch_dims_loop:
|
||||
|
||||
inx
|
||||
|
||||
// Check if the stack has reasonable space free
|
||||
|
||||
jsr check_stack_space
|
||||
|
||||
// Fetch the dimension, increment it by 1, and put it on the stack;
|
||||
// confirmed with original ROM, that it also stores dimensions in the reverse order
|
||||
|
||||
jsr fetch_uint16
|
||||
bcs_16 do_SYNTAX_error
|
||||
jsr helper_fetch_arr_coord
|
||||
|
||||
#if !HAS_OPCODES_65CE02
|
||||
inc LINNUM+0
|
||||
@@ -75,11 +70,8 @@ array_create_fetch_dims_loop:
|
||||
|
||||
// Check if more dimensions are given
|
||||
|
||||
jsr fetch_character_skip_spaces
|
||||
cmp #$2C // ','
|
||||
cpy #$00
|
||||
beq array_create_fetch_dims_loop
|
||||
cmp #$29 // ')'
|
||||
bne_16 do_SYNTAX_error
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
|
||||
@@ -5,26 +5,35 @@
|
||||
|
||||
assign_variable:
|
||||
|
||||
// Fetch variable name, should be followed by assign operator
|
||||
// Fetch variable/array name
|
||||
|
||||
jsr fetch_variable_name
|
||||
|
||||
#if HAS_OPCODES_65CE02
|
||||
|
||||
bcs_16 do_SYNTAX_error
|
||||
jsr injest_assign
|
||||
bcs_16 do_SYNTAX_error
|
||||
|
||||
#else
|
||||
|
||||
bcs !+
|
||||
jsr injest_assign
|
||||
bcc !++
|
||||
!:
|
||||
jmp do_SYNTAX_error
|
||||
!:
|
||||
|
||||
#endif
|
||||
// Check for array
|
||||
|
||||
lda DIMFLG
|
||||
bpl assign_variable_not_array
|
||||
|
||||
// Retrieve all the dimensions
|
||||
|
||||
// XXX implement this
|
||||
|
||||
jmp do_NOT_IMPLEMENTED_error
|
||||
|
||||
// Fetch assignment operator and continue
|
||||
|
||||
jsr injest_assign
|
||||
|
||||
jmp_8 assign_variable_common
|
||||
|
||||
assign_variable_not_array:
|
||||
|
||||
// Require assignment operator
|
||||
|
||||
jsr injest_assign
|
||||
|
||||
// Check for special variables
|
||||
|
||||
@@ -37,8 +46,14 @@ assign_variable:
|
||||
jsr is_var_ST
|
||||
beq_16 do_SYNTAX_error
|
||||
|
||||
// Push the VARNAM to the stack - it might get overridden
|
||||
// FALLTROUGH
|
||||
|
||||
assign_variable_common:
|
||||
|
||||
// Push the DIMFLG and VARNAM to the stack - it might get overridden
|
||||
|
||||
lda DIMFLG
|
||||
pha
|
||||
lda VARNAM+0
|
||||
pha
|
||||
lda VARNAM+1
|
||||
@@ -48,15 +63,18 @@ assign_variable:
|
||||
|
||||
jsr FRMEVL
|
||||
|
||||
// Restore VARNAM
|
||||
// Restore VARNAM and DIMFLG
|
||||
|
||||
pla
|
||||
sta VARNAM+1
|
||||
pla
|
||||
sta VARNAM+0
|
||||
pla
|
||||
sta DIMFLG // XXX is it needed?
|
||||
|
||||
// XXX add array handling here
|
||||
|
||||
// Retrieve the variable address
|
||||
// XXX add support for arrays
|
||||
|
||||
jsr fetch_variable_find_addr
|
||||
|
||||
|
||||
@@ -27,27 +27,19 @@ fetch_variable_arr_fetch_coords_loop:
|
||||
|
||||
inx
|
||||
|
||||
// Check if the stack has reasonable space free
|
||||
// Fetch the coordinate and put it on the stack
|
||||
|
||||
jsr check_stack_space
|
||||
|
||||
// Fetch the dimension and put it on the stack
|
||||
|
||||
jsr fetch_uint16
|
||||
bcs_16 do_SYNTAX_error
|
||||
jsr helper_fetch_arr_coord
|
||||
|
||||
lda LINNUM+0
|
||||
pha
|
||||
lda LINNUM+1
|
||||
pha
|
||||
|
||||
// Check if more dimensions are given
|
||||
// If more coordinates given - next iteration
|
||||
|
||||
jsr fetch_character_skip_spaces
|
||||
cmp #$2C // ','
|
||||
cpy #$00
|
||||
beq fetch_variable_arr_fetch_coords_loop
|
||||
cmp #$29 // ')'
|
||||
bne_16 do_SYNTAX_error
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
// #LAYOUT# STD * #TAKE
|
||||
// #LAYOUT# * BASIC_0 #TAKE
|
||||
// #LAYOUT# * * #IGNORE
|
||||
|
||||
//
|
||||
// Helper routine for fetching array coordinates
|
||||
//
|
||||
// If this was last coordinate, set .Y to $FF, otherwise to $00
|
||||
//
|
||||
|
||||
helper_fetch_arr_coord:
|
||||
|
||||
// Check if the stack has reasonable space free
|
||||
|
||||
jsr check_stack_space
|
||||
|
||||
// Fetch the dimension
|
||||
|
||||
jsr fetch_uint16
|
||||
bcs !+
|
||||
|
||||
jsr fetch_character_skip_spaces
|
||||
cmp #$2C // ','
|
||||
beq helper_fetch_arr_more
|
||||
cmp #$29 // ')'
|
||||
beq helper_fetch_arr_last
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
!:
|
||||
|
||||
jmp do_SYNTAX_error
|
||||
|
||||
helper_fetch_arr_more:
|
||||
|
||||
ldy #$00
|
||||
rts
|
||||
|
||||
helper_fetch_arr_last:
|
||||
|
||||
ldy #$FF
|
||||
rts
|
||||
Reference in new issue
Block a user