diff --git a/README.md b/README.md index 9008911..a43108e 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,10 @@ Here are all currently known implementations of LTTB: * [Jim Tcl port](./lttb.tcl) (284 SLOC) +## Test suite + +LTTB also ships a [test suite](test.bas) source code file to verify implementation correctness. Every non-empty line between the start and the end should end with `OK`. + ## FAQ Please read the [manual](lttb-manual.md) first, your question is most likely covered there. If not, here are some more questions and answers. diff --git a/lttb-impl-notes.md b/lttb-impl-notes.md index 8fdf447..b0c5b49 100644 --- a/lttb-impl-notes.md +++ b/lttb-impl-notes.md @@ -218,7 +218,7 @@ Value and string printing routine. Accepts `STMT` string as a parameter. Run the program currently loaded into the working memory. 1. Set `IP = 1`. -2. If `PROGMEM[IP]` exists and is not empty, execute `PROGEXEC(PROGMEM[IP])`. +2. If `PROGMEM[IP]` exists, is not empty and does not start with the string `REM`, execute `PROGEXEC(PROGMEM[IP])`. 3. Increment `IP` by 1. 4. If `IP > 0` and `IP < 32768`, go to step 2. @@ -279,3 +279,5 @@ Program saving routine into external storage media. The provided algorithm works ## Closing notes The set of algorithms in this document should be enough to create a complete and functional LTTB interpreter in any modern programming language. If you have any corrections or optimizations regarding the algorithms, feel free to create an issue in this repository. + +In order to verify implementation correctness, you can use the code inside [test.bas](test.bas) shipped in this repository. diff --git a/lttb.tcl b/lttb.tcl index 35ef317..7b9e045 100755 --- a/lttb.tcl +++ b/lttb.tcl @@ -256,7 +256,7 @@ proc int_RUN {} { global progmem ip set ip 1 while {$ip > 0 && $ip < 32768} { - if {[dict exists $progmem $ip]} {lttb_exec $progmem($ip)} + if {[dict exists $progmem $ip] && [string first REM $progmem($ip)] != 0} {lttb_exec $progmem($ip)} incr ip } } diff --git a/test.bas b/test.bas new file mode 100644 index 0000000..ea7235a --- /dev/null +++ b/test.bas @@ -0,0 +1,65 @@ +5 rem This is a comment and should never be executed +10 print "Luxferre's Truly Tiny BASIC test suite" +15 print "" +20 print "All lines should end with OK to pass" +30 print "Let's go..." +35 print "" +40 print "Nested IF and A-I zero init: "; +50 if a=0 if b=0 if c=0 if d=0 if e=0 if g=0 if h=0 if i=0 print "OK" +55 print "" +60 print "Nested IF and J-Q zero init: "; +70 if j=0 if k=0 if l=0 if m=0 if n=0 if o=0 if p=0 if q=0 print "OK" +75 print "" +80 print "Nested IF and R-Y zero init: "; +90 if r=0 if s=0 if t=0 if u=0 if v=0 if w=0 if x=0 if y=0 print "OK" +95 print "" +100 print "Z zero init: "; +110 if z=0 print "OK" +120 print "" +130 print "Precedence: "; +140 if 2 + 2 * 2 - 3 / 3 = 5 print "OK" +150 print "" +160 print "Left assoc and full THEN form: "; +170 if 63 / 8 * 8 = 56 then print "OK" +180 print "" +190 print "Parentheses: "; +200 if 5 * (2+3) * (4 + 1) = 125 print "OK" +210 print "" +220 print "Int pos wrap: "; +230 if 32767 + 1 = -32768 print "OK" +240 print "" +250 print "Int neg wrap: "; +260 if -32768 - 1 = 32767 print "OK" +270 print "" +280 print "int mod wrap: "; +290 if 32767 + 65535 = 32766 print "OK" +300 print "" +310 print "This should display 108 after a space: ";12*9;" -> OK" +315 print "" +320 print "This should display 56 after a tab: ", 63/8*8 ; " -> OK" +325 print "" +330 print "GOTO: "; +340 goto 3 * 300 +350 print "" +360 print "GOSUB: "; +370 GOSUB 2 + 918 +380 print "OK" +390 print "" +400 print "RND: "; +410 x = rnd(100) + rnd(100) + rnd(100) + rnd(100) + rnd(100) + rnd(100) +420 if x < 600 if rnd(100) <> x/6 print "OK" +430 print "" +440 print "Indirect line rewriting in if/then form: "; +450 if x > -1 then 950 print "OK" +460 gosub 950 +470 print "" +480 print "Test end, thank you!" +490 end +890 print "This line should never be printed" +900 print "OK" +910 goto 350 +920 print "OK" +930 print "RETURN: "; +940 return +950 print "NOT OK" +960 return