// #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 #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 ldy #$00 lda (VARPNT), y sta DSCPNT+0 iny lda (VARPNT), y sta DSCPNT+1 iny lda (VARPNT), y sta DSCPNT+2 #endif // 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 - check if the old one is, free it if necessary lda DSCPNT+0 bne !+ jsr varstr_free_DSCPNT_set !: // Set the new variable as empty string ldy #$00 lda #$00 #if CONFIG_MEMORY_MODEL_60K ldx #