mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-06-12 03:29:31 +00:00
basic: out of order loops, convert editor to uppercase when dialect says so, OPTION CPUSPEED
This commit is contained in:
parent
52a1107114
commit
cf39cd4f58
42
presets/basic/23match.bas
Normal file
42
presets/basic/23match.bas
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
100 REM***23 MATCHES
|
||||||
|
110 LET M=23
|
||||||
|
115 PRINT
|
||||||
|
120 PRINT "WE START WITH 23 MATCHES. WHEN IT IS YOUR"
|
||||||
|
130 PRINT "TURN, YOU MAY TAKE 1, 2, OR 3 MATCHES. THE"
|
||||||
|
140 PRINT "ONE WHO MUST TAKE THE LAST MATCH LOSES."
|
||||||
|
150 PRINT
|
||||||
|
200 REM***THE HUMAN MOVES
|
||||||
|
205 PRINT
|
||||||
|
210 PRINT "THERE ARE NOW";M;"MATCHES."
|
||||||
|
215 PRINT
|
||||||
|
220 PRINT "HOW MANY MATCHES DO YOU TAKE";
|
||||||
|
230 INPUT H
|
||||||
|
240 IF H>M THEN 260
|
||||||
|
250 IF H=INT(H) THEN 252
|
||||||
|
251 GOTO 260
|
||||||
|
252 IF H>0 THEN 254
|
||||||
|
253 GOTO 260
|
||||||
|
254 IF H<4 THEN 280
|
||||||
|
260 PRINT "YOU CHEATED! I'LL GIVE YOU ANOTHER CHANCE."
|
||||||
|
270 GOTO 215
|
||||||
|
280 LET M=M-H
|
||||||
|
290 IF M=0 THEN 410
|
||||||
|
300 REM***THE COMPUTER MOVES
|
||||||
|
310 LET R=M-4*INT(M/4)
|
||||||
|
320 IF R<>1 THEN 350
|
||||||
|
330 LET C=INT(3*RND(0))+1
|
||||||
|
340 GOTO 360
|
||||||
|
350 LET C=(R+3)-4*INT((R+3)/4)
|
||||||
|
360 LET M=M-C
|
||||||
|
370 IF M=0 THEN 440
|
||||||
|
375 PRINT
|
||||||
|
380 PRINT "I TOOK";C;"MATCHES."
|
||||||
|
390 GOTO 200
|
||||||
|
400 REM***SOMEBODY ONE(SEE LINES 290 AND 370)
|
||||||
|
410 PRINT
|
||||||
|
420 PRINT "I WON!!! BETTER LUCK NEXT TIME."
|
||||||
|
430 GOTO 100
|
||||||
|
440 PRINT
|
||||||
|
450 PRINT "O.K. SO YOU WON. LET'S PLAY AGAIN."
|
||||||
|
460 GOTO 100
|
||||||
|
999 END
|
121
presets/basic/hamurabi.bas
Normal file
121
presets/basic/hamurabi.bas
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
10 REM *** CONVERTED FROM THE ORIGINAL FOCAL PROGRAM AND MODIFIED
|
||||||
|
20 REM *** FOR EDUSYSTEM 70 BY DAVID AHL, DIGITAL
|
||||||
|
30 REM *** MODIFIED FOR 8K MICROSOFT BASIC BY PETER TURNBULL
|
||||||
|
80 PRINT "TRY YOUR HAND AT GOVERNING ANCIENT SUMERIA"
|
||||||
|
85 PRINT "SUCCESSFULLY FOR A 10-YR TERM OF OFFICE.":PRINT
|
||||||
|
90 REM RANDOMIZE REMOVED
|
||||||
|
95 D1=0:P1=0
|
||||||
|
110 Z=0:P=95:S=2800:H=3000:E=H-S
|
||||||
|
120 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."
|
||||||
|
218 P=P+I
|
||||||
|
227 IF Q>0 THEN 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 "RATS ATE"E"BUSHELS."
|
||||||
|
260 PRINT "YOU NOW HAVE"S"BUSHELS IN STORE.":PRINT
|
||||||
|
270 IF Z=11 THEN 860
|
||||||
|
310 C=INT(10*RND(1)):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:IF Q<0 THEN 850
|
||||||
|
322 IF Y*Q<=S THEN 330
|
||||||
|
323 GOSUB 710
|
||||||
|
324 GOTO 320
|
||||||
|
330 IF Q=0 THEN 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:IF Q<0 THEN 850
|
||||||
|
342 IF Q<A THEN 350
|
||||||
|
343 GOSUB 720
|
||||||
|
344 GOTO 340
|
||||||
|
350 A=A-Q:S=S+Y*Q:C=0
|
||||||
|
400 PRINT
|
||||||
|
410 PRINT "HOW MANY BUSHELS DO YOU WISH TO FEED YOUR PEOPLE";
|
||||||
|
411 INPUT Q
|
||||||
|
412 IF Q<0 THEN 850
|
||||||
|
418 REM *** TRYING TO USE MORE GRAIN THAN IN THE SILOS?
|
||||||
|
420 IF Q<=S THEN 430
|
||||||
|
421 GOSUB 710
|
||||||
|
422 GOTO 410
|
||||||
|
430 S=S-Q:C=1:PRINT
|
||||||
|
440 PRINT "HOW MANY ACRES DO YOU WISH TO PLANT WITH SEED";
|
||||||
|
441 INPUT D:IF D=0 THEN 511
|
||||||
|
442 IF D<0 THEN 850
|
||||||
|
444 REM *** TRYING TO PLANT MORE ACRES THAN YOU OWN?
|
||||||
|
445 IF D<=A THEN 450
|
||||||
|
446 GOSUB 720
|
||||||
|
447 GOTO 440
|
||||||
|
449 REM *** ENOUGH GRAIN FOR SEED?
|
||||||
|
450 IF INT(D/2)<S THEN 455
|
||||||
|
452 GOSUB 710
|
||||||
|
453 GOTO 440
|
||||||
|
454 REM *** ENOUGH PEOPLE TO TEND THE CROPS?
|
||||||
|
455 IF D<10*P THEN 510
|
||||||
|
460 PRINT "BUT YOU HAVE ONLY"P"PEOPLE TO TEND THE FIELDS. NOW THEN,"
|
||||||
|
470 GOTO 440
|
||||||
|
510 S=S-INT(D/2)
|
||||||
|
511 GOSUB 800
|
||||||
|
512 REM *** A BOUNTYFULL HARVEST!!
|
||||||
|
515 Y=C:H=D*Y:E=0
|
||||||
|
521 GOSUB 800
|
||||||
|
522 IF INT(C/2)<>C/2 THEN 530
|
||||||
|
523 REM *** THE 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 *** HORRORS, A 15% CHANCE OF PLAGUE
|
||||||
|
542 Q=INT(10*(2*RND(1)-.3))
|
||||||
|
550 IF P<C THEN 210
|
||||||
|
551 REM *** STARVE ENOUGH FOR IMPEACHMENT?
|
||||||
|
552 D=P-C:IF D>.45*P THEN 560
|
||||||
|
553 P1=((Z-1)*P1+D*100/P)/Z
|
||||||
|
555 P=C:D1=D1+D:GOTO 215
|
||||||
|
560 PRINT: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' !!":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: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 AVERAGE, I.E., A TOTAL OF"
|
||||||
|
865 PRINT D1"PEOPLE DIED!!":L=A/P
|
||||||
|
870 PRINT "YOU STARTED WITH 10 ACRES PER PERSON AND ENDED WITH"
|
||||||
|
875 PRINT L"ACRES PER PERSON.":PRINT
|
||||||
|
880 IF P1>33 THEN 565
|
||||||
|
885 IF L<7 THEN 565
|
||||||
|
890 IF P1>10 THEN 940
|
||||||
|
892 IF L<9 THEN 940
|
||||||
|
895 IF P1>3 THEN 960
|
||||||
|
896 IF L<10 THEN 960
|
||||||
|
900 PRINT "A FANTASTIC PERFORMANCE!!! CHARLEMANGE, DISRAELI, AND"
|
||||||
|
905 PRINT "JEFFERSON COMBINED COULD NOT HAVE DONE BETTER!":GOTO 990
|
||||||
|
940 PRINT "YOUR HEAVY-HANDED PERFORMANCE SMACKS OF NERO AND IVAN IV."
|
||||||
|
945 PRINT "THE PEOPLE (REMAINING) FIND YOU AN UNPLEASANT RULER, AND,"
|
||||||
|
950 PRINT "FRANKLY, HATE YOUR GUTS!":GOTO 990
|
||||||
|
960 PRINT "YOUR PERFORMANCE COULD HAVE BEEN SOMEWHAT BETTER, BUT"
|
||||||
|
965 PRINT "REALLY WASN'T TOO BAD AT ALL. ";
|
||||||
|
966 PRINT INT(P*.8*RND(1));"PEOPLE WOULD"
|
||||||
|
970 PRINT "DEARLY LIKE TO SEE YOU ASSASSINATED BUT WE ALL HAVE OUR"
|
||||||
|
975 PRINT "TRIVIAL PROBLEMS."
|
||||||
|
990 PRINT:FOR N=1 TO 10:PRINT CHR$(7);:NEXT N
|
||||||
|
995 PRINT "SO LONG FOR NOW.":PRINT
|
||||||
|
999 END
|
16
presets/basic/sieve.bas
Normal file
16
presets/basic/sieve.bas
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
005 OPTION CPUSPEED MAX
|
||||||
|
010 REM***A PRIME NUMBER SIEVE BENCHMARK
|
||||||
|
020 T = TIMER
|
||||||
|
025 N = 8191
|
||||||
|
030 DIM F(N+3)
|
||||||
|
040 FOR I = 0 TO N : F(I) = 1 : NEXT I
|
||||||
|
050 S = N
|
||||||
|
060 FOR I = 0 TO S
|
||||||
|
070 IF F(I) = 0 THEN GOTO 110
|
||||||
|
080 P = I+I+3
|
||||||
|
090 FOR K = I+P TO S STEP P : F(K) = 0 : NEXT K
|
||||||
|
100 C = C+1
|
||||||
|
110 NEXT I
|
||||||
|
120 T = TIMER-T
|
||||||
|
130 PRINT C;" PRIMES FOUND IN ";T;" SECONDS"
|
||||||
|
150 END
|
221
presets/basic/wumpus.bas
Normal file
221
presets/basic/wumpus.bas
Normal file
|
@ -0,0 +1,221 @@
|
||||||
|
5 REM *** HUNT THE WUMPUS ***
|
||||||
|
10 DIM P(5)
|
||||||
|
15 PRINT "INSTRUCTIONS (Y-N)";
|
||||||
|
20 INPUT I$
|
||||||
|
25 IF (I$ = "N") OR (I$ = "N") THEN 35
|
||||||
|
30 GOSUB 375
|
||||||
|
35 GOTO 80
|
||||||
|
80 REM *** SET UP CAVE (DODECAHEDRAL NODE LIST) ***
|
||||||
|
85 DIM S(20,3)
|
||||||
|
90 FOR J = 1 TO 20
|
||||||
|
95 FOR K = 1 TO 3
|
||||||
|
100 READ S(J,K)
|
||||||
|
105 NEXT K
|
||||||
|
110 NEXT J
|
||||||
|
115 DATA 2,5,8,1,3,10,2,4,12,3,5,14,1,4,6
|
||||||
|
120 DATA 5,7,15,6,8,17,1,7,9,8,10,18,2,9,11
|
||||||
|
125 DATA 10,12,19,3,11,13,12,14,20,4,13,15,6,14,16
|
||||||
|
130 DATA 15,17,20,7,16,18,9,17,19,11,18,20,13,16,19
|
||||||
|
135 DEF FNA(X)=INT(20*RND(1))+1
|
||||||
|
140 DEF FNB(X)=INT(3*RND(1))+1
|
||||||
|
145 DEF FNC(X)=INT(4*RND(1))+1
|
||||||
|
150 REM *** LOCATE L ARRAY ITEMS ***
|
||||||
|
155 REM *** 1-YOU, 2-WUMPUS, 3&4-PITS, 5&6-BATS ***
|
||||||
|
160 DIM L(6)
|
||||||
|
165 DIM M(6)
|
||||||
|
170 FOR J = 1 TO 6
|
||||||
|
175 L(J) = FNA(0)
|
||||||
|
180 M(J) = L(J)
|
||||||
|
185 NEXT J
|
||||||
|
190 REM *** CHECK FOR CROSSOVERS (IE L(1)=L(2), ETC) ***
|
||||||
|
195 FOR J = 1 TO 6
|
||||||
|
200 FOR K = 1 TO 6
|
||||||
|
205 IF J = K THEN 215
|
||||||
|
210 IF L(J) = L(K) THEN 170
|
||||||
|
215 NEXT K
|
||||||
|
220 NEXT J
|
||||||
|
225 REM *** SET NO. OF ARROWS ***
|
||||||
|
230 A = 5
|
||||||
|
235 L = L(1)
|
||||||
|
240 REM *** RUN THE GAME ***
|
||||||
|
245 PRINT "HUNT THE WUMPUS"
|
||||||
|
250 REM *** HAZARD WARNING AND LOCATION ***
|
||||||
|
255 GOSUB 585
|
||||||
|
260 REM *** MOVE OR SHOOT ***
|
||||||
|
265 GOSUB 670
|
||||||
|
270 ON O GOTO 280,300
|
||||||
|
275 REM *** SHOOT ***
|
||||||
|
280 GOSUB 715
|
||||||
|
285 IF F = 0 THEN 255
|
||||||
|
290 GOTO 310
|
||||||
|
295 REM *** MOVE ***
|
||||||
|
300 GOSUB 975
|
||||||
|
305 IF F = 0 THEN 255
|
||||||
|
310 IF F > 0 THEN 335
|
||||||
|
315 REM *** LOSE ***
|
||||||
|
320 PRINT "HA HA HA - YOU LOSE!"
|
||||||
|
325 GOTO 340
|
||||||
|
330 REM *** WIN ***
|
||||||
|
335 PRINT "HEE HEE HEE - THE WUMPUS'LL GET YOU NEXT TIME!!"
|
||||||
|
340 FOR J = 1 TO 6
|
||||||
|
345 L(J) = M(J)
|
||||||
|
350 NEXT J
|
||||||
|
355 PRINT "SAME SETUP (Y-N)";
|
||||||
|
360 INPUT I$
|
||||||
|
365 IF (I$ <> "Y") AND (I$ <> "Y") THEN 170
|
||||||
|
370 GOTO 230
|
||||||
|
375 REM *** INSTRUCTIONS ***
|
||||||
|
380 PRINT "WELCOME TO 'HUNT THE WUMPUS'"
|
||||||
|
385 PRINT " THE WUMPUS LIVES IN A CAVE OF 20 ROOMS. EACH ROOM"
|
||||||
|
390 PRINT "HAS 3 TUNNELS LEADING TO OTHER ROOMS. (LOOK AT A"
|
||||||
|
395 PRINT "DODECAHEDRON TO SEE HOW THIS WORKS-IF YOU DON'T KNOW"
|
||||||
|
400 PRINT "WHAT A DODECAHEDRON IS, ASK SOMEONE)"
|
||||||
|
405 PRINT
|
||||||
|
410 PRINT " HAZARDS:"
|
||||||
|
415 PRINT " BOTTOMLESS PITS - TWO ROOMS HAVE BOTTOMLESS PITS IN THEM"
|
||||||
|
420 PRINT " IF YOU GO THERE, YOU FALL INTO THE PIT (& LOSE!)"
|
||||||
|
425 PRINT " SUPER BATS - TWO OTHER ROOMS HAVE SUPER BATS. IF YOU"
|
||||||
|
430 PRINT " GO THERE, A BAT GRABS YOU AND TAKES YOU TO SOME OTHER"
|
||||||
|
435 PRINT " ROOM AT RANDOM. (WHICH MAY BE TROUBLESOME)"
|
||||||
|
440 INPUT "HIT RETURN TO CONTINUE";A$
|
||||||
|
445 PRINT " WUMPUS:"
|
||||||
|
450 PRINT " THE WUMPUS IS NOT BOTHERED BY HAZARDS (HE HAS SUCKER"
|
||||||
|
455 PRINT " FEET AND IS TOO BIG FOR A BAT TO LIFT). USUALLY"
|
||||||
|
460 PRINT " HE IS ASLEEP. TWO THINGS WAKE HIM UP: YOU SHOOTING AN"
|
||||||
|
465 PRINT "ARROW OR YOU ENTERING HIS ROOM."
|
||||||
|
470 PRINT " IF THE WUMPUS WAKES HE MOVES (P=.75) ONE ROOM"
|
||||||
|
475 PRINT " OR STAYS STILL (P=.25). AFTER THAT, IF HE IS WHERE YOU"
|
||||||
|
480 PRINT " ARE, HE EATS YOU UP AND YOU LOSE!"
|
||||||
|
485 PRINT
|
||||||
|
490 PRINT " YOU:"
|
||||||
|
495 PRINT " EACH TURN YOU MAY MOVE OR SHOOT A CROOKED ARROW"
|
||||||
|
500 PRINT " MOVING: YOU CAN MOVE ONE ROOM (THRU ONE TUNNEL)"
|
||||||
|
505 PRINT " ARROWS: YOU HAVE 5 ARROWS. YOU LOSE WHEN YOU RUN OUT"
|
||||||
|
510 PRINT " EACH ARROW CAN GO FROM 1 TO 5 ROOMS. YOU AIM BY TELLING"
|
||||||
|
515 PRINT " THE COMPUTER THE ROOM#S YOU WANT THE ARROW TO GO TO."
|
||||||
|
520 PRINT " IF THE ARROW CAN'T GO THAT WAY (IF NO TUNNEL) IT MOVES"
|
||||||
|
525 PRINT " AT RANDOM TO THE NEXT ROOM."
|
||||||
|
530 PRINT " IF THE ARROW HITS THE WUMPUS, YOU WIN."
|
||||||
|
535 PRINT " IF THE ARROW HITS YOU, YOU LOSE."
|
||||||
|
540 INPUT "HIT RETURN TO CONTINUE";A$
|
||||||
|
545 PRINT " WARNINGS:"
|
||||||
|
550 PRINT " WHEN YOU ARE ONE ROOM AWAY FROM A WUMPUS OR HAZARD,"
|
||||||
|
555 PRINT " THE COMPUTER SAYS:"
|
||||||
|
560 PRINT " WUMPUS: 'I SMELL A WUMPUS'"
|
||||||
|
565 PRINT " BAT : 'BATS NEARBY'"
|
||||||
|
570 PRINT " PIT : 'I FEEL A DRAFT'"
|
||||||
|
575 PRINT
|
||||||
|
580 RETURN
|
||||||
|
585 REM *** PRINT LOCATION & HAZARD WARNINGS ***
|
||||||
|
590 PRINT
|
||||||
|
595 FOR J = 2 TO 6
|
||||||
|
600 FOR K = 1 TO 3
|
||||||
|
605 IF S(L(1),K) <> L(J) THEN 640
|
||||||
|
610 ON J-1 GOTO 615,625,625,635,635
|
||||||
|
615 PRINT "I SMELL A WUMPUS!"
|
||||||
|
620 GOTO 640
|
||||||
|
625 PRINT "I FEEL A DRAFT"
|
||||||
|
630 GOTO 640
|
||||||
|
635 PRINT "BATS NEARBY!"
|
||||||
|
640 NEXT K
|
||||||
|
645 NEXT J
|
||||||
|
650 PRINT "YOU ARE IN ROOM ";L(1)
|
||||||
|
655 PRINT "TUNNELS LEAD TO ";S(L,1);" ";S(L,2);" ";S(L,3)
|
||||||
|
660 PRINT
|
||||||
|
665 RETURN
|
||||||
|
670 REM *** CHOOSE OPTION ***
|
||||||
|
675 PRINT "SHOOT OR MOVE (S-M)";
|
||||||
|
680 INPUT I$
|
||||||
|
685 IF (I$ <> "S") AND (I$ <> "S") THEN 700
|
||||||
|
690 O = 1
|
||||||
|
695 RETURN
|
||||||
|
700 IF (I$ <> "M") AND (I$ <> "M") THEN 675
|
||||||
|
705 O = 2
|
||||||
|
710 RETURN
|
||||||
|
715 REM *** ARROW ROUTINE ***
|
||||||
|
720 F = 0
|
||||||
|
725 REM *** PATH OF ARROW ***
|
||||||
|
735 PRINT "NO. OF ROOMS (1-5)";
|
||||||
|
740 INPUT J9
|
||||||
|
745 IF J9 < 1 THEN 735
|
||||||
|
750 IF J9 > 5 THEN 735
|
||||||
|
755 FOR K = 1 TO J9
|
||||||
|
760 PRINT "ROOM #";
|
||||||
|
765 INPUT P(K)
|
||||||
|
770 IF K <= 2 THEN 790
|
||||||
|
775 IF P(K) <> P(K-2) THEN 790
|
||||||
|
780 PRINT "ARROWS AREN'T THAT CROOKED - TRY ANOTHER ROOM"
|
||||||
|
785 GOTO 760
|
||||||
|
790 NEXT K
|
||||||
|
795 REM *** SHOOT ARROW ***
|
||||||
|
800 L = L(1)
|
||||||
|
805 FOR K = 1 TO J9
|
||||||
|
810 FOR K1 = 1 TO 3
|
||||||
|
815 IF S(L,K1) = P(K) THEN 895
|
||||||
|
820 NEXT K1
|
||||||
|
825 REM *** NO TUNNEL FOR ARROW ***
|
||||||
|
830 L = S(L,FNB(1))
|
||||||
|
835 GOTO 900
|
||||||
|
840 NEXT K
|
||||||
|
845 PRINT "MISSED"
|
||||||
|
850 L = L(1)
|
||||||
|
855 REM *** MOVE WUMPUS ***
|
||||||
|
860 GOSUB 935
|
||||||
|
865 REM *** AMMO CHECK ***
|
||||||
|
870 A = A-1
|
||||||
|
875 IF A > 0 THEN 885
|
||||||
|
880 F = -1
|
||||||
|
885 RETURN
|
||||||
|
890 REM *** SEE IF ARROW IS AT L(1) OR AT L(2)
|
||||||
|
895 L = P(K)
|
||||||
|
900 IF L <> L(2) THEN 920
|
||||||
|
905 PRINT "AHA! YOU GOT THE WUMPUS!"
|
||||||
|
910 F = 1
|
||||||
|
915 RETURN
|
||||||
|
920 IF L <> L(1) THEN 840
|
||||||
|
925 PRINT "OUCH! ARROW GOT YOU!"
|
||||||
|
930 GOTO 880
|
||||||
|
935 REM *** MOVE WUMPUS ROUTINE ***
|
||||||
|
940 K = FNC(0)
|
||||||
|
945 IF K = 4 THEN 955
|
||||||
|
950 L(2) = S(L(2),K)
|
||||||
|
955 IF L(2) <> L THEN 970
|
||||||
|
960 PRINT "TSK TSK TSK - WUMPUS GOT YOU!"
|
||||||
|
965 F = -1
|
||||||
|
970 RETURN
|
||||||
|
975 REM *** MOVE ROUTINE ***
|
||||||
|
980 F = 0
|
||||||
|
985 PRINT "WHERE TO";
|
||||||
|
990 INPUT L
|
||||||
|
995 IF L < 1 THEN 985
|
||||||
|
1000 IF L > 20 THEN 985
|
||||||
|
1005 FOR K = 1 TO 3
|
||||||
|
1010 REM *** CHECK IF LEGAL MOVE ***
|
||||||
|
1015 IF S(L(1),K) = L THEN 1045
|
||||||
|
1020 NEXT K
|
||||||
|
1025 IF L = L(1) THEN 1045
|
||||||
|
1030 PRINT "NOT POSSIBLE -";
|
||||||
|
1035 GOTO 985
|
||||||
|
1040 REM *** CHECK FOR HAZARDS ***
|
||||||
|
1045 L(1) = L
|
||||||
|
1050 REM *** WUMPUS ***
|
||||||
|
1055 IF L <> L(2) THEN 1090
|
||||||
|
1060 PRINT "... OOPS! BUMPED A WUMPUS!"
|
||||||
|
1065 REM *** MOVE WUMPUS ***
|
||||||
|
1070 GOSUB 940
|
||||||
|
1075 IF F = 0 THEN 1090
|
||||||
|
1080 RETURN
|
||||||
|
1085 REM *** PIT ***
|
||||||
|
1090 IF L = L(3) THEN 1100
|
||||||
|
1095 IF L <> L(4) THEN 1120
|
||||||
|
1100 PRINT "YYYYIIIIEEEE . . . FELL IN PIT"
|
||||||
|
1105 F = -1
|
||||||
|
1110 RETURN
|
||||||
|
1115 REM *** BATS ***
|
||||||
|
1120 IF L = L(5) THEN 1130
|
||||||
|
1125 IF L <> L(6) THEN 1145
|
||||||
|
1130 PRINT "ZAP--SUPER BAT SNATCH! ELSEWHEREVILLE FOR YOU!"
|
||||||
|
1135 L = FNA(1)
|
||||||
|
1140 GOTO 1045
|
||||||
|
1145 RETURN
|
||||||
|
1150 END
|
|
@ -95,7 +95,7 @@ CodeMirror.defineMode("basic", function(conf, parserConf) {
|
||||||
// Octal
|
// Octal
|
||||||
else if (stream.match(/^&O[0-7]+/i)) { intLiteral = true; }
|
else if (stream.match(/^&O[0-7]+/i)) { intLiteral = true; }
|
||||||
// Decimal
|
// Decimal
|
||||||
else if (stream.match(/^[1-9]\d*F?/)) {
|
else if (stream.match(/^\d+F?/)) {
|
||||||
// Decimal literals may be "imaginary"
|
// Decimal literals may be "imaginary"
|
||||||
stream.eat(/J/i);
|
stream.eat(/J/i);
|
||||||
// TODO - Can you have imaginary longs?
|
// TODO - Can you have imaginary longs?
|
||||||
|
|
|
@ -240,6 +240,7 @@ export interface BASICOptions {
|
||||||
sparseArrays : boolean; // true == don't require DIM for arrays (TODO)
|
sparseArrays : boolean; // true == don't require DIM for arrays (TODO)
|
||||||
printZoneLength : number; // print zone length
|
printZoneLength : number; // print zone length
|
||||||
numericPadding : boolean; // " " or "-" before and " " after numbers?
|
numericPadding : boolean; // " " or "-" before and " " after numbers?
|
||||||
|
outOfOrderNext : boolean; // can we skip a NEXT statement? (can't interleave tho)
|
||||||
multipleNextVars : boolean; // NEXT Y,X (TODO)
|
multipleNextVars : boolean; // NEXT Y,X (TODO)
|
||||||
ifElse : boolean; // IF...ELSE construct
|
ifElse : boolean; // IF...ELSE construct
|
||||||
bitwiseLogic : boolean; // -1 = TRUE, 0 = FALSE, AND/OR/NOT done with bitwise ops
|
bitwiseLogic : boolean; // -1 = TRUE, 0 = FALSE, AND/OR/NOT done with bitwise ops
|
||||||
|
@ -249,6 +250,7 @@ export interface BASICOptions {
|
||||||
validKeywords : string[]; // valid keywords (or null for accept all)
|
validKeywords : string[]; // valid keywords (or null for accept all)
|
||||||
validFunctions : string[]; // valid functions (or null for accept all)
|
validFunctions : string[]; // valid functions (or null for accept all)
|
||||||
validOperators : string[]; // valid operators (or null for accept all)
|
validOperators : string[]; // valid operators (or null for accept all)
|
||||||
|
commandsPerSec? : number; // how many commands per second?
|
||||||
}
|
}
|
||||||
|
|
||||||
///// BASIC PARSER
|
///// BASIC PARSER
|
||||||
|
@ -743,17 +745,22 @@ export class BASICParser {
|
||||||
return stmt;
|
return stmt;
|
||||||
}
|
}
|
||||||
parseOptions(stmt: OPTION_Statement) {
|
parseOptions(stmt: OPTION_Statement) {
|
||||||
|
var arg = stmt.optargs[0];
|
||||||
switch (stmt.optname) {
|
switch (stmt.optname) {
|
||||||
case 'BASE':
|
case 'BASE':
|
||||||
let base = parseInt(stmt.optargs[0]);
|
let base = parseInt(arg);
|
||||||
if (base == 0 || base == 1) this.opts.defaultArrayBase = base;
|
if (base == 0 || base == 1) this.opts.defaultArrayBase = base;
|
||||||
else this.compileError("OPTION BASE can only be 0 or 1.");
|
else this.compileError("OPTION BASE can only be 0 or 1.");
|
||||||
break;
|
break;
|
||||||
case 'DIALECT':
|
case 'DIALECT':
|
||||||
let dname = stmt.optargs[0] || "";
|
let dname = arg || "";
|
||||||
let dialect = DIALECTS[dname.toUpperCase()];
|
let dialect = DIALECTS[dname.toUpperCase()];
|
||||||
if (dialect) this.opts = dialect;
|
if (dialect) this.opts = dialect;
|
||||||
else this.compileError(`The dialect named "${dname}" is not supported by this compiler.`);
|
else this.compileError(`OPTION DIALECT ${dname} is not supported by this compiler.`);
|
||||||
|
break;
|
||||||
|
case 'CPUSPEED':
|
||||||
|
if (!(this.opts.commandsPerSec = Math.min(1e7, arg=='MAX' ? Infinity : parseFloat(arg))))
|
||||||
|
this.compileError(`OPTION CPUSPEED takes a positive number or MAX.`);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
this.compileError(`OPTION ${stmt.optname} is not supported by this compiler.`);
|
this.compileError(`OPTION ${stmt.optname} is not supported by this compiler.`);
|
||||||
|
@ -825,6 +832,7 @@ export const ECMA55_MINIMAL : BASICOptions = {
|
||||||
printZoneLength : 15,
|
printZoneLength : 15,
|
||||||
numericPadding : true,
|
numericPadding : true,
|
||||||
checkOverflow : true,
|
checkOverflow : true,
|
||||||
|
outOfOrderNext : false,
|
||||||
multipleNextVars : false,
|
multipleNextVars : false,
|
||||||
ifElse : false,
|
ifElse : false,
|
||||||
bitwiseLogic : false,
|
bitwiseLogic : false,
|
||||||
|
@ -853,6 +861,7 @@ export const ALTAIR_BASIC40 : BASICOptions = {
|
||||||
printZoneLength : 15,
|
printZoneLength : 15,
|
||||||
numericPadding : true,
|
numericPadding : true,
|
||||||
checkOverflow : true,
|
checkOverflow : true,
|
||||||
|
outOfOrderNext : true,
|
||||||
multipleNextVars : true, // TODO: not supported
|
multipleNextVars : true, // TODO: not supported
|
||||||
ifElse : true,
|
ifElse : true,
|
||||||
bitwiseLogic : true,
|
bitwiseLogic : true,
|
||||||
|
@ -883,6 +892,7 @@ export const APPLESOFT_BASIC : BASICOptions = {
|
||||||
printZoneLength : 16,
|
printZoneLength : 16,
|
||||||
numericPadding : false,
|
numericPadding : false,
|
||||||
checkOverflow : true,
|
checkOverflow : true,
|
||||||
|
outOfOrderNext : true,
|
||||||
multipleNextVars : false,
|
multipleNextVars : false,
|
||||||
ifElse : false,
|
ifElse : false,
|
||||||
bitwiseLogic : false,
|
bitwiseLogic : false,
|
||||||
|
@ -911,6 +921,7 @@ export const MAX8_BASIC : BASICOptions = {
|
||||||
printZoneLength : 15,
|
printZoneLength : 15,
|
||||||
numericPadding : false,
|
numericPadding : false,
|
||||||
checkOverflow : true,
|
checkOverflow : true,
|
||||||
|
outOfOrderNext : true,
|
||||||
multipleNextVars : true,
|
multipleNextVars : true,
|
||||||
ifElse : true,
|
ifElse : true,
|
||||||
bitwiseLogic : true,
|
bitwiseLogic : true,
|
||||||
|
|
|
@ -42,7 +42,7 @@ export class BASICRuntime {
|
||||||
vars : {};
|
vars : {};
|
||||||
arrays : {};
|
arrays : {};
|
||||||
defs : {};
|
defs : {};
|
||||||
forLoops : {next:(name:string) => void}[];
|
forLoops : {varname:string, next:(name:string) => void}[];
|
||||||
returnStack : number[];
|
returnStack : number[];
|
||||||
column : number;
|
column : number;
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ export class BASICRuntime {
|
||||||
this.datums.push({value:value});
|
this.datums.push({value:value});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
// TODO: compile statements?
|
// compile statements ahead of time
|
||||||
line.stmts.forEach((stmt) => this.compileStatement(stmt));
|
line.stmts.forEach((stmt) => this.compileStatement(stmt));
|
||||||
});
|
});
|
||||||
// try to resume where we left off after loading
|
// try to resume where we left off after loading
|
||||||
|
@ -105,7 +105,7 @@ export class BASICRuntime {
|
||||||
// if no valid function list, look for ABC...() functions in prototype
|
// if no valid function list, look for ABC...() functions in prototype
|
||||||
if (!fnames) fnames = Object.keys(BASICRuntime.prototype).filter((name) => /^[A-Z]{3,}[$]?$/.test(name));
|
if (!fnames) fnames = Object.keys(BASICRuntime.prototype).filter((name) => /^[A-Z]{3,}[$]?$/.test(name));
|
||||||
var dict = {};
|
var dict = {};
|
||||||
for (var fn of fnames) dict[fn] = this[fn].bind(this);
|
for (var fn of fnames) if (this[fn]) dict[fn] = this[fn].bind(this);
|
||||||
return dict;
|
return dict;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -341,6 +341,7 @@ export class BASICRuntime {
|
||||||
this.vars[forname] = init;
|
this.vars[forname] = init;
|
||||||
if (this.trace) console.log(`FOR ${forname} = ${init} TO ${targ} STEP ${step}`);
|
if (this.trace) console.log(`FOR ${forname} = ${init} TO ${targ} STEP ${step}`);
|
||||||
this.forLoops.unshift({
|
this.forLoops.unshift({
|
||||||
|
varname: forname,
|
||||||
next: (nextname:string) => {
|
next: (nextname:string) => {
|
||||||
if (nextname && forname != nextname)
|
if (nextname && forname != nextname)
|
||||||
this.runtimeError(`I executed NEXT "${nextname}", but the last FOR was for "${forname}".`)
|
this.runtimeError(`I executed NEXT "${nextname}", but the last FOR was for "${forname}".`)
|
||||||
|
@ -358,8 +359,16 @@ export class BASICRuntime {
|
||||||
|
|
||||||
nextForLoop(name) {
|
nextForLoop(name) {
|
||||||
var fl = this.forLoops[0];
|
var fl = this.forLoops[0];
|
||||||
|
if (fl != null && name != null && fl.varname != name) {
|
||||||
|
if (!this.opts.outOfOrderNext) this.dialectError(`execute out-of-order NEXT statements`);
|
||||||
|
while (fl) {
|
||||||
|
if (fl.varname == name) break;
|
||||||
|
this.forLoops.shift();
|
||||||
|
fl = this.forLoops[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!fl) this.runtimeError(`I couldn't find a FOR for this NEXT.`)
|
if (!fl) this.runtimeError(`I couldn't find a FOR for this NEXT.`)
|
||||||
else fl.next(name);
|
fl.next(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// converts a variable to string/number based on var name
|
// converts a variable to string/number based on var name
|
||||||
|
@ -557,7 +566,7 @@ export class BASICRuntime {
|
||||||
}
|
}
|
||||||
|
|
||||||
do__RESTORE() {
|
do__RESTORE() {
|
||||||
this.dataptr = 0;
|
return `this.dataptr = 0`;
|
||||||
}
|
}
|
||||||
|
|
||||||
do__END() {
|
do__END() {
|
||||||
|
@ -806,6 +815,9 @@ export class BASICRuntime {
|
||||||
TAN(arg : number) : number {
|
TAN(arg : number) : number {
|
||||||
return this.checkNum(Math.tan(arg));
|
return this.checkNum(Math.tan(arg));
|
||||||
}
|
}
|
||||||
|
TIMER() : number {
|
||||||
|
return Date.now() / 1000;
|
||||||
|
}
|
||||||
VAL(arg : string) : number {
|
VAL(arg : string) : number {
|
||||||
var n = parseFloat(this.checkString(arg));
|
var n = parseFloat(this.checkString(arg));
|
||||||
return isNaN(n) ? 0 : n; // TODO? altair works this way
|
return isNaN(n) ? 0 : n; // TODO? altair works this way
|
||||||
|
|
|
@ -74,6 +74,10 @@ const MODEDEFS = {
|
||||||
basic: { noLineNumbers: true, noGutters: true }, // TODO: not used?
|
basic: { noLineNumbers: true, noGutters: true }, // TODO: not used?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export var textMapFunctions = {
|
||||||
|
input: null
|
||||||
|
};
|
||||||
|
|
||||||
export class SourceEditor implements ProjectView {
|
export class SourceEditor implements ProjectView {
|
||||||
constructor(path:string, mode:string) {
|
constructor(path:string, mode:string) {
|
||||||
this.path = path;
|
this.path = path;
|
||||||
|
@ -150,6 +154,10 @@ export class SourceEditor implements ProjectView {
|
||||||
});
|
});
|
||||||
// set editor mode for highlighting, etc
|
// set editor mode for highlighting, etc
|
||||||
this.editor.setOption("mode", this.mode);
|
this.editor.setOption("mode", this.mode);
|
||||||
|
// change text?
|
||||||
|
this.editor.on('beforeChange', (cm, chgobj) => {
|
||||||
|
if (textMapFunctions.input && chgobj.text) chgobj.text = chgobj.text.map(textMapFunctions.input);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,12 +2,17 @@
|
||||||
import { Platform, BreakpointCallback } from "../common/baseplatform";
|
import { Platform, BreakpointCallback } from "../common/baseplatform";
|
||||||
import { PLATFORMS, AnimationTimer, EmuHalt } from "../common/emu";
|
import { PLATFORMS, AnimationTimer, EmuHalt } from "../common/emu";
|
||||||
import { loadScript } from "../ide/ui";
|
import { loadScript } from "../ide/ui";
|
||||||
|
import * as views from "../ide/views";
|
||||||
import { BASICRuntime } from "../common/basic/runtime";
|
import { BASICRuntime } from "../common/basic/runtime";
|
||||||
import { BASICProgram } from "../common/basic/compiler";
|
import { BASICProgram } from "../common/basic/compiler";
|
||||||
import { TeleTypeWithKeyboard } from "../common/teletype";
|
import { TeleTypeWithKeyboard } from "../common/teletype";
|
||||||
|
|
||||||
const BASIC_PRESETS = [
|
const BASIC_PRESETS = [
|
||||||
{ id: 'hello.bas', name: 'Hello World' }
|
{ id: 'hello.bas', name: 'Hello World' },
|
||||||
|
{ id: 'sieve.bas', name: 'Sieve Benchmark' },
|
||||||
|
{ id: '23match.bas', name: '23 Matches' },
|
||||||
|
{ id: 'wumpus.bas', name: 'Hunt The Wumpus' },
|
||||||
|
{ id: 'hamurabi.bas', name: 'Hammurabi' },
|
||||||
];
|
];
|
||||||
|
|
||||||
class BASICPlatform implements Platform {
|
class BASICPlatform implements Platform {
|
||||||
|
@ -16,7 +21,6 @@ class BASICPlatform implements Platform {
|
||||||
runtime: BASICRuntime;
|
runtime: BASICRuntime;
|
||||||
timer: AnimationTimer;
|
timer: AnimationTimer;
|
||||||
tty: TeleTypeWithKeyboard;
|
tty: TeleTypeWithKeyboard;
|
||||||
ips: number = 1000;
|
|
||||||
clock: number = 0;
|
clock: number = 0;
|
||||||
hotReload: boolean = false;
|
hotReload: boolean = false;
|
||||||
debugstop: boolean = false; // TODO: should be higher-level support
|
debugstop: boolean = false; // TODO: should be higher-level support
|
||||||
|
@ -75,7 +79,8 @@ class BASICPlatform implements Platform {
|
||||||
|
|
||||||
animate() {
|
animate() {
|
||||||
if (this.tty.isBusy()) return;
|
if (this.tty.isBusy()) return;
|
||||||
this.clock += this.ips/60;
|
var ips = this.program.opts.commandsPerSec || 1000;
|
||||||
|
this.clock += ips / 60;
|
||||||
while (!this.runtime.exited && this.clock-- > 0) {
|
while (!this.runtime.exited && this.clock-- > 0) {
|
||||||
this.advance();
|
this.advance();
|
||||||
}
|
}
|
||||||
|
@ -112,6 +117,7 @@ class BASICPlatform implements Platform {
|
||||||
this.program = data;
|
this.program = data;
|
||||||
this.runtime.load(data);
|
this.runtime.load(data);
|
||||||
this.tty.uppercaseOnly = this.program.opts.uppercaseOnly;
|
this.tty.uppercaseOnly = this.program.opts.uppercaseOnly;
|
||||||
|
views.textMapFunctions.input = this.program.opts.uppercaseOnly ? (s) => s.toUpperCase() : null;
|
||||||
// only reset if we exited, otherwise we try to resume
|
// only reset if we exited, otherwise we try to resume
|
||||||
if (!this.hotReload || didExit) this.reset();
|
if (!this.hotReload || didExit) this.reset();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user