README ====== This directory contains a small program that will mount a ROMFS file system containing the BASIC test files extracted from the BAS 2.4 release. Background ========== Bas is an interpreter for the classic dialect of the programming language BASIC. It is pretty compatible to typical BASIC interpreters of the 1980s, unlike some other UNIX BASIC interpreters, that implement a different syntax, breaking compatibility to existing programs. Bas offers many ANSI BASIC statements for structured programming, such as procedures, local variables and various loop types. Further there are matrix operations, automatic LIST indentation and many statements and functions found in specific classic dialects. Line numbers are not required. The interpreter tokenises the source and resolves references to variables and jump targets before running the program. This compilation pass increases efficiency and catches syntax errors, type errors and references to variables that are never initialised. Bas is written in ANSI C for UNIX systems. License ======= BAS 2.4 is released as part of NuttX under the standard 3-clause BSD license use by all components of NuttX. This is not incompatible with the original BAS 2.4 licensing Copyright (c) 1999-2014 Michael Haardt Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. TEST OVERVIEW ============= test01.bas ========== Scalar variable assignment Test File --------- 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 Expected Result --------------- 1 hello 0.0002 0.000 0.0000020 0.0000002 Notes ----- Output would differ on other platforms NttX does not use scientific notation in floating point output. test02.bas ========== Array variable assignment Test File --------- 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 Expected Result --------------- 10 11 12 test03.bas ========== FOR loops Test File --------- 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 Expected Result --------------- 0 1 2 3 4 5 0 1 0 a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaa aaaaaaaaaa test04.bas ========== REPEAT UNTIL loop Test File --------- 10 a=1 20 repeat 30 print a 40 a=a+1 50 until a=10 Expected Result --------------- 1 2 3 4 5 6 7 8 9 test05.bas ========== GOSUB RETURN subroutines Test File --------- 10 gosub 100 20 gosub 100 30 end 100 gosub 200 110 gosub 200 120 return 200 print "hello, world":return Expected Result --------------- hello, world hello, world hello, world hello, world test06.bas ========== Recursive function without arguments Test File --------- 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 Expected Result --------------- 10 9 8 7 6 5 4 3 2 1 0 test07.bas ========== Recursive function with arguments Test File --------- 10 def fna(x) 20 if x=0 then r=1 else r=x*fna(x-1) 30 =r 40 print fna(7) Expected Result --------------- 5040 test08.bas ========== DATA, READ and RESTORE Test File --------- 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 Expected Result --------------- j=a j=c k=d Error: end of `data' in line 80 at: 80 read j$,k$ ^ test09.bas ========== LOCAL variables Test File --------- 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 Expected Result --------------- 3 5 3 test10.bas ========== PRINT USING Test File --------- 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" Expected Result --------------- 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 Test File --------- 10 open "i",1,"test.bas" 20 while not eof(1) 30 line input #1,a$ 40 print a$ 50 wend Expected Result --------------- 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 Test File --------- 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 Expected Result --------------- global handler 1 caught error in line 20 local handler caught error in line 60 global handler 2 caught error in line 90 test01.bas ========== Unnumbered lines Test File --------- print "a" goto 20 print "b" 20 print "c" Expected Result --------------- a c test14.bas ========== SELECT CASE Test File --------- 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 Expected Result --------------- 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 Test File --------- 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" Expected Result --------------- before field a$=a a$=hi ya after close a$= after get b$=hi ya test16.bas ========== SWAP Test File --------- 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) Expected Result --------------- 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 Test File --------- print "loop started" i=1 do print "i is";i i=i+1 if i>10 then exit do loop print "loop ended" Expected Result --------------- 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 Test File --------- 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" Expected Result --------------- 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 Test File --------- 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 Expected Result --------------- 1a 2a 3a 1b 2b 3b test20.bas ========== Caller trace Test File --------- 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 Expected Result --------------- 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 Test File --------- 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 Expected Result --------------- 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 Test File --------- 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 Expected Result --------------- 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 Test File --------- 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$ Expected Result --------------- 0 0 0 2.5 0 0 0 -0.5 hi hihi test24.bas ========== Matrix multiplication Test File --------- 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 Expected Result --------------- 1 2 3 3 2 1 1 2 2 1 3 3 14 13 10 11 test25.bas ========== Matrix scalar multiplication Test File --------- 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 Expected Result --------------- 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 Test File --------- dim a(3,3) data 5,5,5,8,8,8,3,3 mat read a(2,3) mat print a Expected Result --------------- 5 5 5 8 8 8 test27.bas ========== Matrix inversion Test File --------- 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 Expected Result --------------- 1 2 3 4 -2 1 1.5 -0.5 1 0 0 1 test28.bas ========== TDL BASIC FNRETURN/FNEND Test File --------- def fnfac(n) if n=1 then fnreturn 1 fnend n*fnfac(n-1) print fnfac(10) Expected Result --------------- 3628800 test29.bas ========== TDL INSTR Test File --------- 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?" Expected Result --------------- 4 = 4? 0 = 0? 3 = 3? 8 = 8? 0 = 0? 8 = 8? test30.bas ========== Type mismatch check Test File --------- print 1+"a" Expected Result --------------- Error: Invalid binary operand at: end of program test31.bas ========== PRINT default format Test File --------- 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 Expected Result --------------- 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 Notes ----- Output would differ on other platforms NttX does not use scientific notation in floating point output. test032.bas ========== SUB routines Test File --------- PUTS("abc") END SUB PUTS(s$) FOR i=1 to LEN(s$) : print mid$(s$,i,1); : NEXT PRINT END SUB Expected Result --------------- abc test33.bas ========== OPEN FOR BINARY Test File --------- 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" Expected Result --------------- xyz! 0.333333 9999 Notes ----- The logic in this test will fail if there is no writable file system mount at /tmp. test34.bas ========== OPTION BASE Test File --------- 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) Expected Result --------------- 1 2 1 2 10 20 test35.bas ========== Real to integer conversion Test File --------- a%=1.2 print a% a%=1.7 print a% a%=-0.2 print a% a%=-0.7 print a% Expected Result --------------- 1 2 0 -1 test36.bas ========== OPEN file locking Test File --------- 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" Expected Result --------------- opening file open succeeded opening file open failed Notes ----- 1. The logic in this test will fail opening the test.out file if there is no writable file system mount at /tmp. 2. 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 Test File --------- 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 Data file (/mnt/romfs/test37.dat) ------------------------------- abc Result ------ abc test38.bas ========== MAT REDIM Test File --------- 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 Expected Result --------------- 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 Test File --------- 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) Expected Result --------------- 6 test40.bas ========== IMAGE Test File --------- d=3.1 print using "#.#";d print using 10;d 10 image #.## Expected Result --------------- 3.1 3.10 test41.bas ========== EXIT FUNCTION Test File --------- function f(c) print "f running" if (c) then f=42 : exit function f=43 end function print f(0) print f(1) Expected Result --------------- f running 43 f running 42 test42.bas ========== Arithmetic Test File --------- 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) Expected Result --------------- 1 -2 -3 2 -2 2 -0.3 0.3 test43.bas ========== Matrix multiplication size checks Test File --------- 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 Expected Result --------------- 17 47 77 Error: Dimension mismatch in line 14 at: mat c=a*b ^ test44.bas ========== DELETE Test File --------- 10 print 10 20 print 20 30 print 30 40 print 40 50 print 50 60 print 60 70 print 70 Usage ----- load "test.bas" delete -20 delete 60- delete 30-40 delete 15 list Expected Result --------------- Error: No such line at: 15 50 print 50 test45.bas ========== MID$ on left side Test File --------- 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$ Expected Result --------------- 01234ABCD9 01234ABCD9 test46.bas ========== END used without program Test File --------- for i=1 to 10:print i;:next i:end Expected Result --------------- 1 2 3 4 5 6 7 8 9 10 test47.bas ========== MAT WRITE Test File --------- 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 Expected Result --------------- 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 Test File --------- 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$ Expected Result --------------- 10 10 2 0 2 test test test49.bas ========== Matrix determinant Test File --------- 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 Expected Result --------------- 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 Notes ----- 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 Test File --------- 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) Expected Result --------------- 1 1 -0.3 -0.3 2 2 0.3 4 test51.bas ========== Print items Test File --------- PRINT "Line 1";TAB(78);1.23456789 Expected Result --------------- Line 1 1.234568 test52.bas ========== MAT INPUT Test File --------- dim a(2,2) mat input a mat print a mat input a mat print a Test File --------- 1,2,3,4,5 1 3,4 Expected Result --------------- ? 1 2 3 4 ? ? 1 0 3 4