variable support cleanup

This commit is contained in:
FeralChild64 committed 2020-07-19 08:54:53 +02:00
1 parent 51aec45c8d
commit 09f85cea8a
64 files changed
+266 -87

No files matched your search

+1 -1
View File
@@ -19,7 +19,7 @@
cmd_input,
cmd_dim,
cmd_read,
cmd_let,
assign_variable, // cmd_let
cmd_goto,
cmd_run,
cmd_if,
-284
View File
@@ -1,284 +0,0 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * BASIC_0 #TAKE
// #LAYOUT# * * #IGNORE
cmd_let:
// Fetch variable name, should be followed by assign operator
jsr fetch_variable
#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
// Determine variable type and push it to the stack
lda #$00
clc
bit VARNAM+0
bpl !+
adc #$01
!:
bit VARNAM+1
bpl !+
adc #$80
!:
pha
// Push the VARPNT to the stack - it might get overridden
lda VARPNT+0
pha
lda VARPNT+1
pha
// Evaluate the expression
jsr FRMEVL
// Restore VARPNT
pla
sta VARPNT+1
pla
sta VARPNT+0
// Determine what to assign
pla
bmi cmd_let_assign_string
beq cmd_let_assign_float
// FALLTROUGH
// XXX integer and float probably have much in common
cmd_let_assign_integer:
lda VALTYP
bmi_16 do_TYPE_MISMATCH_error
#if CONFIG_MEMORY_MODEL_60K
// XXX
// XXX: implement this
// XXX
#elif CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K
// XXX consider optimized version without multiple JSRs
// XXX
// XXX: implement this
// XXX
#else // CONFIG_MEMORY_MODEL_38K
// XXX
// XXX: implement this
// XXX
#endif
jmp do_NOT_IMPLEMENTED_error
cmd_let_assign_float:
lda VALTYP
bmi_16 do_TYPE_MISMATCH_error
#if CONFIG_MEMORY_MODEL_60K
// XXX
// XXX: implement this
// XXX
#elif CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K
// XXX consider optimized version without multiple JSRs
// XXX
// XXX: implement this
// XXX
#else // CONFIG_MEMORY_MODEL_38K
// XXX
// XXX: implement this
// XXX
#endif
jmp do_NOT_IMPLEMENTED_error
cmd_let_assign_string:
// Check if value type matches
lda VALTYP
bpl_16 do_TYPE_MISMATCH_error
// Copy the string descriptor to DSCPNT
jsr helper_let_strdesccpy
// First special case - check if the new string has size 0
lda __FAC1+0
bne cmd_let_assign_string_not_empty
// Yes, it is empty - free the old one
jsr varstr_free
// Set the new variable as empty string
ldy #$00
lda #$00
#if CONFIG_MEMORY_MODEL_60K
ldx #<VARPNT
jsr poke_under_roms
#else // CONFIG_MEMORY_MODEL_38K || CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K
sta (VARPNT), y
#endif
rts
cmd_let_assign_string_not_empty:
// Check if the source and destination strings are the same
lda DSCPNT+1
cmp __FAC1+1
bne cmd_let_assign_string_not_same
iny
lda DSCPNT+2
cmp __FAC1+2
bne cmd_let_assign_string_not_same
// If we are here, than both source and destination strings are the same - nothing more to be done
rts
cmd_let_assign_string_not_same:
// Strings are not the same - check if the new one is located within the text area, between TXTTAB and VARTAB
lda VARTAB+1
cmp __FAC1+2
bcc cmd_let_assign_string_not_text_area
bne !+
lda VARTAB+0
cmp __FAC1+1
bcc cmd_let_assign_string_not_text_area
!:
lda __FAC1+2
cmp TXTTAB+1
bcc cmd_let_assign_string_not_text_area
bne !+
lda __FAC1+1
cmp TXTTAB+0
bcc cmd_let_assign_string_not_text_area
!:
// String is located within text area - great, just copy the descriptor
#if CONFIG_MEMORY_MODEL_60K
// .X already contains #<VARPNT
ldy #$00
lda __FAC1+0
jsr poke_under_roms
iny
lda __FAC1+1
jsr poke_under_roms
iny
lda __FAC1+2
jsr poke_under_roms
#else // CONFIG_MEMORY_MODEL_38K || CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K
ldy #$00
lda __FAC1+0
sta (VARPNT), y
iny
lda __FAC1+1
sta (VARPNT), y
iny
lda __FAC1+2
sta (VARPNT), y
#endif
rts
cmd_let_assign_string_not_text_area:
// Check if the new string is a temporary one - if so, reuse alocation
// XXX
// Check if the old string belongs to the string area (is above FRETOP)
jsr varstr_cmp_fretop
bcc cmd_let_assign_string_no_optimizations
// FALLTROUGH
cmd_let_assign_string_try_reuse:
// Check if we can reuse old string memory
lda DSCPNT+0
cmp __FAC1+0
// If size of both string equals - simply reuse it
beq_16 helper_let_strvarcpy
cmd_let_assign_string_try_reuse_unsuccesful:
// No special case optimization is possible - but first get rid of the old string
jsr varstr_free
// FALLTROUGH
cmd_let_assign_string_no_optimizations:
// Allocate memory for the new string
lda __FAC1+0
ldy #$00
#if CONFIG_MEMORY_MODEL_60K
ldx #<VARPNT
jsr poke_under_roms
#else // CONFIG_MEMORY_MODEL_38K || CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K
sta (VARPNT), y
#endif
jsr varstr_alloc
// Copy the string and quit
jmp helper_let_strvarcpy
@@ -1,26 +0,0 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * BASIC_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// Helper routine to copy string descriptor, for LET command and TI$ variable support
//
#if CONFIG_MEMORY_MODEL_38K
helper_let_strdesccpy:
ldy #$00
lda (VARPNT), y
sta DSCPNT+0
iny
lda (VARPNT), y
sta DSCPNT+1
iny
lda (VARPNT), y
sta DSCPNT+2
rts
#endif
@@ -1,40 +0,0 @@
// #LAYOUT# STD * #TAKE-HIGH
// #LAYOUT# * BASIC_0 #TAKE-HIGH
// #LAYOUT# * * #IGNORE
// This has to go $E000 or above - routines below banks out the main BASIC ROM!
//
// Helper routine to copy string descriptor, for LET command and TI$ variable support
//
#if CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K
helper_let_strdesccpy:
// Unmap BASIC lower ROM
lda #$26
sta CPU_R6510
// Retrieve pointer to destination
ldy #$00
lda (VARPNT), y
sta DSCPNT+0
iny
lda (VARPNT), y
sta DSCPNT+1
iny
lda (VARPNT), y
sta DSCPNT+2
// Restore default memory mapping
lda #$27
sta CPU_R6510
rts
#endif
@@ -1,28 +0,0 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * BASIC_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// Helper routine to copy string descriptor, for LET command and TI$ variable support
//
#if CONFIG_MEMORY_MODEL_60K
helper_let_strdesccpy:
ldx #<VARPNT
ldy #$00
jsr peek_under_roms
sta DSCPNT+0
iny
jsr peek_under_roms
sta DSCPNT+1
iny
jsr peek_under_roms
sta DSCPNT+2
rts
#endif
@@ -1,34 +0,0 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * BASIC_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// Helper routine to copy string descriptor, for LET command
//
#if CONFIG_MEMORY_MODEL_38K
helper_let_strvarcpy:
// Retrieve pointer to destination
ldy #$02
lda (VARPNT), y
sta DSCPNT+2
dey
lda (VARPNT), y
sta DSCPNT+1
dey
// .Y is now 0 - copy the content
!:
lda (__FAC1+1),y
sta (DSCPNT+1),y
iny
cpy __FAC1+0
bne !-
rts
#endif
@@ -1,46 +0,0 @@
// #LAYOUT# STD * #TAKE-HIGH
// #LAYOUT# * BASIC_0 #TAKE-HIGH
// #LAYOUT# * * #IGNORE
// This has to go $E000 or above - routines below banks out the main BASIC ROM!
//
// Helper routine to copy string variable content, for LET command
//
#if CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K
helper_let_strvarcpy:
// Unmap BASIC lower ROM
lda #$26
sta CPU_R6510
// Retrieve pointer to destination
ldy #$02
lda (VARPNT), y
sta DSCPNT+2
dey
lda (VARPNT), y
sta DSCPNT+1
dey
// Copy the string content
!:
lda (__FAC1+1),y
sta (DSCPNT+1),y
iny
cpy __FAC1+0
bne !-
// Restore default memory mapping
lda #$27
sta CPU_R6510
rts
#endif
@@ -1,39 +0,0 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * BASIC_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// Helper routine to copy string descriptor, for LET command
//
#if CONFIG_MEMORY_MODEL_60K
helper_let_strvarcpy:
ldx #<VARPNT
// Retrieve pointer to destination
ldy #$02
jsr peek_under_roms
sta DSCPNT+2
dey
jsr peek_under_roms
sta DSCPNT+1
dey
// .Y is now 0 - copy the content
!:
ldx #<__FAC1+1
jsr peek_under_roms
ldx #<DSCPNT+1
jsr poke_under_roms
iny
cpy __FAC1+0
bne !-
rts
#endif