Phase 2: variables, arrays, program execution, and control flow

Add variable storage (scalar and array), program line storage with
RUN/LIST/NEW, and full control flow: FOR/NEXT, GOTO, GOSUB/RETURN,
IF/THEN/ELSE, WHILE/WEND, ON GOTO/GOSUB, DATA/READ/RESTORE.

New modules: interp.c (1445 lines - execution loop and statement
dispatcher), vars.c, arrays.c, input.c. Version bumped to 0.2.0.
16 test programs pass including Leibniz pi and prime sieve.
This commit is contained in:
Eremey Valetov
2026-02-10 11:16:58 -05:00
parent d8e8375366
commit 616259537a
25 changed files with 2418 additions and 83 deletions
+15
View File
@@ -0,0 +1,15 @@
10 REM Array test
20 DIM A(10), B$(5)
30 FOR I = 0 TO 10
40 A(I) = I * I
50 NEXT I
60 FOR I = 0 TO 10
70 PRINT A(I);
80 NEXT I
90 PRINT
100 B$(0) = "Zero"
110 B$(1) = "One"
120 B$(2) = "Two"
130 FOR I = 0 TO 2
140 PRINT B$(I)
150 NEXT I
+12
View File
@@ -0,0 +1,12 @@
10 REM Control flow: GOTO, IF, FOR, GOSUB combined
20 GOTO 40
30 PRINT "SKIP THIS"
40 PRINT "Start"
50 FOR I = 1 TO 3
60 IF I = 2 THEN GOSUB 200
70 PRINT "I ="; I
80 NEXT I
90 PRINT "End"
100 END
200 PRINT " (subroutine called)";
210 RETURN
+9
View File
@@ -0,0 +1,9 @@
10 REM DATA/READ test
20 DATA 10, 20, 30, "hello", "world"
30 READ A, B, C
40 PRINT A; B; C
50 READ D$, E$
60 PRINT D$; " "; E$
70 RESTORE
80 READ X
90 PRINT "After RESTORE:"; X
+6
View File
@@ -0,0 +1,6 @@
10 REM DEF FN test
20 DEF FN SQ(X) = X * X
30 DEF FN CU(X) = X * X * X
40 PRINT "5 squared ="; FN SQ(5)
50 PRINT "3 cubed ="; FN CU(3)
60 PRINT "Sum ="; FN SQ(3) + FN CU(2)
+10
View File
@@ -0,0 +1,10 @@
10 REM FOR/NEXT test
20 FOR I = 1 TO 5
30 PRINT I;
40 NEXT I
50 PRINT
60 REM FOR with STEP
70 FOR I = 10 TO 0 STEP -2
80 PRINT I;
90 NEXT I
100 PRINT
+15
View File
@@ -0,0 +1,15 @@
10 REM GOSUB/RETURN test
20 PRINT "Main program"
30 GOSUB 100
40 PRINT "Back from first sub"
50 GOSUB 200
60 PRINT "Back from second sub"
70 END
100 REM First subroutine
110 PRINT "In first subroutine"
120 GOSUB 200
130 PRINT "Back in first sub"
140 RETURN
200 REM Second subroutine
210 PRINT "In second subroutine"
220 RETURN
+8
View File
@@ -0,0 +1,8 @@
10 REM IF/THEN/ELSE test
20 X = 5
30 IF X > 3 THEN PRINT "X > 3" ELSE PRINT "X <= 3"
40 IF X < 3 THEN PRINT "X < 3" ELSE PRINT "X >= 3"
50 REM IF with GOTO
60 IF X = 5 THEN GOTO 80
70 PRINT "Should not print"
80 PRINT "Jumped to 80"
+6
View File
@@ -0,0 +1,6 @@
10 REM Leibniz formula for pi
20 S = 0
30 FOR I = 0 TO 999
40 S = S + (-1)^I / (2*I+1)
50 NEXT I
60 PRINT "Pi approx:"; 4*S
+7
View File
@@ -0,0 +1,7 @@
10 REM Nested FOR loops - multiplication table
20 FOR I = 1 TO 5
30 FOR J = 1 TO 5
40 PRINT I*J;
50 NEXT J
60 PRINT
70 NEXT I
+11
View File
@@ -0,0 +1,11 @@
10 REM ON GOTO/GOSUB test
20 FOR I = 1 TO 3
30 ON I GOTO 100, 200, 300
40 NEXT I
50 END
100 PRINT "Branch 1"
110 GOTO 40
200 PRINT "Branch 2"
210 GOTO 40
300 PRINT "Branch 3"
310 GOTO 40
+18
View File
@@ -0,0 +1,18 @@
10 REM Sieve of Eratosthenes
20 N = 100
30 DIM P(100)
40 FOR I = 2 TO N
50 P(I) = 1
60 NEXT I
70 FOR I = 2 TO SQR(N)
80 IF P(I) = 0 THEN GOTO 120
90 FOR J = I*2 TO N STEP I
100 P(J) = 0
110 NEXT J
120 NEXT I
130 C = 0
140 FOR I = 2 TO N
150 IF P(I) = 1 THEN PRINT I; : C = C + 1
160 NEXT I
170 PRINT
180 PRINT C; "primes found"
+11
View File
@@ -0,0 +1,11 @@
10 REM Variable types test
20 A% = 42
30 B! = 3.14
40 C# = 2.718281828
50 D$ = "Hello"
60 PRINT A%; B!; C#
70 PRINT D$
80 REM DEFINT test
90 DEFINT X-Z
100 X = 7.9
110 PRINT X
+8
View File
@@ -0,0 +1,8 @@
10 REM WHILE/WEND test
20 X = 1
30 WHILE X <= 10
40 IF X MOD 2 = 0 THEN PRINT X;
50 X = X + 1
60 WEND
70 PRINT
80 PRINT "Done"