diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBASIC.java b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBASIC.java index 308d836..eb8dd1d 100644 --- a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBASIC.java +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBASIC.java @@ -5,8 +5,7 @@ import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration; import com.badlogic.gdx.graphics.glutils.ShaderProgram; import net.torvald.tsvm.peripheral.*; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.util.HashMap; public class TerranBASIC { @@ -17,22 +16,77 @@ public class TerranBASIC { public static int WIDTH = 640; public static int HEIGHT = 480; + public static String OSName = System.getProperty("os.name"); + public static String OSVersion = System.getProperty("os.version"); - public static String diskDir = "My_BASIC_Programs"; + public static String operationSystem; + /** %appdata%/TerranBASIC, without trailing slash */ + public static String defaultDir; + /** For Demo version only. defaultDir + "/Saves", without trailing slash */ + public static String diskDir; - private static void createDirs() { - File[] dirs = { - new File(diskDir) - }; - - for (File it : dirs) { - if (!it.exists()) - it.mkdirs(); + private static void getDefaultDirectory() { + String OS = OSName.toUpperCase(); + if (OS.contains("WIN")) { + operationSystem = "WINDOWS"; + defaultDir = System.getenv("APPDATA") + "/TerranBASIC"; } + else if (OS.contains("OS X") || OS.contains("MACOS")) { // OpenJDK for mac will still report "Mac OS X" with version number "10.16", even on Big Sur and beyond + operationSystem = "OSX"; + defaultDir = System.getProperty("user.home") + "/Library/Application Support/TerranBASIC"; + } + else if (OS.contains("NUX") || OS.contains("NIX") || OS.contains("BSD")) { + operationSystem = "LINUX"; + defaultDir = System.getProperty("user.home") + "/.TerranBASIC"; + } + else if (OS.contains("SUNOS")) { + operationSystem = "SOLARIS"; + defaultDir = System.getProperty("user.home") + "/.TerranBASIC"; + } + else { + operationSystem = "UNKNOWN"; + defaultDir = System.getProperty("user.home") + "/.TerranBASIC"; + } + + diskDir = defaultDir + "/My_Programs"; + + System.out.println(String.format("os.name = %s (with identifier %s)", OSName, operationSystem)); + System.out.println(String.format("os.version = %s", OSVersion)); + System.out.println(String.format("default directory: %s", defaultDir)); + System.out.println(String.format("java version = %s", System.getProperty("java.version"))); + } + + + private static void installSamplePrograms() { + System.out.println("Installing sample programs..."); + + String[] samplePrograms = {"99.bas","amazing.bas","array.bas","array0.bas","brb.bas","closure.bas","currying.bas","downkeys.bas","facclosure.bas","facmap.bas","factorial.bas","fib2.bas","fib3.bas","fibonacci.bas","funs.bas","hamurabi.bas","hangman.bas","highorder.bas","monadlaws.bas","monadlaws2.bas","myfirst.bas","plotter.bas","qsort.bas","recursion.bas","rmaze.bas","sqrt.bas","triangle1.bas","triangle2.bas","writermonad.bas","yourname.bas"}; + + for (String s : samplePrograms) { + try { + byte[] prg = TerranBASIC.class.getClassLoader().getResourceAsStream("net/torvald/tsvm/TerranBasicSamplePrograms/"+s).readAllBytes(); + OutputStream prgOs = new BufferedOutputStream(new FileOutputStream(new File(diskDir, s))); + prgOs.write(prg); + prgOs.flush();prgOs.close(); + System.out.println(s); + } + catch (IOException e) { + System.out.println(("Failed to install " + s)); + e.printStackTrace(); + } + } + } public static void main(String[] args) { - createDirs(); + getDefaultDirectory(); + + File myProgramsDir = new File(diskDir); + if (!myProgramsDir.exists()) { + if (myProgramsDir.mkdirs()) + installSamplePrograms(); + } + ShaderProgram.pedantic = false; diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/99.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/99.bas new file mode 100644 index 0000000..3705d0a --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/99.bas @@ -0,0 +1,13 @@ +10 FOR I = 99 TO 1 STEP -1 +20 MODE = 1 +30 GOSUB 120 +40 PRINT I;" bottle";BOTTLES;" of beer on the wall, ";i;" bottle";BOTTLES;" of beer." +50 MODE = 2 +60 GOSUB 120 +70 PRINT "Take one down and pass it around, ";(I-1);" bottle";BOTTLES;" of beer on the wall." +80 NEXT +90 PRINT "No more bottles of beer on the wall, no more bottles of beer." +100 PRINT "Go to the store and buy some more. 99 bottles of beer on the wall." +110 END +120 IF I == MODE THEN BOTTLES = "" ELSE BOTTLES = "s" +130 RETURN diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/amazing.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/amazing.bas new file mode 100644 index 0000000..9d084f9 --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/amazing.bas @@ -0,0 +1,138 @@ +1 OPTIONBASE 1 +10 PRINT SPC(28);"AMAZING PROGRAM" +20 PRINT SPC(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" +30 PRINT:PRINT:PRINT +100 PRINT "WHAT ARE YOUR WIDTH";:INPUT H +102 PRINT "WHAT ARE YOUR LENGTH";:INPUT V +105 IF H<>1 AND V<>1 THEN GOTO 110 +106 PRINT "MEANINGLESS DIMENSIONS. TRY AGAIN.":GOTO 100 +110 WS=DIM(H,V):VS=DIM(H,V) +120 PRINT:PRINT:PRINT:PRINT +160 Q=0:Z=0:X=INT(RND(1)*H+1) +165 FOR I=1 TO H +170 IF I==X THEN GOTO 173 +171 PRINT ".--"; +172 GOTO 175 +173 PRINT ". "; +180 NEXT +190 PRINT "." +195 C=1:WS(X,1)=C:C=C+1 +200 R=X:S=1:GOTO 260 +210 IF R<>H THEN GOTO 240 +215 IF S<>V THEN GOTO 230 +220 R=1:S=1 +222 GOTO 250 +230 R=1:S=S+1:GOTO 250 +240 R=R+1 +250 IF WS(R,S)==0 THEN GOTO 210 +260 IF R-1==0 THEN GOTO 530 +265 IF WS(R-1,S)<>0 THEN GOTO 530 +270 IF S-1==0 THEN GOTO 390 +280 IF WS(R,S-1)<>0 THEN GOTO 390 +290 IF R==H THEN GOTO 330 +300 IF WS(R+1,S)<>0 THEN GOTO 330 +310 X=INT(RND(1)*3+1) +320 ON X GOTO 790,820,860 +334 IF Z==1 THEN GOTO 370 +338 Q=1:GOTO 350 +340 IF WS(R,S+1)<>0 THEN GOTO 370 +350 X=INT(RND(1)*3+1) +360 ON X GOTO 790,820,910 +370 X=INT(RND(1)*2+1) +380 ON X GOTO 790,820 +390 IF R==H THEN GOTO 470 +400 IF WS(R+1,S)<>0 THEN GOTO 470 +405 IF S<>V THEN GOTO 420 +410 IF Z==1 THEN GOTO 450 +415 Q=1:GOTO 430 +420 IF WS(R,S+1)<>0 THEN GOTO 450 +430 X=INT(RND(1)*3+1) +440 ON X GOTO 790,860,910 +450 X=INT(RND(1)*2+1) +460 ON X GOTO 790,860 +470 IF S<>V THEN GOTO 490 +480 IF Z==1 THEN GOTO 520 +485 Q=1:GOTO 500 +490 IF WS(R,S+1)<>0 THEN GOTO 520 +500 X=INT(RND(1)*2+1) +510 ON X GOTO 790,910 +520 GOTO 790 +530 IF S-1==0 THEN GOTO 670 +540 IF WS(R,S-1)<>0 THEN GOTO 670 +545 IF R==H THEN GOTO 610 +547 IF WS(R+1,S)<>0 THEN GOTO 610 +550 IF S<>V THEN GOTO 560 +552 IF Z==1 THEN GOTO 590 +554 Q=1:GOTO 570 +560 IF WS(R,S+1)<>0 THEN GOTO 590 +570 X=INT(RND(1)*3+1) +580 ON X GOTO 820,860,910 +590 X=INT(RND(1)*2+1) +600 ON X GOTO 820,860 +610 IF S<>V THEN GOTO 630 +620 IF Z==1 THEN GOTO 660 +625 Q=1:GOTO 640 +630 IF WS(R,S+1)<>0 THEN GOTO 660 +640 X=INT(RND(1)*2+1) +650 ON X GOTO 820,910 +660 GOTO 820 +670 IF R==H THEN GOTO 740 +680 IF WS(R+1,S)<>0 THEN GOTO 740 +685 IF S<>V THEN GOTO 700 +690 IF Z==1 THEN GOTO 730 +695 Q=1:GOTO 830 +700 IF WS(R,S+1)<>0 THEN GOTO 730 +710 X=INT(RND(1)*2+1) +720 ON X GOTO 860,910 +730 GOTO 860 +740 IF S<>V THEN GOTO 760 +750 IF Z==1 THEN GOTO 780 +755 Q=1:GOTO 770 +760 IF WS(R,S+1)<>0 THEN GOTO 780 +770 GOTO 910 +780 GOTO 1000 +790 WS(R-1,S)=C +800 C=C+1:VS(R-1,S)=2:R=R-1 +810 IF C==H*V+1 THEN GOTO 1010 +815 Q=0:GOTO 260 +820 WS(R,S-1)=C +830 C=C+1 +840 VS(R,S-1)=1:S=S-1:IF C==H*V+1 THEN GOTO 1010 +850 Q=0:GOTO 260 +860 WS(R+1,S)=C +870 C=C+1:IF VS(R,S)==0 THEN GOTO 880 +875 VS(R,S)=3:GOTO 890 +880 VS(R,S)=2 +890 R=R+1 +900 IF C==H*V+1 THEN GOTO 1010 +905 GOTO 530 +910 IF Q==1 THEN GOTO 960 +920 WS(R,S+1)=C:C=C+1:IF VS(R,S)==0 THEN GOTO 940 +930 VS(R,S)=3:GOTO 950 +940 VS(R,S)=1 +950 S=S+1:IF C==H*V+1 THEN GOTO 1010 +955 GOTO 260 +960 Z=1 +970 IF VS(R,S)==0 THEN GOTO 980 +975 VS(R,S)=3:Q=0:GOTO 1000 +980 VS(R,S)=1:Q=0:R=1:S=1:GOTO 250 +1000 GOTO 210 +1010 FOR J=1 TO V +1011 PRINT "|"; +1012 FOR I=1 TO H +1013 IF VS(I,J)<2 THEN GOTO 1030 +1020 PRINT " "; +1021 GOTO 1040 +1030 PRINT " |"; +1040 NEXT +1041 PRINT +1043 FOR I=1 TO H +1045 IF VS(I,J)==0 THEN GOTO 1060 +1050 IF VS(I,J)==2 THEN GOTO 1060 +1051 PRINT ": "; +1052 GOTO 1070 +1060 PRINT ":--"; +1070 NEXT +1071 PRINT "." +1072 NEXT +1073 END diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/array.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/array.bas new file mode 100644 index 0000000..9a8609c --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/array.bas @@ -0,0 +1,7 @@ +10 A={{"O","X","O"},{"X","O","X"},{"X","X","O"}} +20 FOR Y=0 TO LEN(A)-1 +30 FOR X=0 TO LEN(A(Y))-1 +40 PRINT(A(Y,X);" ";) +50 NEXT +60 PRINT +70 NEXT diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/array0.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/array0.bas new file mode 100644 index 0000000..02ac739 --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/array0.bas @@ -0,0 +1,7 @@ +10 A={2,3,5,7,11,13,17} +100 FOR K=0 TO LEN(A)-1 +110 PRINT A(K) +120 NEXT +200 FOREACH AK=A +210 PRINT AK +220 NEXT diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/brb.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/brb.bas new file mode 100644 index 0000000..a44c289 --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/brb.bas @@ -0,0 +1,4 @@ +10 DEFUN FAC(N)=N*FAC(N-1) +20 FOR K=1 TO 6 +30 PRINT FAC(K) +40 NEXT diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/closure.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/closure.bas new file mode 100644 index 0000000..4f4553a --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/closure.bas @@ -0,0 +1,2 @@ +10 F=[X]~>MAP([X]~>[X]<=5,X) +20 PRINT F(1 TO 10) diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/currying.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/currying.bas new file mode 100644 index 0000000..152fe65 --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/currying.bas @@ -0,0 +1,4 @@ +10 DEFUN F(K,T)=ABS(T)==K +20 CF=F~<32 +30 PRINT CF(24) : REM will print 'false' +40 PRINT CF(-32) : REM will print 'true' diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/downkeys.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/downkeys.bas new file mode 100644 index 0000000..58ee060 --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/downkeys.bas @@ -0,0 +1,2 @@ +10 PRINT GETKEYSDOWN() +20 GOTO 10 diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/facclosure.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/facclosure.bas new file mode 100644 index 0000000..8cd0d90 --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/facclosure.bas @@ -0,0 +1,3 @@ +10 FAC=[N]~>IF N==0 THEN 1 ELSE N*FAC(N-1) +20 K=MAP(FAC, 1 TO 10) +30 PRINT K diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/facmap.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/facmap.bas new file mode 100644 index 0000000..6017f5b --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/facmap.bas @@ -0,0 +1,3 @@ +10 DEFUN FAC(N)=IF N==0 THEN 1 ELSE N*FAC(N-1) +20 K=MAP(FAC, 1 TO 10) +30 PRINT K diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/factorial.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/factorial.bas new file mode 100644 index 0000000..2bfac8f --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/factorial.bas @@ -0,0 +1,4 @@ +10 DEFUN FAC(N)=IF N==0 THEN 1 ELSE N*FAC(N-1) +20 FOR K=1 TO 10 +30 PRINT FAC(K) +40 NEXT diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/fib2.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/fib2.bas new file mode 100644 index 0000000..3b43fad --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/fib2.bas @@ -0,0 +1,5 @@ +10 FIB_=[N,M]~>IF LEN(MJOIN(M))>=N THEN HEAD(MJOIN(M)) ELSE FIB_(N,M>>=([XS]~>MRET((XS(0)+XS(1))!XS))) +11 FIB=[N]~>FIB_(N,MRET({1,1})) +100 FOR K=1 TO 10 +110 PRINT FIB(K);" "; +120 NEXT diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/fib3.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/fib3.bas new file mode 100644 index 0000000..b7a3e3f --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/fib3.bas @@ -0,0 +1,4 @@ +10 FIB = [N,M] ~> IF (M==UNDEFINED) THEN FIB(N, MRET({1, 1})) ELSE IF (LEN(MJOIN(M)) >= N) THEN HEAD(MJOIN(M)) ELSE FIB(N, M >>= ([XS] ~> MRET((XS(0) + XS(1)) ! XS))) +20 FOR K = 1 TO 10 +30 PRINT FIB(K);" "; +40 NEXT diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/fibonacci.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/fibonacci.bas new file mode 100644 index 0000000..93d8434 --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/fibonacci.bas @@ -0,0 +1,4 @@ +10 DEFUN FIB(N)=IF N==0 THEN 0 ELSE IF N==1 THEN 1 ELSE FIB(N-1)+FIB(N-2) +20 FOR K=1 TO 10 +30 PRINT FIB(K);" "; +40 NEXT diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/funs.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/funs.bas new file mode 100644 index 0000000..26eab51 --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/funs.bas @@ -0,0 +1,9 @@ +10 DEFUN POW2(N)=2^N +20 DEFUN DCOS(N)=COS(PI*N/180) +30 FOR X=0 TO 8 +40 PRINT X,POW2(X) +50 NEXT +60 PRINT "----------------" +70 FOREACH A={0,45,90,135,180} +80 PRINT A,DCOS(A) +90 NEXT diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/hamurabi.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/hamurabi.bas new file mode 100644 index 0000000..4eebb83 --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/hamurabi.bas @@ -0,0 +1,138 @@ +10 PRINT SPC(32);"HAMURABI" +20 PRINT SPC(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" +30 PRINT:PRINT:PRINT +80 PRINT "TRY YOUR HAND AT GOVERNING ANCIENT SUMERIA" +90 PRINT "FOR A TEN-YEAR TERM OF OFFICE.":PRINT +95 D1=0:P1=0 +100 Z=0:P=95:S=2800:H=3000:E=H-S +110 Y=3:A=H/Y:I=5:Q=1 +210 D=0 +215 PRINT:PRINT:PRINT "HAMURABI: I BEG TO REPORT TO YOU,":Z=Z+1 +217 PRINT "IN YEAR ";Z;", ";D;" PEOPLE STARVED, ";I;" CAME TO THE CITY," +220 P=P+I +227 IF Q>0 THEN GOTO 230 +228 P=INT(P/2) +229 PRINT "A HORRIBLE PLAGUE STRUCK! HALF THE PEOPLE DIED." +230 PRINT "POPULATION IS NOW ";P +232 PRINT "THE CITY NOW OWNS ";A;" ACRES." +235 PRINT "YOU HARVESTED ";Y;" BUSHELS PER ACRE." +250 PRINT "THE RATS ATE ";E;" BUSHELS." +260 PRINT "YOU NOW HAVE ";S;" BUSHELS IN STORE." +261 PRINT +270 IF Z==11 THEN GOTO 860 +310 C=INT(10*RND(1)) +311 Y=C+17 +312 PRINT "LAND IS TRADING AT ";Y;" BUSHELS PER ACRE." +320 PRINT "HOW MANY ACRES DO YOU WISH TO BUY"; +321 INPUT Q +322 IF Q<0 THEN GOTO 850 +323 IF Y*Q<=S THEN GOTO 330 +324 GOSUB 710 +325 GOTO 320 +330 IF Q==0 THEN GOTO 340 +331 A=A+Q:S=S-Y*Q:C=0 +334 GOTO 400 +340 PRINT "HOW MANY ACRES DO YOU WISH TO SELL"; +341 INPUT Q +342 IF Q<0 THEN GOTO 850 +343 IF QC/2 THEN GOTO 530 +523 REM *** RATS ARE RUNNING WILD!! +525 E=INT(S/C) +530 S=S-E+H +531 GOSUB 800 +532 REM *** LET'S HAVE SOME BABIES +533 I=INT(C*(20*A+S)/P/100+1) +539 REM *** HOW MANY PEOPLE HAD FULL TUMMIES? +540 C=INT(Q/20) +541 REM *** HORROS, A 15% CHANCE OF PLAGUE +542 Q=INT(10*(2*RND(1)-0.3)) +550 IF P0.45*P THEN GOTO 560 +554 P1=((Z-1)*P1+D*100/P)/Z +555 P=C +556 D1=D1+D +557 GOTO 215 +560 PRINT +561 PRINT "YOU STARVED ";D;" PEOPLE IN ONE YEAR!!!" +565 PRINT "DUE TO THIS EXTREME MISMANAGEMENT YOU HAVE NOT ONLY" +566 PRINT "BEEN IMPEACHED AND THROWN OUT OF OFFICE BUT YOU HAVE" +567 PRINT "ALSO BEEN DECLARED NATIONAL FINK!!!!" +568 GOTO 990 +710 PRINT "HAMURABI: THINK AGAIN. YOU HAVE ONLY" +711 PRINT S;" BUSHELS OF GRAIN. NOW THEN," +712 RETURN +720 PRINT "HAMURABI: THINK AGAIN. YOU OWN ONLY ";A;" ACRES. NOW THEN," +730 RETURN +800 C=INT(RND(1)*5)+1 +801 RETURN +850 PRINT +851 PRINT "HAMURABI: I CANNOT DO WHAT YOU WISH." +855 PRINT "GET YOURSELF ANOTHER STEWARD!!!!!" +857 GOTO 990 +860 PRINT "IN YOUR 10-YEAR TERM OF OFFICE, ";P1;" PERCENT OF THE" +862 PRINT "POPULATION STARVED PER YEAR ON THE AVERAGE, I.E. A TOTAL OF" +865 PRINT D1;" PEOPLE DIED!!" +866 L=A/P +870 PRINT "YOU STARTED WITH 10 ACRES PER PERSON AND ENDED WITH" +875 PRINT L;" ACRES PER PERSON." +876 PRINT +880 IF P1>33 THEN GOTO 565 +885 IF L<7 THEN GOTO 565 +890 IF P1>10 THEN GOTO 940 +892 IF L<9 THEN GOTO 940 +895 IF P1>3 THEN GOTO 960 +896 IF L<10 THEN GOTO 960 +900 PRINT "A FANTASTIC PERFORMANCE!!! CHARLEMANGE, DISRAELI, AND" +905 PRINT "JEFFERSON COMBINED COULD NOT HAVE DONE BETTER!" +906 GOTO 990 +940 PRINT "YOUR HEAVY-HANDED PERFORMANCE SMACKS OF NERO AND IVAN IV." +945 PRINT "THE PEOPLE (REMIANING) FIND YOU AN UNPLEASANT RULER, AND," +950 PRINT "FRANKLY, HATE YOUR GUTS!!" +951 GOTO 990 +960 PRINT "YOUR PERFORMANCE COULD HAVE BEEN SOMEWHAT BETTER, BUT" +965 PRINT "REALLY WASN'T TOO BAD AT ALL. ";INT(P*0.8*RND(1));" PEOPLE" +970 PRINT "WOULD DEARLY LIKE TO SEE YOU ASSASSINATED BUT WE ALL HAVE OUR" +975 PRINT "TRIVIAL PROBLEMS." +990 PRINT +991 FOR N=1 TO 10 +992 EMIT 7; +993 NEXT +995 PRINT "SO LONG FOR NOW." +996 PRINT +999 END diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/hangman.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/hangman.bas new file mode 100644 index 0000000..469bff4 --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/hangman.bas @@ -0,0 +1,83 @@ +1 OPTIONBASE 1 +10 PRINT SPC(32);"HANGMAN" +20 PRINT SPC(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" +21 PRINT:PRINT SPC(14);"EDITOR'S NOTE: ALWAYS TYPE IN CAPITAL LETTERS!" +25 PRINT:PRINT +30 PSTR=DIM(12,12):LSTR=DIM(20):DSTR=DIM(20):NSTR=DIM(26):U=DIM(50) +40 C=1: N=50 +50 FOR I=1 TO 20: DSTR(I)="-": NEXT: M=0 +60 FOR I=1 TO 26: NSTR(I)="": NEXT +70 FOR I=1 TO 12: FOR J=1 TO 12: PSTR(I,J)=" ": NEXT: NEXT +80 FOR I=1 TO 12: PSTR(I,1)="X": NEXT +90 FOR I=1 TO 7: PSTR(1,I)="X": NEXT: PSTR(2,7)="X" +95 IF C10 THEN GOTO 170 +600 PRINT "SORRY, YOU LOSE. THE WORD WAS ";ASTR +610 PRINT "YOU MISSED THAT ONE. DO YOU ";: GOTO 370 +620 PRINT "TYPE YES OR NO";:INPUT YSTR: IF LEFT(YSTR,1)=="Y" THEN GOTO 50 +700 DATA "GUM","SIN","FOR","CRY","LUG","BYE","FLY" +710 DATA "UGLY","EACH","FROM","WORK","TALK","WITH","SELF" +720 DATA "PIZZA","THING","FEIGN","FIEND","ELBOW","FAULT","DIRTY" +730 DATA "BUDGET","SPIRIT","QUAINT","MAIDEN","ESCORT","PICKAX" +740 DATA "EXAMPLE","TENSION","QUININE","KIDNEY","REPLICA","SLEEPER" +750 DATA "TRIANGLE","KANGAROO","MAHOGANY","SERGEANT","SEQUENCE" +760 DATA "MOUSTACHE","DANGEROUS","SCIENTIST","DIFFERENT","QUIESCENT" +770 DATA "MAGISTRATE","ERRONEOUSLY","LOUDSPEAKER","PHYTOTOXIC" +780 DATA "MATRIMONIAL","PARASYMPATHOMIMETIC","THIGMOTROPISM" +990 PRINT "BYE NOW" +999 END diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/highorder.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/highorder.bas new file mode 100644 index 0000000..301bb8f --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/highorder.bas @@ -0,0 +1,4 @@ +10 DEFUN APPLY(F,X)=F(X) +20 DEFUN FUN(X)=X^2 +30 K=APPLY(FUN,42) +40 PRINT K diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/monadlaws.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/monadlaws.bas new file mode 100644 index 0000000..197f93c --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/monadlaws.bas @@ -0,0 +1,25 @@ +10 F=[X]~>X*2 : G=[X]~>X^3 : RETN=[X]~>MRET(X) + +100 PRINT:PRINT "First law: 'return a >>= k' equals to 'k a'" +110 K=[X]~>RETN(F(X)) : REM K is monad-returning function +120 A=42 +130 KM=RETN(A)>>=K +140 KO=K(A) +150 PRINT("KM is ";TYPEOF(KM);", ";MJOIN(KM)) +160 PRINT("KO is ";TYPEOF(KO);", ";MJOIN(KO)) + +200 PRINT:PRINT "Second law: 'm >>= return' equals to 'm'" +210 M=MRET(G(42)) +220 MM=M>>=RETN +230 MO=M +240 PRINT("MM is ";TYPEOF(MM);", ";MJOIN(MM)) +250 PRINT("MO is ";TYPEOF(MO);", ";MJOIN(MO)) + +300 PRINT:PRINT "Third law: 'm >>= (\x -> k x >>= h)' equals to '(m >>= k) >>= h'" +310 REM see line 110 for the definition of K +320 H=[X]~>RETN(G(X)) : REM H is monad-returning function +330 M=MRET(69) +340 M1=M>>=([X]~>K(X)>>=H) +350 M2=(M>>=K)>>=H +360 PRINT("M1 is ";TYPEOF(M1);", ";MJOIN(M1)) +370 PRINT("M2 is ";TYPEOF(M2);", ";MJOIN(M2)) diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/monadlaws2.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/monadlaws2.bas new file mode 100644 index 0000000..293d613 --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/monadlaws2.bas @@ -0,0 +1,25 @@ +10 F=[X]~>RETN(X~LAST(X)*2) : G=[X]~>RETN(X~LAST(X)^3) : RETN=[X]~>MRET(X) + +100 PRINT:PRINT "First law: 'return a >>= k' equals to 'k a'" +110 K=[X]~>F(X) : REM K is monad-returning function +120 A=42!NIL +130 KM=RETN(A)>>=K +140 KO=K(A) +150 PRINT("KM is ";TYPEOF(KM);", ";MJOIN(KM)) +160 PRINT("KO is ";TYPEOF(KO);", ";MJOIN(KO)) + +200 PRINT:PRINT "Second law: 'm >>= return' equals to 'm'" +210 M=G(42!NIL) +220 MM=M>>=RETN +230 MO=M +240 PRINT("MM is ";TYPEOF(MM);", ";MJOIN(MM)) +250 PRINT("MO is ";TYPEOF(MO);", ";MJOIN(MO)) + +300 PRINT:PRINT "Third law: 'm >>= (\x -> k x >>= h)' equals to '(m >>= k) >>= h'" +310 REM see line 110 for the definition of K +320 H=[X]~>G(X) : REM H is monad-returning function +330 M=RETN(69!NIL) +340 M1=M>>=([X]~>K(X)>>=H) +350 M2=(M>>=K)>>=H +360 PRINT("M1 is ";TYPEOF(M1);", ";MJOIN(M1)) +370 PRINT("M2 is ";TYPEOF(M2);", ";MJOIN(M2)) diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/myfirst.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/myfirst.bas new file mode 100644 index 0000000..71c75a4 --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/myfirst.bas @@ -0,0 +1 @@ +10 PRINT(2+2) diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/plotter.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/plotter.bas new file mode 100644 index 0000000..3c3fb62 --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/plotter.bas @@ -0,0 +1,9 @@ +1 ZEROLINE=10 +2 AMP=20 +10 DEFUN SINC(P)=IF P==0 THEN 1.0 ELSE SIN(P)/P +20 DEFUN TOCHAR(P,X)=IF (X==ROUND(ZEROLINE+P*AMP)) THEN "@" ELSE IF (X==ZEROLINE) THEN "|" ELSE CHR(250) +30 DEFUN SCONCAT(ACC,S)=ACC+S +40 DEFUN PLOTLINE(F,X)=FOLD(SCONCAT,"",MAP(TOCHAR~ IF (LEN(XS) < 1) THEN NIL ELSE QSORT(FILTER([X] ~> X < HEAD XS, TAIL XS)) # {HEAD XS} # QSORT(FILTER([X] ~> X >= HEAD XS, TAIL XS)) +100 L={7,9,4,5,2,3,1,8,6} +110 PRINT L +120 PRINT QSORT(L) diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/recursion.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/recursion.bas new file mode 100644 index 0000000..b99759c --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/recursion.bas @@ -0,0 +1,3 @@ +10 DEFUN F(STR,XS)=IF (XS==UNDEFINED) THEN F(STR,{}) ELSE IF (LEN(STR)==0) THEN XS ELSE F(RIGHT(STR,LEN(STR)-1),IF (LEN(XS)==0) THEN XS ~ {LEFT(STR,1),1} ELSE IF (XS(LEN(XS)-1,0)>Y' +100 PRINT "Square root of ";X;" is approximately ";Y diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/triangle1.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/triangle1.bas new file mode 100644 index 0000000..bbede63 --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/triangle1.bas @@ -0,0 +1,12 @@ +10 GOTO 1000 +100 REM subroutine to draw a segment. Size is stored to 'Q' +110 PRINT SPC(20-Q); +120 Q1=1 : REM loop counter for this subroutine +130 PRINT "*"; +140 Q1=Q1+1 +150 IF Q1<=Q*2-1 THEN GOTO 130 +160 PRINT : RETURN : REM this line will take us back from the jump +1000 Q=1 : REM this is our loop counter +1010 GOSUB 100 +1020 Q=Q+1 +1030 IF Q<=20 THEN GOTO 1010 diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/triangle2.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/triangle2.bas new file mode 100644 index 0000000..f51854f --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/triangle2.bas @@ -0,0 +1,10 @@ +10 GOTO 1000 +100 REM subroutine to draw a segment. Size is stored to 'Q' +110 PRINT SPC(20-Q); +120 FOR Q1=1 TO Q*2-1 +130 PRINT "*"; +140 NEXT : PRINT +150 RETURN +1000 FOR Q=1 TO 20 +1010 GOSUB 100 +1020 NEXT diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/writermonad.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/writermonad.bas new file mode 100644 index 0000000..d48babd --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/writermonad.bas @@ -0,0 +1,8 @@ +10 WRITER=[VALUE]~>{VALUE,{}} +20 UNIT=[VALUE]~>{VALUE,{}} +30 SQUARED=[X]~>{X*X,{""+X+" WAS SQUARED. "}} +40 HALVED=[X]~>{X/2,{""+X+" WAS HALVED. "}} +50 BIND=[WRITER,TRANSFORM]~>(WRITER() >>= ([VALUELOG]~>(TRANSFORM(VALUELOG(0)) >>= ([RESULTUPDATES]~>(MRET({RESULTUPDATES(0), VALUELOG(1) # RESULTUPDATES(1)})))))) +60 PIPELOG=[WRITER,TRANSFORMS]~>FOLD(BIND,WRITER,TRANSFORMS) +100 LOGOBJ=PIPELOG(UNIT(4),{SQUARED,HALVED}) +110 PRINT(LOGOBJ) diff --git a/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/yourname.bas b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/yourname.bas new file mode 100644 index 0000000..b861511 --- /dev/null +++ b/TerranBASICexecutable/src/net/torvald/tsvm/TerranBasicSamplePrograms/yourname.bas @@ -0,0 +1,3 @@ +10 PRINT "WHAT IS YOUR NAME"; +20 INPUT NAME +30 PRINT "HELLO, ";NAME diff --git a/buildapp/build_app_linux_arm.sh b/buildapp/build_app_linux_arm.sh index f885d28..fd30bf2 100755 --- a/buildapp/build_app_linux_arm.sh +++ b/buildapp/build_app_linux_arm.sh @@ -1,4 +1,6 @@ #!/bin/bash +if (( $EUID == 0 )); then echo "The build process is not meant to be run with root privilege, exiting now." >&2; exit 1; fi + cd "${0%/*}" APPIMAGETOOL="appimagetool-x86_64.AppImage" SRCFILES="tbaslinux_arm" diff --git a/buildapp/build_app_linux_x86.sh b/buildapp/build_app_linux_x86.sh index 027ec26..4877eb1 100755 --- a/buildapp/build_app_linux_x86.sh +++ b/buildapp/build_app_linux_x86.sh @@ -1,4 +1,6 @@ #!/bin/bash +if (( $EUID == 0 )); then echo "The build process is not meant to be run with root privilege, exiting now." >&2; exit 1; fi + cd "${0%/*}" APPIMAGETOOL="appimagetool-x86_64.AppImage" SRCFILES="tbaslinux_x86" diff --git a/buildapp/build_app_mac_arm.sh b/buildapp/build_app_mac_arm.sh index d572ed6..7195174 100755 --- a/buildapp/build_app_mac_arm.sh +++ b/buildapp/build_app_mac_arm.sh @@ -1,4 +1,6 @@ #!/bin/bash +if (( $EUID == 0 )); then echo "The build process is not meant to be run with root privilege, exiting now." >&2; exit 1; fi + cd "${0%/*}" SRCFILES="tbasmac_arm" DESTDIR="out/TerranBASIC_macOS.arm.app" diff --git a/buildapp/build_app_mac_x86.sh b/buildapp/build_app_mac_x86.sh index 71164d0..5765c8a 100755 --- a/buildapp/build_app_mac_x86.sh +++ b/buildapp/build_app_mac_x86.sh @@ -1,4 +1,6 @@ #!/bin/bash +if (( $EUID == 0 )); then echo "The build process is not meant to be run with root privilege, exiting now." >&2; exit 1; fi + cd "${0%/*}" SRCFILES="tbasmac_x86" DESTDIR="out/TerranBASIC_macOS.x86.app" diff --git a/buildapp/build_app_windows_x86.sh b/buildapp/build_app_windows_x86.sh index 167e66f..83f1478 100755 --- a/buildapp/build_app_windows_x86.sh +++ b/buildapp/build_app_windows_x86.sh @@ -1,4 +1,6 @@ #!/bin/bash +if (( $EUID == 0 )); then echo "The build process is not meant to be run with root privilege, exiting now." >&2; exit 1; fi + cd "${0%/*}" SRCFILES="tbaswindows_x86" DESTDIR="TerranBASIC_windows.x86.exe"