test01.bas
Scalar variable assignment
10 a=1 20 print a 30 a$="hello" 40 print a$ 50 a=0.0002 60 print a 70 a=2.e-6 80 print a 90 a=.2e-6 100 print a
1 hello 0.0002 0.000 0.0000020 0.0000002
Output would differ on other platforms NttX does not use scientific notation in floating point output.
test02.bas
Array variable assignment
10 dim a(1) 20 a(0)=10 30 a(1)=11 40 a=12 50 print a(0) 60 print a(1) 70 print a
10 11 12
test03.bas
FOR
loops
10 for i=0 to 10 20 print i 30 if i=5 then exit for 40 next 50 for i=0 to 0 60 print i 70 next I 80 for i=1 to 0 step -1 90 print i 100 next 110 for i=1 to 0 120 print i 130 next 140 for i$="" to "aaaaaaaaaa" step "a" 150 print i$ 160 next
0 1 2 3 4 5 0 1 0 a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaa aaaaaaaaaa
test04.bas
REPEAT
UNTIL
loop
10 a=1 20 repeat 30 print a 40 a=a+1 50 until a=10
1 2 3 4 5 6 7 8 9
test05.bas
GOSUB
RETURN
subroutines
10 gosub 100 20 gosub 100 30 end 100 gosub 200 110 gosub 200 120 return 200 print "hello, world":return
hello, world hello, world hello, world hello, world
test06.bas
Recursive function without arguments
10 def fnloop 20 if n=0.0 then 30 r=0.0 40 else 50 print n 60 n=n-1.0 70 r=fnloop() 80 end if 90 =r 100 n=10 110 print fnloop
10 9 8 7 6 5 4 3 2 1 0
test07.bas
Recursive function with arguments
10 def fna(x) 20 if x=0 then r=1 else r=x*fna(x-1) 30 =r 40 print fna(7)
5040
test08.bas
DATA
, READ
and RESTORE
10 data "a",b 20 data "c","d 40 read j$ 50 print "j=";j$ 60 restore 20 70 for i=1 to 3 80 read j$,k$ 90 print "j=";j$;" k=";k$ 100 next
j=a j=c k=d Error: end of `data' in line 80 at: 80 read j$,k$ ^
test09.bas
LOCAL
variables
10 def fna(a) 20 local b 30 b=a+1 40 =b 60 b=3 70 print b 80 print fna(4) 90 print b
3 5 3
test10.bas
PRINT USING
10 print using "!";"abcdef" 20 print using "\ \";"abcdef" 30 print using "###-";-1 40 print using "###-";0 50 print using "###-";1 60 print using "###+";-1 70 print using "###+";0 80 print using "###+";1 90 print using "#####,";1000 100 print using "**#,##.##";1000.00 110 print using "+##.##";1 120 print using "+##.##";1.23400 130 print using "+##.##";123.456 140 print using "+##.";123.456 150 print using "+##";123.456 160 print using "abc def ###.## efg";1.3 170 print using "###.##^^^^^";5 180 print using "###.##^^^^";1000 190 print using ".##^^^^";5.0 200 print using "##^^^^";2.3e-9 210 print using ".##^^^^";2.3e-9 220 print using "#.#^^^^";2.3e-9 230 print using ".####^^^^^";-011466 240 print using "$*,***,***,***.**";3729825.24 250 print using "$**********.**";3729825.24 260 print using "$$###.##";456.78 270 print using "a!b";"S" 280 print using "a!b";"S","T" 290 print using "a!b!c";"S" 300 print using "a!b!c";"S","T"
a abc 1- 0 1 1- 0+ 1+ 1,000 *1,000.00 +1.00 +1.23 +123.46 +123. +123 abc def 1.30 efg 500.00E-002 100.00E+01 .50E+01 23E-10 .23E-08 2.3E-09 -.1147E+005 $***3,729,825.24 $**3729825.24 $456.78 aSb aSbaTb aSb aSbTc
test11.bas
OPEN
and LINE INPUT
10 open "i",1,"test.bas" 20 while not eof(1) 30 line input #1,a$ 40 print a$ 50 wend
10 open "i",1,"test.bas" 20 while not eof(1) 30 line input #1,a$ 40 print a$ 50 wend
test12.bas
Exception handling
10 on error print "global handler 1 caught error in line ";erl : resume 30 20 print mid$("",-1) 30 on error print "global handler 2 caught error in line ";erl : end 40 def procx 50 on error print "local handler caught error in line";erl : goto 70 60 print 1/0 70 end proc 80 procx 90 print 1 mod 0
global handler 1 caught error in line 20 local handler caught error in line 60 global handler 2 caught error in line 90
test13.bas
Unnumbered lines
print "a" goto 20 print "b" 20 print "c"
a c
test14.bas
SELECT CASE
10 for i=0 to 9 20 for j=0 to 9 30 print i,j 40 select case i 50 case 0 60 print "i after case 0" 70 case 1 80 print "i after case 1" 90 select case j 100 case 0 110 print "j after case 0" 120 end select 130 case 3 to 5,7 140 print "i after case 3 to 5, 7" 150 case is <9 160 print "is after case is <9" 170 case else 180 print "i after case else" 190 end select 200 next 210 next
0 0 i after case 0 0 1 i after case 0 0 2 i after case 0 0 3 i after case 0 0 4 i after case 0 0 5 i after case 0 0 6 i after case 0 0 7 i after case 0 0 8 i after case 0 0 9 i after case 0 1 0 i after case 1 j after case 0 1 1 i after case 1 1 2 i after case 1 1 3 i after case 1 1 4 i after case 1 1 5 i after case 1 1 6 i after case 1 1 7 i after case 1 1 8 i after case 1 1 9 i after case 1 2 0 is after case is <9 2 1 is after case is <9 2 2 is after case is <9 2 3 is after case is <9 2 4 is after case is <9 2 5 is after case is <9 2 6 is after case is <9 2 7 is after case is <9 2 8 is after case is <9 2 9 is after case is <9 3 0 i after case 3 to 5, 7 3 1 i after case 3 to 5, 7 3 2 i after case 3 to 5, 7 3 3 i after case 3 to 5, 7 3 4 i after case 3 to 5, 7 3 5 i after case 3 to 5, 7 3 6 i after case 3 to 5, 7 3 7 i after case 3 to 5, 7 3 8 i after case 3 to 5, 7 3 9 i after case 3 to 5, 7 4 0 i after case 3 to 5, 7 4 1 i after case 3 to 5, 7 4 2 i after case 3 to 5, 7 4 3 i after case 3 to 5, 7 4 4 i after case 3 to 5, 7 4 5 i after case 3 to 5, 7 4 6 i after case 3 to 5, 7 4 7 i after case 3 to 5, 7 4 8 i after case 3 to 5, 7 4 9 i after case 3 to 5, 7 5 0 i after case 3 to 5, 7 5 1 i after case 3 to 5, 7 5 2 i after case 3 to 5, 7 5 3 i after case 3 to 5, 7 5 4 i after case 3 to 5, 7 5 5 i after case 3 to 5, 7 5 6 i after case 3 to 5, 7 5 7 i after case 3 to 5, 7 5 8 i after case 3 to 5, 7 5 9 i after case 3 to 5, 7 6 0 is after case is <9 6 1 is after case is <9 6 2 is after case is <9 6 3 is after case is <9 6 4 is after case is <9 6 5 is after case is <9 6 6 is after case is <9 6 7 is after case is <9 6 8 is after case is <9 6 9 is after case is <9 7 0 i after case 3 to 5, 7 7 1 i after case 3 to 5, 7 7 2 i after case 3 to 5, 7 7 3 i after case 3 to 5, 7 7 4 i after case 3 to 5, 7 7 5 i after case 3 to 5, 7 7 6 i after case 3 to 5, 7 7 7 i after case 3 to 5, 7 7 8 i after case 3 to 5, 7 7 9 i after case 3 to 5, 7 8 0 is after case is <9 8 1 is after case is <9 8 2 is after case is <9 8 3 is after case is <9 8 4 is after case is <9 8 5 is after case is <9 8 6 is after case is <9 8 7 is after case is <9 8 8 is after case is <9 8 9 is after case is <9 9 0 i after case else 9 1 i after case else 9 2 i after case else 9 3 i after case else 9 4 i after case else 9 5 i after case else 9 6 i after case else 9 7 i after case else 9 8 i after case else 9 9 i after case else
test15.bas
FIELD
, PUT
and GET
a$="a" open "r",1,"test.dat",128 print "before field a$=";a$ field #1,10 as a$ field #1,5 as b$,5 as c$ lset b$="hi" rset c$="ya" print "a$=";a$ put #1 close #1 print "after close a$=";a$ open "r",2,"test.dat",128 field #2,10 as b$ get #2 print "after get b$=";b$ close #2 kill "test.dat"
before field a$=a a$=hi ya after close a$= after get b$=hi ya
test16.bas
SWAP
a=1 : b=2 print "a=";a;"b=";b swap a,b print "a=";a;"b=";b dim a$(1,1),b$(1,1) a$(1,0)="a" : b$(0,1)="b" print "a$(1,0)=";a$(1,0);"b$(0,1)=";b$(0,1) swap a$(1,0),b$(0,1) print "a$(1,0)=";a$(1,0);"b$(0,1)=";b$(0,1)
a= 1 b= 2 a= 2 b= 1 a$(1,0)=ab$(0,1)=b a$(1,0)=bb$(0,1)=a
test17.bas
DO
, EXIT DO
, LOOP
print "loop started" i=1 do print "i is";i i=i+1 if i>10 then exit do loop print "loop ended"
loop started i is 1 i is 2 i is 3 i is 4 i is 5 i is 6 i is 7 i is 8 i is 9 i is 10 loop ended
test18.bas
DO WHILE
, LOOP
print "loop started" x$="" do while len(x$)<3 print "x$ is ";x$ x$=x$+"a" y$="" do while len(y$)<2 print "y$ is ";y$ y$=y$+"b" loop loop print "loop ended"
loop started x$ is y$ is y$ is b x$ is a y$ is y$ is b x$ is aa y$ is y$ is b loop ended
test19.bas
ELSEIF
for x=1 to 3 if x=1 then print "1a" else if x=2 then print "2a" else print "3a" end if end if next for x=1 to 3 if x=1 then print "1b" elseif x=2 then print "2b" elseif x=3 then print "3b" next
1a 2a 3a 1b 2b 3b
test20.bas
Caller trace
10 gosub 20 20 gosub 30 30 procb 40 def proca 50 print "hi" 60 stop 70 end proc 80 def procb 90 proca 100 end proc
hi Break in line 60 at: 60 stop ^ Proc Called in line 90 at: 90 proca ^ Proc Called in line 30 at: 30 procb ^ Called in line 20 at: 20 gosub 30 ^ Called in line 10 at: 10 gosub 20 ^
test21.bas
Matrix assignment
dim a(3,4) for i=0 to 3 for j=0 to 4 a(i,j)=i*10+j print a(i,j); next print next mat b=a for i=0 to 3 for j=0 to 4 print b(i,j); next print next
0 1 2 3 4 10 11 12 13 14 20 21 22 23 24 30 31 32 33 34 0 0 0 0 0 0 11 12 13 14 0 21 22 23 24 0 31 32 33 34
test22.bas
MAT PRINT
dim a(2,2) for i=0 to 2 for j=0 to 2 a(i,j)=i*10+j next next for j=1 to 2 for i=1 to 2 print using " ##.##";a(i,j), next print next mat print using " ##.##";a,a
11.00 21.00 12.00 22.00 11.00 12.00 21.00 22.00 11.00 12.00 21.00 22.00
test23.bas
Matrix addition and subtraction
dim a(2,2) a(2,2)=2.5 dim b%(2,2) b%(2,2)=3 mat print a mat a=a-b% mat print a dim c$(2,2) c$(2,1)="hi" mat print c$ mat c$=c$+c$ mat print c$
0 0 0 2.5 0 0 0 -0.5 hi hihi
test24.bas
Matrix multiplication
10 dim b(2,3),c(3,2) 20 for i=1 to 2 : for j=1 to 3 : read b(i,j) : next : next 30 for i=1 to 3 : for j=1 to 2 : read c(i,j) : next : next 40 mat a=b*c 50 mat print b,c,a 60 data 1,2,3,3,2,1 70 data 1,2,2,1,3,3
1 2 3 3 2 1 1 2 2 1 3 3 14 13 10 11
test25.bas
Matrix scalar multiplication
10 dim a(3,3) 20 for i=1 to 3 : for j=1 to 3 : read a(i,j) : next : next 30 mat print a 40 mat a=(3)*a 45 print 50 mat print a 60 data 1,2,3,4,5,6,7,8,9 80 dim inch_array(5,1),cm_array(5,1) 90 mat read inch_array 100 data 1,12,36,100,39.37 110 mat print inch_array 120 mat cm_array=(2.54)*inch_array 130 mat print cm_array
1 2 3 4 5 6 7 8 9 3 6 9 12 15 18 21 24 27 1 12 36 100 39.37 2.54 30.48 91.44 254 99.9998
test26.bas
MAT READ
dim a(3,3) data 5,5,5,8,8,8,3,3 mat read a(2,3) mat print a
5 5 5 8 8 8
test27.bas
Matrix inversion
data 1,2,3,4 mat read a(2,2) mat print a mat b=inv(a) mat print b mat c=a*b mat print c
1 2 3 4 -2 1 1.5 -0.5 1 0 0 1
test28.bas
TDL BASIC FNRETURN
/FNEND
def fnfac(n) if n=1 then fnreturn 1 fnend n*fnfac(n-1) print fnfac(10)
3628800
test29.bas
TDL INSTR
print instr("123456789","456");" = 4?" print INSTR("123456789","654");" = 0?" print INSTR("1234512345","34");" = 3?" print INSTR("1234512345","34",6);" = 8?" print INSTR("1234512345","34",6,2);" = 0?" print INSTR("1234512345","34",6,4);" = 8?"
4 = 4? 0 = 0? 3 = 3? 8 = 8? 0 = 0? 8 = 8?
test30.bas
Type mismatch check
print 1+"a"
Error: Invalid binary operand at: end of program
test31.bas
PRINT default format
10 for i=-8 to 8 20 x=1+1/3 : y=1 : j=i 30 for j=i to -1 : x=x/10 : y=y/10 : next 40 for j=i to 1 step -1 : x=x*10 : y=y*10 : next 50 print x,y 60 next
0.0000000 0.0000000 0.0000001 0.0000001 0.0000013 0.0000010 0.0000133 0.0000100 0.000133 0.0001 0.001333 0.001 0.013333 0.01 0.133333 0.1 1.333333 1 13.33333 10 133.3333 100 1333.333 1000 13333.33 10000 133333.3 100000 1333333 1000000 13333333.3333333 10000000.0000000 133333333.3333333 100000000.0000000
Output would differ on other platforms NttX does not use scientific notation in floating point output.
test32.bas
SUB
routines
PUTS("abc") END SUB PUTS(s$) FOR i=1 to LEN(s$) : print mid$(s$,i,1); : NEXT PRINT END SUB
abc
test33.bas
OPEN FOR BINARY
open "/tmp/test.out" for binary as 1 put 1,1,"xy" put 1,3,"z!" put 1,10,1/3 put 1,20,9999 close 1 open "/tmp/test.out" for binary as 1 s$=" " get 1,1,s$ get 1,10,x get 1,20,n% close print s$ print x print n% kill "/tmp/test.out"
xyz! 0.333333 9999
The logic in this test will fail if there is no writable file system mount at /tmp
.
test34.bas
OPTION BASE
option base 3 dim a(3,5) a(3,3)=1 a(3,5)=2 print a(3,3) print a(3,5) option base -2 dim b(-1,2) b(-2,-2)=10 b(-1,2)=20 print a(3,3) print a(3,5) print b(-2,-2) print b(-1,2)
1 2 1 2 10 20
test35.bas
Real to integer conversion
a%=1.2 print a% a%=1.7 print a% a%=-0.2 print a% a%=-0.7 print a%
1 2 0 -1
test36.bas
OPEN
file locking
on error goto 10 print "opening file" open "/tmp/test.out" for output lock write as #1 print "open succeeded" if command$<>"enough" then shell "sh ./test/runbas test.bas enough" end 10 print "open failed"
opening file open succeeded opening file open failed
The logic in this test will fail opening the test.out file if there is no writable file system mount at /tmp
.
This test will still currently fail when try to fork the shell because support for that feature is not implemented. The following error message should be received:
Error: Forking child process failed (Unknown error) in line 5 at: if command$<>"enough" then shell "sh ./test/runbas test.bas enough" ^
test37.bas
LINE INPUT
reaching EOF
10 open "i",1,"/mnt/romfs/test37.dat" 20 while not eof(1) 30 line input #1,a$ 40 if a$="abc" then print a$; else print "def" 50 wend
/mnt/romfs/test37.dat
)abc
abc
test38.bas
MAT REDIM
dim x(10) mat read x mat print x mat redim x(7) mat print x mat redim x(12) mat print x data 1,2,3,4,5,6,7,8,9,10
1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 1 2 3 4 5 6 7 0 0 0 0 0
test39.bas
Nested function and procedure calls
def proc_a(x) print fn_b(1,x) end proc def fn_b(a,b) = a+fn_c(b) def fn_c(b) = b+3 proc_a(2)
6
test40.bas
IMAGE
d=3.1 print using "#.#";d print using 10;d 10 image #.##
3.1 3.10
test41.bas
EXIT FUNCTION
function f(c) print "f running" if (c) then f=42 : exit function f=43 end function print f(0) print f(1)
f running 43 f running 42
test42.bas
Arithmetic
10 print 4.7\3 20 print -2.3\1 30 print int(-2.3) 40 print int(2.3) 50 print fix(-2.3) 60 print fix(2.3) 70 print fp(-2.3) 80 print fp(2.3)
1 -2 -3 2 -2 2 -0.3 0.3
test43.bas
Matrix multiplication size checks
DIM a(3,3),b(3,1),c(3,3) MAT READ a MAT READ b MAT c=a*b MAT PRINT c DATA 1,2,3,4,5,6,7,8,9 DATA 5,3,2 erase b DIM b(3) RESTORE MAT READ a MAT READ b MAT c=a*b MAT PRINT c
17 47 77 Error: Dimension mismatch in line 14 at: mat c=a*b ^
test44.bas
DELETE
10 print 10 20 print 20 30 print 30 40 print 40 50 print 50 60 print 60 70 print 70
load "test.bas" delete -20 delete 60- delete 30-40 delete 15 list
Error: No such line at: 15 50 print 50
test45.bas
MID$
on left side
10 mid$(a$,6,4) = "ABCD" 20 print a$ 30 a$="0123456789" 40 mid$(a$,6,4) = "ABCD" 50 print a$ 60 a$="0123456789" 70 let mid$(a$,6,4) = "ABCD" 80 print a$
01234ABCD9 01234ABCD9
test46.bas
END
used without program
for i=1 to 10:print i;:next i:end
1 2 3 4 5 6 7 8 9 10
test47.bas
MAT WRITE
dim a(3,4) for i=0 to 3 for j=0 to 4 a(i,j)=i*10+j print a(i,j); next print next mat write a
0 1 2 3 4 10 11 12 13 14 20 21 22 23 24 30 31 32 33 34 11,12,13,14 21,22,23,24 31,32,33,34
test48.bas
Multi assignment
a,b = 10 print a,b dim c(10) a,c(a) = 2 print a,c(2),c(10) a$,b$="test" print a$,b$
10 10 2 0 2 test test
test49.bas
Matrix determinant
width 120 dim a(7,7),b(7,7) mat read a mat print a; print data 58,71,67,36,35,19,60 data 50,71,71,56,45,20,52 data 64,40,84,50,51,43,69 data 31,28,41,54,31,18,33 data 45,23,46,38,50,43,50 data 41,10,28,17,33,41,46 data 66,72,71,38,40,27,69 mat b=inv(a) mat print b print det
58 71 67 36 35 19 60 50 71 71 56 45 20 52 64 40 84 50 51 43 69 31 28 41 54 31 18 33 45 23 46 38 50 43 50 41 10 28 17 33 41 46 66 72 71 38 40 27 69 9.636025e+07 320206 -537449 2323650 -1.135486e+07 3.019632e+07 -9.650941e+07 4480 15 -25 108 -528 1404 -4487 -39436 -131 220 -951 4647 -12358 39497 273240 908 -1524 6589 -32198 85625 -273663 -1846174 -6135 10297 -44519 217549 -578534 1849032 1.315035e+07 43699 -73346 317110 -1549606 4120912 -1.31707e+07 -9.636079e+07 -320208 537452 -2323663 1.135493e+07 -3.019649e+07 9.650995e+07 1
Output will differ because NuttX does not use scientific notation in output. Some minor rounding differences may also be expected.
test50.bas
min
and max
function
print min(1,2) print min(2,1) print min(-0.3,0.3) print min(-0.3,4) print max(1,2) print max(2,1) print max(-0.3,0.3) print max(-0.3,4)
1 1 -0.3 -0.3 2 2 0.3 4
test51.bas
Print items
PRINT "Line 1";TAB(78);1.23456789
Line 1 1.234568
test52.bas
MAT INPUT
dim a(2,2) mat input a mat print a mat input a mat print a
1,2,3,4,5 1 3,4
? 1 2 3 4 ? ? 1 0 3 4