started work on LET command

This commit is contained in:
FeralChild64 committed 2020-07-10 17:01:04 +02:00
1 parent d4d656add6
commit 44493d40cb
7 files changed
+176 -14

No files matched your search

+1 -1
View File
@@ -46,7 +46,7 @@
.label DATLIN = $3F // $3F-$40 -- NOT IMPLEMENTED --
.label DATPTR = $41 // $41-$42 pointer for READ/DATA copmmands
.label INPPTR = $43 // $43-$44 -- NOT IMPLEMENTED --
.label VARNAM = $45 // $45-$46 -- NOT IMPLEMENTED --
.label VARNAM = $45 // $45-$46 current variable name
.label VARPNT = $47 // $47-$48 -- NOT IMPLEMENTED --
.label FORPNT = $49 // $49-$4A -- NOT IMPLEMENTED --
.label OPPTR = $4B // $4B-$4C helper variable for expression computation, [!] our usage details are different
@@ -23,8 +23,6 @@ cmd_dim:
nop
cmd_read:
nop
cmd_let:
nop
cmd_if:
nop
cmd_gosub:
+17
View File
@@ -0,0 +1,17 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * BASIC_0 #TAKE
// #LAYOUT# * * #IGNORE
cmd_let:
// Fetch variable name, should be followed by assign operator
jsr fetch_variable
jsr injest_assign
bcs_16 do_SYNTAX_error
// XXX finish the implementation
jmp do_NOT_IMPLEMENTED_error
+12 -11
View File
@@ -37,22 +37,22 @@ execute_statements:
ldx #$19
stx TEMPPT
// Check if token is valid for execution
cmp #$7F
bcc_16 execute_statements_var_assign // not a token - try variable assign
// Move token code to .X
tax
// A token - first push the 'end_of_statement' address for RTS
// Push the 'end_of_statement' address for RTS
lda #>(end_of_statement - 1)
pha
lda #<(end_of_statement - 1)
pha
// Check if token is valid for execution
cpx #$7F
bcc_16 execute_statements_var_assign // not a token - try variable assign
cpx #$A6
bcs execute_statements_extended
@@ -243,17 +243,18 @@ execute_line:
execute_statements_var_assign:
// XXX here we should handle variable assignments, probably in a separate file
// Prevent wedges from being executed within a program
#if CONFIG_TAPE_WEDGE
cmp #$40
cpx #$40
beq_16 do_DIRECT_MODE_ONLY_error
#endif
#if CONFIG_DOS_WEDGE
cmp #$5F
cpx #$5F
beq_16 do_DIRECT_MODE_ONLY_error
#endif
jmp do_SYNTAX_error
// Try variable assignment - execute as LET command
jsr unconsume_character
jmp cmd_let
+84
View File
@@ -0,0 +1,84 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * BASIC_0 #TAKE
// #LAYOUT# * * #IGNORE
fetch_variable:
// Fetch variable name
lda #$00
sta VARNAM+1
// Fetch the first character
!:
jsr fetch_character
cmp #$20 // ignore all the spaces
beq !-
jsr fetch_variable_is_AZ
bcs_16 do_SYNTAX_error
sta VARNAM+0
// Fetch the (optional) second character
jsr fetch_character
jsr fetch_variable_is_09_AZ
bcs fetch_variable_check_type
sta VARNAM+1
// Fetch the remaining variable characters - ignore them
!:
jsr fetch_character
jsr fetch_variable_is_09_AZ
bcc !-
// FALLTROUGH
fetch_variable_check_type:
// Encode variable type within name, as documented in:
// - https://sites.google.com/site/h2obsession/CBM/basic/variable-format
cmp #$24 // '$'
beq fetch_variable_type_string
cmp #$25 // '%'
beq fetch_variable_type_integer
// FALLTORUGH
fetch_variable_type_float:
jsr unconsume_character
#if HAS_OPCODES_65C02
bra fetch_variable_find_addr
#else
jmp fetch_variable_find_addr
#endif
fetch_variable_type_integer:
lda VARNAM+0
ora #$80
sta VARNAM+0
// FALLTROUGH
fetch_variable_type_string:
lda VARNAM+1
ora #$80
sta VARNAM+1
// FALLTROUGH
fetch_variable_find_addr:
// Now try to find variable address
// XXX
rts
@@ -0,0 +1,35 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * BASIC_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// Check .A content, if within 0-9, A-Z ranges, sets Carry if check fails
//
fetch_variable_is_09_AZ:
cmp #$41 // fail if below '0'
bcc fetch_variable_cmp_fail
cmp #$3A // continue checking if above '9'
bcc fetch_variable_cmp_rts
// FALLTROUGH
fetch_variable_is_AZ:
cmp #$41 // fail if below 'A'
bcc fetch_variable_cmp_fail
cmp #$7B // fail if above 'Z'
// FALLTROUGH
fetch_variable_cmp_rts:
rts
fetch_variable_cmp_fail:
sec
rts
+27
View File
@@ -0,0 +1,27 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * BASIC_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// Consummes assign operator in a BASIC code, Carry set if not found. Injests all spaces.
//
injest_assign:
jsr fetch_character
cmp #$B2 // assign operator character
beq injest_assign_found
cmp #$20 // space, can always be skipped
beq injest_assign
// Not found
jsr unconsume_character
sec
rts
injest_assign_found:
clc
rts