more work towards arrays support
This commit is contained in:
1 parent
8769cc1657
commit
7e5cfe9d92
5 files changed
+129
-19
No files matched your search
@@ -5,8 +5,12 @@
|
|||||||
|
|
||||||
check_stack_space:
|
check_stack_space:
|
||||||
|
|
||||||
|
phx_trash_a
|
||||||
|
|
||||||
tsx
|
tsx
|
||||||
cpx #$60 // XXX is this a safe threshold?
|
cpx #$60 // XXX is this a safe threshold?
|
||||||
bcc_16 do_FORMULA_TOO_COMPLEX_error
|
bcc_16 do_FORMULA_TOO_COMPLEX_error
|
||||||
|
|
||||||
|
plx_trash_a
|
||||||
|
|
||||||
rts
|
rts
|
||||||
@@ -49,9 +49,7 @@ array_create_fetch_dims_loop:
|
|||||||
|
|
||||||
// Check if the stack has reasonable space free
|
// Check if the stack has reasonable space free
|
||||||
|
|
||||||
phx_trash_a
|
|
||||||
jsr check_stack_space
|
jsr check_stack_space
|
||||||
plx_trash_a
|
|
||||||
|
|
||||||
// Fetch the dimension, increment it by 1, and put it on the stack;
|
// 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
|
// confirmed with original ROM, that it also stores dimensions in the reverse order
|
||||||
|
|||||||
@@ -69,13 +69,9 @@ fetch_variable_adjust_VARPNT:
|
|||||||
|
|
||||||
#if !HAS_OPCODES_65CE02
|
#if !HAS_OPCODES_65CE02
|
||||||
|
|
||||||
clc
|
lda #$02
|
||||||
lda VARPNT+0
|
jsr helper_VARPNT_up_A
|
||||||
adc #$02
|
|
||||||
sta VARPNT+0
|
|
||||||
bcc !+
|
|
||||||
inc VARPNT+1
|
|
||||||
!:
|
|
||||||
#else // HAS_OPCODES_65CE02
|
#else // HAS_OPCODES_65CE02
|
||||||
|
|
||||||
inw VARPNT
|
inw VARPNT
|
||||||
@@ -91,13 +87,10 @@ fetch_variable_find_addr_next:
|
|||||||
// Increase VARPNT by 7 - constant value, each variable uses 7 bytes, see:
|
// Increase VARPNT by 7 - constant value, each variable uses 7 bytes, see:
|
||||||
// - https://sites.google.com/site/h2obsession/CBM/basic/variable-format
|
// - https://sites.google.com/site/h2obsession/CBM/basic/variable-format
|
||||||
|
|
||||||
clc
|
lda #$07
|
||||||
lda VARPNT+0
|
jsr helper_VARPNT_up_A
|
||||||
adc #$07
|
|
||||||
sta VARPNT+0
|
jmp_8 fetch_variable_find_addr_loop
|
||||||
bcc fetch_variable_find_addr_loop
|
|
||||||
inc VARPNT+1
|
|
||||||
bne fetch_variable_find_addr_loop // branch always
|
|
||||||
|
|
||||||
fetch_variable_alocate:
|
fetch_variable_alocate:
|
||||||
|
|
||||||
|
|||||||
@@ -10,13 +10,110 @@ fetch_variable_arr:
|
|||||||
|
|
||||||
// Array does not exist - we will have to create one with default parameters
|
// Array does not exist - we will have to create one with default parameters
|
||||||
|
|
||||||
lda #$00
|
// XXX implement this
|
||||||
sta VARPNT+1
|
|
||||||
|
jmp do_NOT_IMPLEMENTED_error
|
||||||
!:
|
!:
|
||||||
// Fetch the 'coordinates'
|
// Fetch the 'coordinates'
|
||||||
|
|
||||||
|
ldx #$00 // counts number of dimensions
|
||||||
|
|
||||||
|
// FALLTROUGH
|
||||||
|
|
||||||
|
fetch_variable_arr_fetch_coords_loop:
|
||||||
|
|
||||||
|
inx
|
||||||
|
|
||||||
|
// Check if the stack has reasonable space free
|
||||||
|
|
||||||
|
jsr check_stack_space
|
||||||
|
|
||||||
|
// Fetch the dimension and put it on the stack
|
||||||
|
|
||||||
|
jsr fetch_uint16
|
||||||
|
bcs_16 do_SYNTAX_error
|
||||||
|
|
||||||
|
lda LINNUM+0
|
||||||
|
pha
|
||||||
|
lda LINNUM+1
|
||||||
|
pha
|
||||||
|
|
||||||
|
// Check if more dimensions are given
|
||||||
|
|
||||||
|
jsr fetch_character_skip_spaces
|
||||||
|
cmp #$2C // ','
|
||||||
|
beq fetch_variable_arr_fetch_coords_loop
|
||||||
|
cmp #$29 // ')'
|
||||||
|
bne_16 do_SYNTAX_error
|
||||||
|
|
||||||
|
// FALLTROUGH
|
||||||
|
|
||||||
|
fetch_variable_arr_check_dimensions:
|
||||||
|
|
||||||
|
// Check if the number of dimensions matches the stored ones
|
||||||
|
|
||||||
|
#if CONFIG_MEMORY_MODEL_60K
|
||||||
|
|
||||||
|
// XXX
|
||||||
|
// XXX
|
||||||
|
// XXX
|
||||||
|
|
||||||
|
#elif CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K
|
||||||
|
|
||||||
|
// XXX
|
||||||
|
// XXX
|
||||||
|
// XXX
|
||||||
|
|
||||||
|
#else // CONFIG_MEMORY_MODEL_38
|
||||||
|
|
||||||
|
ldy #$04
|
||||||
|
txa
|
||||||
|
cmp (VARPNT), y
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bne_16 do_BAD_SUBSCRIPT_error
|
||||||
|
|
||||||
|
// FALLTROUGH
|
||||||
|
|
||||||
|
fetch_variable_arr_calc_pos:
|
||||||
|
|
||||||
|
// Move VARPNT po point to sizes in each dimension
|
||||||
|
|
||||||
|
lda #$05
|
||||||
|
jsr helper_VARPNT_up_A
|
||||||
|
|
||||||
|
// Set previous dimension size as '1'
|
||||||
|
|
||||||
// XXX implement this
|
// XXX implement this
|
||||||
|
|
||||||
// XXX finish the implementation
|
// FALLTROUGH
|
||||||
|
|
||||||
|
fetch_variable_arr_calc_pos_loop:
|
||||||
|
|
||||||
|
// Fetch the coordinate from stack
|
||||||
|
|
||||||
|
// XXX implement this
|
||||||
|
|
||||||
|
// Compare current coordinate with current dimension size
|
||||||
|
|
||||||
|
// XXX implement this
|
||||||
|
|
||||||
|
// Multiply current coordinate with previous dimension
|
||||||
|
|
||||||
|
// XXX implement this
|
||||||
|
|
||||||
|
// Store current dimension, for the next iteration
|
||||||
|
|
||||||
|
// XXX implement this
|
||||||
|
|
||||||
|
// Check if there are more dimensions to handle
|
||||||
|
|
||||||
|
dex
|
||||||
|
bne fetch_variable_arr_calc_pos_loop
|
||||||
|
|
||||||
|
// Increment VARPNT by the calculated offset and quit
|
||||||
|
|
||||||
|
// XXX implement this
|
||||||
|
|
||||||
jmp do_NOT_IMPLEMENTED_error
|
jmp do_NOT_IMPLEMENTED_error
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
// #LAYOUT# STD * #TAKE
|
||||||
|
// #LAYOUT# * BASIC_0 #TAKE
|
||||||
|
// #LAYOUT# * * #IGNORE
|
||||||
|
|
||||||
|
//
|
||||||
|
// Helper routine, used by various variable-related routines
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
helper_VARPNT_up_A: // .A - bytes to increment VARPNT
|
||||||
|
|
||||||
|
clc
|
||||||
|
adc VARPNT+0
|
||||||
|
sta VARPNT+0
|
||||||
|
bcc !+
|
||||||
|
inc VARPNT+1
|
||||||
|
!:
|
||||||
|
rts
|
||||||
Reference in new issue
Block a user