mirror of
https://github.com/inexorabletash/jsbasic.git
synced 2024-12-22 07:30:19 +00:00
292 lines
11 KiB
Plaintext
292 lines
11 KiB
Plaintext
5 PR#3 : TEXT : HOME
|
|
10 PRINT "(1) GOSUB/RETURN/POP"
|
|
15 PRINT "(2) Basic I/O, IF/THEN"
|
|
20 PRINT "(3) Fibbonacci Sequence"
|
|
25 PRINT "(4) Guess my number"
|
|
30 PRINT "(5) Guess your number"
|
|
35 PRINT "(6) Approximate Pi"
|
|
40 PRINT "(7) Function tests"
|
|
45 PRINT "(8) Error tests"
|
|
50 PRINT "(9) Cellular automata"
|
|
55 PRINT "(10) Madlibs"
|
|
60 PRINT "(11) Lissajous Figures"
|
|
65 PRINT "(12) Screen Test"
|
|
70 PRINT "(13) DOS Sequential Access"
|
|
75 PRINT "(14) Lores Drawing with Joystick"
|
|
80 PRINT "(15) Lores Colors"
|
|
85 PRINT "(16) Mandelbrot Set"
|
|
85 PRINT "(17) Light Cycles"
|
|
90 PRINT "(18) Hires Demo"
|
|
92 PRINT "(19) DOS WRITE/APPEND"
|
|
94 PRINT "(20) ONERR ... RESUME"
|
|
94 PRINT "(21) CHR$ Tests"
|
|
95 PRINT: INPUT "Enter option: "; A : PRINT : HOME : ON A GOTO 100,200,300,400,500,600,700,800,1900,1000,1100,1200,2000,2100,2200,2300,2400,2500,2600,2700,2800
|
|
98 HOME
|
|
99 END
|
|
|
|
100 REM Gosub/Pop/Return tests
|
|
110 TRACE : PRINT "GOSUB 150" : GOSUB 150
|
|
120 PRINT "GOSUB 160" : GOSUB 160
|
|
130 PRINT : PRINT "Press any key: " : GET A$ : GOTO 5
|
|
150 PRINT "RETURN" : NOTRACE : RETURN
|
|
160 PRINT "GOSUB 190" : GOSUB 190
|
|
180 PRINT "RETURN - Shouldn't happen!"
|
|
190 PRINT "POP" : POP : PRINT "RETURN" : RETURN
|
|
|
|
200 REM Basic input/output, expression, IF/THEN tests
|
|
205 PRINT "at line 200"
|
|
210 INPUT "Pick a number: "; A
|
|
215 PRINT A
|
|
220 IF (A) THEN PRINT "TRUE"
|
|
230 IF (NOT A) THEN PRINT "FALSE"
|
|
240 PRINT : PRINT "Press any key: " : GET A$ : GOTO 5
|
|
|
|
300 REM Fibbonacci
|
|
310 LA = 0 : CU = 1
|
|
320 NX = LA + CU : PRINT NX
|
|
330 LA = CU : CU = NX
|
|
340 GOTO 320
|
|
|
|
400 REM Guess my number
|
|
405 PRINT "I'm picking a number between 1 and 100..."
|
|
410 N = INT( RND(1) * 100 ) + 1
|
|
420 INPUT "Your guess? "; G
|
|
430 IF G = N THEN PRINT "Got it!" : PRINT : PRINT "Press any key: " : GET A$ : GOTO 5
|
|
430 IF G < N THEN PRINT "Too low" : GOTO 420
|
|
440 IF G > N THEN PRINT "Too high" : GOTO 420
|
|
|
|
500 REM Guess your number
|
|
510 INPUT "Pick a number between 1 and 100, then press Enter: "; X
|
|
520 MN = 1 : MX = 100: G = INT( RND(1) * 100 ) + 1
|
|
530 PRINT "I guess ";G;" - enter 1 for too high, -1 for too low, 0 for got it"
|
|
540 INPUT R
|
|
550 IF R = 0 THEN PRINT "I guessed right!" : PRINT : PRINT "Press any key: " : GET A$ : GOTO 5
|
|
540 IF R < 0 THEN MN = G + 1 : GOTO 560
|
|
550 IF R > 0 THEN MX = G - 1 : GOTO 560
|
|
560 IF MX = MN THEN PRINT "It must be "; MX; " - I guess you win." : END
|
|
570 G = INT( ( MX + MN ) / 2 ) : GOTO 530
|
|
|
|
600 REM Compute pi
|
|
610 I = 0
|
|
620 SUM = 0
|
|
630 SIGN = 1
|
|
640 D = ( SIGN * ( 1 / ( 2 * I + 1 ) ) )
|
|
645 SUM = SUM + D
|
|
650 SIGN = -SIGN
|
|
660 PI = 4 * SUM
|
|
670 PRINT "I = ";I;" PI = ";PI;" D = ";D
|
|
680 I = I + 1
|
|
690 GOTO 640
|
|
|
|
700 REM Function tests
|
|
702 PRINT "ABS(-3.14) = "; ABS(-3.14)
|
|
704 PRINT "ASC('A') = "; ASC("A")
|
|
706 PRINT "ATN(1) = "; ATN(1)
|
|
708 PRINT "CHR$(65) = "; CHR$(65)
|
|
710 PRINT "COS(1) = "; COS(1)
|
|
712 PRINT "EXP(1) = "; EXP(1)
|
|
714 PRINT "INT(3.14) = "; INT(3.14)
|
|
716 PRINT "LEFT$('abcdef',3) = "; LEFT$("abcdef",3)
|
|
718 PRINT "LEN('abcdef') = "; LEN("abcdef")
|
|
720 PRINT "LOG(3.14) = "; LOG(3.14)
|
|
722 PRINT "MID$('abcdef',3) = "; MID$("abcdef",3)
|
|
724 PRINT "MID$('abcdef',3,2) = "; MID$("abcdef",3,2)
|
|
726 PRINT "RIGHT$('abcdef',3) = "; RIGHT$("abcdef",3)
|
|
728 PRINT "RND(1) = "; RND(1)
|
|
730 PRINT "SGN(-3.14) = "; SGN(-3.14)
|
|
732 PRINT "SIN(1) = "; SIN(1)
|
|
734 PRINT "SQR(9) = "; SQR(9)
|
|
736 PRINT "STR$(3.14) = "; STR$(3.14)
|
|
738 PRINT "TAN(1) = "; TAN(1)
|
|
740 PRINT "VAL('3.14') = "; VAL("3.14")
|
|
790 PRINT : PRINT "Press any key: " : GET A$ : GOTO 5
|
|
|
|
800 REM Error tests
|
|
810 A = 2 / 0 : PRINT "Shouldn't print this!"
|
|
820 PRINT : PRINT "Press any key: " : GET A$ : GOTO 5
|
|
|
|
900 REM Cellular automata
|
|
901 PRINT "Wolfram's CA rules" : PRINT "Try 110, 111, 118, 121, 126" : PRINT
|
|
902 INPUT "Rule: "; R : PRINT
|
|
904 DIM VT(8) : FOR I = 0 TO 7 : VT(I) = NOT( R / 2 = INT( R / 2 ) ) : R = INT(R / 2) : NEXT
|
|
910 S$ = " # "
|
|
912 PRINT ">";S$;"<"
|
|
914 N$ = " "
|
|
916 FOR I = 2 TO LEN(S$) - 1
|
|
918 V = 4 * ( MID$( S$, I-1, 1) = "#" ) + 2 * ( MID$( S$, I, 1) = "#" ) + 1 * ( MID$( S$, I+1, 1) = "#" )
|
|
920 IF VT(V) THEN N$ = N$ + "#" : GOTO 930
|
|
922 N$ = N$ + " "
|
|
930 NEXT I
|
|
940 N$ = N$ + " "
|
|
950 S$ = N$
|
|
960 GOTO 912
|
|
|
|
1000 REM Madlibs
|
|
1010 INPUT "Name: "; N$
|
|
1020 INPUT "Verb: "; V$
|
|
1030 INPUT "Noun: "; NN$
|
|
1040 INPUT "Place: "; P$
|
|
1050 S$ = "One day, " + N$ + " " + V$ + " to " + P$ + " to see the " + NN$ + "."
|
|
1060 PRINT S$ : PRINT
|
|
1070 PRINT : PRINT "Press any key: " : GET A$ : GOTO 5
|
|
|
|
1100 REM Lissajous Figures
|
|
1105 REM POKE 49168,0 : REM Clear keyboard strobe
|
|
1110 XA = 19 : YA = 19
|
|
1120 XM = RND(1) * 0.5 + 0.5 : YM = RND(1) * 0.5 + 0.5
|
|
1130 P = RND(1) * 3.14159 * 2
|
|
1140 GR : COLOR= RND(1) * 14 + 1
|
|
1150 FOR T = 0 TO 99 STEP 0.05
|
|
1155 IF PEEK(49152) > 127 THEN POKE 49168,0 : GOTO 5
|
|
1160 X = XA * COS( XM * T )
|
|
1170 Y = YA * COS( YM * T + P )
|
|
1180 PLOT 20 + X, 20 + Y
|
|
1190 NEXT T : GOTO 1100
|
|
|
|
1200 REM Screen Coordinates
|
|
1210 TEXT: HOME : FOR I = 1 TO 24 : HTAB 1 : VTAB I : PRINT I; : NEXT
|
|
1220 GR : FOR I = 0 TO 39 : COLOR= I : HLIN 0, 39 AT I : NEXT
|
|
1230 VTAB 24 : HTAB 10 : PRINT "Press Any Key To Continue"; : GET A$
|
|
1240 HGR : C = 3 : FOR I = 0 TO 70 : HCOLOR= C : HPLOT I*2,I TO 279-I*2,I TO 279-I*2,159-I TO I*2,159-I TO I*2,I : C = C + 1 : IF C > 7 THEN C = 0
|
|
1245 NEXT
|
|
1250 VTAB 24 : HTAB 10 : PRINT "Press Any Key To Continue"; : GET A$
|
|
1290 GOTO 5
|
|
|
|
1900 REM Cellular automata
|
|
1901 HOME
|
|
1902 PRINT "Wolfram's CA rules" : PRINT "Try 110, 111, 118, 121, 126" : PRINT
|
|
1903 INPUT "Rule: "; R : PRINT
|
|
1904 DIM VT(8) : FOR I = 0 TO 7 : VT(I) = NOT( R / 2 = INT( R / 2 ) ) : R = INT(R / 2) : NEXT
|
|
1910 DIM C(30) : DIM N(30) : N(15) = 1
|
|
1912 FOR I = 0 TO 30 : C(I) = N(I) : PRINT C(I); : NEXT : PRINT
|
|
1916 FOR I = 2 TO 30 - 1
|
|
1918 V = 4 * C(I-1) + 2 * C(I) + 1 * C(I+1)
|
|
1920 N(I) = VT(V)
|
|
1930 NEXT I
|
|
1940 GOTO 1912
|
|
|
|
2000 REM DOS Sequential Text File
|
|
2005 PRINT "First, knowing it has 4 lines..." : PRINT
|
|
2010 PRINT CHR$(4)"OPEN JABBERWOCKY"
|
|
2015 PRINT CHR$(4)"READ JABBERWOCKY"
|
|
2020 FOR I = 1 TO 4 : INPUT A$ : PRINT A$ : NEXT
|
|
2025 PRINT CHR$(4)"CLOSE"
|
|
2030 PRINT : PRINT "Now with ONERR..." : PRINT
|
|
2035 PRINT CHR$(4)"OPEN JABBERWOCKY"
|
|
2040 PRINT CHR$(4)"READ JABBERWOCKY"
|
|
2045 ONERR GOTO 2055
|
|
2050 INPUT A$ : PRINT A$ : GOTO 2050
|
|
2055 PRINT : PRINT "Hit EOF " : POKE 216,0 : PRINT CHR$(4)"CLOSE"
|
|
2090 PRINT : PRINT "Press any key to continue: " : GET A$ : GOTO 5
|
|
|
|
2100 REM Lores Drawing
|
|
2110 GR
|
|
2115 OX = -1 : OY = -1
|
|
2116 C = 0
|
|
2120 X = INT( PDL(0) / 256 * 40 )
|
|
2130 Y = INT( PDL(1) / 256 * 48 )
|
|
2135 HTAB 1 : VTAB 23 : PRINT X ; " " ; Y ; " "
|
|
2140 REM IF ( OX <> X OR OY <> Y ) AND OX <> -1 AND OY <> -1 THEN COLOR= 0 : PLOT OX, OY
|
|
2150 COLOR= C : PLOT X, Y
|
|
2160 OX = X : OY = Y : C = C + 1 : IF C > 15 THEN C = 0
|
|
2170 GOTO 2120
|
|
|
|
2200 REM Color Chart
|
|
2210 GR
|
|
2220 DATA 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, 10, 11, -1, -1, 12, 13, -1, -1, 14, 15, -2
|
|
2230 MX = 0 : MY = 0 : XS = 6 : YS = 9
|
|
2240 READ C : IF C = -2 THEN HTAB 1 : VTAB 22 : PRINT "Press any key: " : GET A$ : GOTO 5
|
|
2250 IF C = -1 THEN GOTO 2270
|
|
2260 COLOR= C : FOR Y = 0 TO YS-1 : HLIN MX*XS,MX*XS+(XS-2) AT MY*(YS+1)+Y : NEXT
|
|
2270 MY = MY + 1 : IF MY > 3 THEN MY = 0 : MX = MX + 1
|
|
2280 GOTO 2240
|
|
|
|
2300 REM Mandelbrot Set
|
|
2310 HOME : GR : POKE 49234,0
|
|
2320 FOR X = 0 TO 39 : FOR Y = 1 TO 24
|
|
2330 I = X / 40 * 3 - 2 : J = Y / 48 * 2 - 1
|
|
2340 GOSUB 2360 : COLOR= C : PLOT X, Y : PLOT X,48 - Y
|
|
2350 NEXT Y : NEXT X : HTAB 1 : VTAB 22 : PRINT "Press any key: " : GET A$ : GOTO 5
|
|
2360 IT = 0 : S = I : T = J
|
|
2370 S1 = S*S - T*T + I : T = 2*S*T + J: S = S1 : IT = IT + 1
|
|
2380 IF ((S*S + T*T) < 4) AND IT < 16 THEN GOTO 2370
|
|
2390 C = IT : RETURN
|
|
|
|
2400 REM Light Cycles Game
|
|
2410 HOME : GR : REM TODO: Fullscreen
|
|
2420 X = 19 : Y = 38 : DX = 0 : DY = -1
|
|
2430 COLOR= 15 : HLIN 0,39 AT 0: HLIN 0,39 AT 39: VLIN 0,39 AT 0 : VLIN 0,39 AT 39
|
|
2440 HTAB 1 : VTAB 22 : PRINT "Press any key to start: " : GET A$ : HOME
|
|
2450 COLOR= 2: PLOT X,Y
|
|
2460 K = PEEK(49152) : POKE 49168,0
|
|
2461 LX = DX : LY = DY
|
|
2462 IF K = 8+128 THEN DX = -1 : DY = 0
|
|
2463 IF K = 21+128 THEN DX = 1 : DY = 0
|
|
2464 IF K = 11+128 THEN DX = 0 : DY = -1
|
|
2465 IF K = 10+128 THEN DX = 0 : DY = 1
|
|
2466 IF ( LX AND LX = -DX ) OR (LY AND LY = -DY) THEN DX = LX : DY = LY
|
|
2470 X = X + DX : Y = Y + DY
|
|
2480 IF SCRN(X,Y) <> 0 THEN HTAB 1 : VTAB 23 : PRINT "Crashed! Press any key to continue: " : POKE 49168,0 : GET A$ : GOTO 5
|
|
2490 HTAB 1 : VTAB 21 : SC = SC + 10 : PRINT "Score: "; SC
|
|
2490 FOR I = 0 TO 500 : NEXT : GOTO 2450
|
|
|
|
2500 REM Hires Demo
|
|
2510 HOME : HGR
|
|
2520 W = 279 : H = 159
|
|
2530 FOR I = 0 TO 1 STEP 0.05
|
|
2535 HCOLOR= 1
|
|
2540 HPLOT 0,H * I TO W* (1-I),0
|
|
2545 HCOLOR= 2
|
|
2550 HPLOT 0,H * (1-I) TO W* (1-I),H
|
|
2555 HCOLOR= 5
|
|
2560 HPLOT W,H * I TO W * I,0
|
|
2565 HCOLOR= 6
|
|
2570 HPLOT W,H * (1-I) TO W * I,H
|
|
2575 NEXT
|
|
2580 HTAB 1 : VTAB 22 : PRINT "Press any key to continue: " : GET A$ : GOTO 5
|
|
|
|
2600 REM DOS WRITE/APPEND
|
|
2610 PRINT CHR$(4)"OPEN FOO"
|
|
2615 PRINT CHR$(4)"WRITE FOO"
|
|
2620 FOR I = 1 TO 5 : PRINT "WRITE - "; CHR$(ASC("A") - 1 + I ) : NEXT
|
|
2625 PRINT CHR$(4)"CLOSE FOO"
|
|
2630 PRINT CHR$(4)"APPEND FOO"
|
|
2635 PRINT CHR$(4)"WRITE FOO"
|
|
2640 FOR I = 6 TO 10 : PRINT "APPEND - ";CHR$(ASC("A") - 1 + I ) : NEXT
|
|
2645 PRINT CHR$(4)"CLOSE FOO"
|
|
2650 PRINT CHR$(4)"OPEN FOO"
|
|
2655 PRINT CHR$(4)"READ FOO"
|
|
2660 FOR I = 1 TO 10 : INPUT A$ : PRINT "READ LINE ";I;": ";A$ : NEXT
|
|
2665 PRINT CHR$(4)"CLOSE FOO"
|
|
2670 PRINT : PRINT "Press any key to continue: " : GET A$ : GOTO 5
|
|
|
|
2700 REM ONERR ... RESUME
|
|
2710 PRINT "First, RESUME into an IF statement"
|
|
2712 ONERR GOTO 2718
|
|
2714 PRINT "Testing... " : X = 0 : IF 1 / X THEN PRINT "Succeeded!"
|
|
2716 PRINT "That worked!" : GOTO 2750
|
|
2718 PRINT "Oops! How about this... " : X = 1 : RESUME
|
|
2750 ONERR GOTO 2785
|
|
2755 PRINT "Trigger division by zero with X / Y"
|
|
2760 INPUT "X = ";X
|
|
2765 INPUT "Y = ";Y
|
|
2770 PRINT "X / Y = ";X;" / ";Y;" = ";(X/Y)
|
|
2775 POKE 216,0 : REM Clear ONERR Flag
|
|
2780 PRINT "That worked! Press any key to continue: " : GET A$ : GOTO 5
|
|
2785 PRINT : PRINT "Oops, caught an error. Try again": INPUT "Y = ";Y : RESUME
|
|
|
|
2800 REM CONTROL KEY TESTS
|
|
2810 PR#0 : TEXT : HOME
|
|
2820 HTAB 20 : VTAB 24 : PRINT "1"CHR$(10)"2";
|
|
2830 HTAB 1 : VTAB 11 : PRINT CHR$(8)"3";
|
|
2840 HTAB 1 : VTAB 1 : PRINT CHR$(8)"4";
|
|
2851 HTAB 16 : VTAB 23 : PRINT "1-->";
|
|
2852 HTAB 17 : VTAB 24 : PRINT "2-->";
|
|
2853 HTAB 36 : VTAB 10 : PRINT "3-->";
|
|
2854 HTAB 36 : VTAB 1 : PRINT "4-->";
|
|
2860 VTAB 10 : HTAB 1 : PRINT "Press key to beep:"; : GET A$ : PRINT CHR$(7)
|
|
2870 VTAB 11 : HTAB 1 : PRINT "Press any key:"; : GET A$ : GOTO 5
|
|
|
|
|
|
|