DISPLAY 4 LAYER OPEN 0,128,128,0 CLS FONT 1 KEYBOARD ON RANDOMIZE TIMER DST = 0 DSC = 1 PRM = 2 LBL = 3 LBC = 4 OPR = 5 OPC = 6 CMT = 7 DIM INS$(1024,CMT) CDE = 3 OPRMAX = 44 DIM OPR$(OPRMAX) DIM OPX(OPRMAX,CDE) DIM OPRTLY(OPRMAX) REPEAT REM OPRCNT = OPRCNT+1 REM READ S$, OPX(OPRCNT,CDE) READ S$,X REM OPR$(OPRCNT) UNTIL S$="TESTB" DATA "CALL", 255 DATA "JUMP", 254 DATA "NEXT", 253 DATA "ERR", 252 DATA "TESTL", 251 DATA "TESTN", 250 DATA "TESTR", 249 DATA "TESTV", 248 DATA "RTN", 247 DATA "PRS", 246 DATA "PRN", 245 DATA "NLINE", 244 DATA "GOTOP", 243 DATA "STORE", 242 DATA "IND", 241 DATA "SAV", 240 DATA "POPC", 239 DATA "INNUM", 238 DATA "ADD", 237 DATA "SUB", 236 DATA "MUL", 235 DATA "DIV", 234 DATA "CMPR", 233 DATA "LST", 232 DATA "GETLINE", 231 DATA "INSRT", 230 DATA "VINIT", 229 DATA "XINIT", 228 DATA "INIT", 227 DATA "TESTB", 0 DIM RAM(4095) ARI = 1 ILC = 2 BSC = 3 DIM STK(BSC,31), TOP(BSC) DIM VAR(255) VARA = 256-26 VARSTRINGS = VARA-26 VARASTRING = VARSTRINGS-31 REM PRINT "VARASTRING = "+VARASTRING TOKENS: TKNMAX = 20 DIM TKN$(TKNMAX) TKN1$ = "D" FOR X = 0 TO TKNMAX READ S$ S$ = MID$(S$, INSTR(S$,"'")+1, 255) S$ = LEFT$(S$, INSTR(S$,"'")-1) TKN$(X) = S$ NEXT X DATA "DO$: DAT 'DO' ;@D" DATA "END$: DAT 'END' ;@E" DATA "FOR$: DAT 'FOR' ;@F" DATA "GOTO$: DAT 'GOTO' ;@G" DATA "CHR$: DAT 'CHR$(' ;@H" DATA "INPUT$: DAT 'INPUT' ;@I" DATA "IF$: DAT 'IF' ;@J" DATA "ASC$: DAT 'ASC(' ;@K" DATA "LET$: DAT 'LET' ;@L" DATA "LIST$: DAT 'LIST' ;@M" DATA "RUN$: DAT 'RUN' ;@N" DATA "RND$: DAT 'RND(' ;@O" DATA "PRINT$: DAT 'PRINT' ;@P" DATA "NEW$: DAT 'NEW' ;@Q" DATA "REM$: DAT 'REM' ;@R" DATA "GOSUB$: DAT 'GOSUB' ;@S" DATA "TO$: DAT 'TO' ;@T" DATA "UNTIL$: DAT 'LOOP UNTIL' ;@U" DATA "RETRN$: DAT 'RETURN' ;@V" DATA "WHILE$: DAT 'LOOP WHILE' ;@W" DATA "NEXT$: DAT 'NEXT' ;@X" DIM BASIC$(255) REM READ AND PARSE IL: HTTP://WWW.ITTYBITTYCOMPUTERS.COM/ITTYBITTY/TINYBASIC/DDJ1/DESIGN.HTML DO READ S$ REM PRINT S$ IF S$="EOF:" THEN EXIT T$ = S$ REM IF NOT A COMMENT IF LEFT$(T$,1)<>";" THEN IC = IC + 1 REM IF A LABEL, STORE IT IF LEFT$(T$,1)<>" " THEN INS$(IC, LBL) = LEFT$(T$, INSTR(T$, ":")-1) REM PRINT INS$(IC, LBL) T$ = MID$(T$, LEN(INS$(IC, LBL))+2,255) END IF REM TRIM SPACES WHILE ASC(T$)=32 T$ = MID$(T$, 2, 255) WEND T$ = T$ + " " REM OPERATOR INS$(IC, OPR) = LEFT$(T$, INSTR(T$, " ")-1) REM PRINT INS$(IC, OPR) T$ = MID$(T$, LEN(INS$(IC, OPR))+1,255) REM TRIM SPACES WHILE LEFT$(T$,1) = " " T$ = MID$(T$, 2, 255) WEND REM TRUNCATE COMMENT J = INSTR(T$,";") IF J>0 THEN REM FIND LAST ; J = LEN(T$) WHILE MID$(T$, J, 1)<>";" J = J-1 WEND INS$(IC, CMT) = MID$(T$, J, 255) T$ = LEFT$(T$, J-1) END IF REM RTRIM WHILE RIGHT$(T$,1)<=" " AND LEN(T$)>0 T$ = LEFT$(T$, LEN(T$)-1) WEND REM DESTINATION J = INSTR(T$,",") IF J>0 THEN REM FIND LAST "," J = LEN(T$) WHILE MID$(T$, J, 1)<>"," J = J-1 WEND REM TOKEN IF LEFT$(T$,1)="@" THEN INS$(IC, PRM) = CHR$(ASC(MID$(T$,2,1))-ASC(TKN1$)) REM PRINT "@"+ASC(INS$(IC, PRM)) REM PARAMETER ELSE INS$(IC, PRM) = LEFT$(T$, J-1) END IF REM SAVE LABEL FOR DESTINATION INS$(IC, DST) = MID$(T$, J+1, 255) REM PRINT INS$(IC, PRM)+" -> "+INS$(IC, DST) REM LABEL ELSE IF LEFT$(T$,1) >= "A" THEN INS$(IC, DST) = T$ REM STRING OR NUMBER ELSE INS$(IC, PRM) = T$ END IF REM PRINT INS$(IC, PRM) END IF LOOP REM PRINT "INSTRUCTIONS: "+IC REM ENCODE OPERATORS FOR I = 1 TO IC S$ = INS$(I, OPR) IF LEN(S$)>0 THEN REM FIND IN OPERATOR LIST FOR J = 1 TO OPRCNT IF S$ = OPR$(J) THEN EXIT NEXT J REM IF NOT FOUND, STORE NAME AND ARGUMENT TYPES IF LEN(OPR$(J)) = 0 THEN OPR$(J) = S$ OPX(J, DST) = LEN(INS$(I, DST))>0 OPX(J, PRM) = LEN(INS$(I, PRM))>0 REM IF OPX(J, DST) OR OPX(J, PRM) THEN PRINT S$+" "; REM IF OPX(J, DST) THEN PRINT "DST, "; REM IF OPX(J, PRM) THEN PRINT "PRM "; REM IF OPX(J, DST) OR OPX(J, PRM) THEN PRINT OPRCNT = J END IF INS$(I, OPC) = STR$(J) OPRTLY(J) = OPRTLY(J)+1 END IF NEXT I REM PRINT "OPCODES: "+OPRCNT FOR J = 1 TO OPRCNT REM IF OPRTLY(J)>2 THEN PRINT RIGHT$(" "+STR$(OPRTLY(J)),3)+" "+OPR$(J)+" " NEXT J REM ASSEMBLE OPCODES - FIRST PASS FOR I = 1 TO IC OP = VAL(INS$(I, OPC)) RAM(MC) = OP INS$(I, LBC) = STR$(MC) MC = MC+1 IF OPX(OP, DST) THEN REM WILL ASSIGN DESTINATION IN SECOND PASS RAM(MC) = 255 INS$(I, DSC) = STR$(MC) MC = MC + 1 END IF IF OPX(OP, PRM) THEN IF LEFT$(INS$(I, PRM),1)="'" THEN REM IF LEN(INS$(I, LBL))>0 THEN PRINT INS$(I, LBL)+": "; REM PRINT OPR$(OP)+" "+INS$(I,PRM) REM PRINT " "+INS$(I,PRM) RAM(MC) = ASC(MID$(INS$(I, PRM), 2, 1)) IF RAM(MC) = ASC("'") THEN RAM(MC)=34 MC = MC + 1 REM NUMBER ELSE IF ASC(INS$(I, PRM))>=32 THEN RAM(MC) = VAL(INS$(I, PRM)) MC = MC + 1 ELSE RAM(MC) = ASC(INS$(I, PRM)) MC = MC + 1 END IF END IF NEXT I MC = MC-1 REM PRINT "IL LENGTH: "+MC MCMAX = MC REM ASSEMBLE OPCODES - SECOND PASS FOR I = 1 TO IC OP = VAL(INS$(I, OPC)) REM INS$(I, LBC) = STR$(MC) IF OPX(OP, DST) THEN REM ASSIGN DESTINATION MC = VAL(INS$(I, DSC)) FOR J = 1 TO IC IF INS$(I, DST) = INS$(J, LBL) THEN EXIT NEXT J IF J>IC THEN PRINT "UNKNOWN LABEL: "+CHR$(34)+INS$(I, DST)+CHR$(34) RAM(MC) = VAL(INS$(J, LBC)) REM IF RAM(MC)<=MC AND (RAM(MC)-MC)<0 THEN REM IF OPR$(OP)="NEXT" THEN PRINT "JUMP "+INS$(I, DST) REM RAM(MC)+" "; REM PRINT MC+"->"+RAM(MC)+" = "+(RAM(MC)-MC)+" "; END IF REM IF OPR$(OP)="PUSH" THEN PRINT "PUSH "+INS$(I, PRM) NEXT I REM OUTPUT IL S$ = "" FOR J = 1 TO MCMAX S$ = S$ + HEX$(RAM(J)) NEXT J REM PRINT S$ PRINT "BYTE BASIC" PRINT REM EXECUTOR IC = 0 GOSUB INITW DO DI = 32767 GOSUB EXEC IF DI < 32767 THEN IC = DI END IF LOOP EXEC: REM PRINT LEFT$(" ",3-LEN(STR$(IC)))+STR$(IC)+" "; OP$ = OPR$(RAM(IC)) REM PRINT OP$ IF DEBUG THEN PRINT OP$+": "; FOR X = 0 TO TOP(ARI) PRINT STK(ARI, X)+" "; NEXT X PRINT END IF IC = IC + 1 REM REPLACE TOP TWO ELEMENTS OF AESTK BY THEIR SUM. IF OP$ = "ADD" THEN TOP(ARI) = TOP(ARI)-1 STK(ARI, TOP(ARI)) = STK(ARI, TOP(ARI)) + STK(ARI, TOP(ARI)+1) END IF REM EXECUTE THE IL SUBROUTINE STARTING AT LBL. SAVE THE IL ADDRESS FOLLOWING THE CALL ON THE CONTROL STACK. IF OP$ = "CALL" THEN REM PRINT OP$ TOP(ILC) = TOP(ILC)+1 STK(ILC, TOP(ILC)) = IC+1 DI = RAM(IC) END IF REM COMPARE AESTK(SP), THE TOP OF THE STACK, WITH AESTK(SP-2) AS PER THE RELATIONS INDICATED BY AESTK(SP-1). DELETE ALL FROM STACK. IF THE CONDITION SPECIFIED DID NOT MATCH, THEN PERFORM NEXT ACTION. IF OP$ = "CMPR" THEN X = STK(ARI, TOP(ARI)-2) R = STK(ARI, TOP(ARI)-1) Y = STK(ARI, TOP(ARI)) TOP(ARI) = TOP(ARI)-3 IF R=1 THEN F = (XY) IF R=5 THEN F = (X<>Y) IF R=6 THEN F = (X>=Y) IF NOT F THEN IF BC>0 THEN GOSUB NEXTLINE GOSUB NEXTSTATEMENT ELSE REM GOSUB TRIM REM PRINT OP$+": "+INP$ IC = IC+1 END IF END IF REM COMPARE AESTK(SP), THE TOP OF THE STACK, WITH AESTK(SP-2) AS PER THE RELATIONS INDICATED BY AESTK(SP-1). DELETE ALL FROM STACK AND PLACE THE RESULT ON THE STACK. CMPS: IF OP$ = "CMPS" THEN X = STK(ARI, TOP(ARI)-2) R = STK(ARI, TOP(ARI)-1) Y = STK(ARI, TOP(ARI)) TOP(ARI) = TOP(ARI)-2 IF R=1 THEN F = (XY) IF R=5 THEN F = (X<>Y) IF R=6 THEN F = (X>=Y) REM PRINT X+" "+R+" "+Y+" = "+F STK(ARI, TOP(ARI)) = ABS(F) END IF REM REPLACE TOP TWO ELEMENTS OF AESTK BY THEIR QUOTIENT. IF OP$ = "DIV" THEN TOP(ARI) = TOP(ARI)-1 STK(ARI, TOP(ARI)) = INT(STK(ARI, TOP(ARI)) / STK(ARI, TOP(ARI)+1)) END IF REM REPORT A SYNTAX ERROR IF AFTER DELETION LEADING BLANKS THE CURSOR IS NOT POSITIONED TO ROAD A CARRIAGE RETURN. IF OP$ = "DONE" THEN GOSUB TRIM IF LEN(INP$)>0 THEN DI = RAM(IC) ELSE IC = IC+1 END IF END IF REM DROP FROM AE STACK IF OP$ = "DROP" THEN TOP(ARI) = TOP(ARI)-1 END IF REM DROP FROM CALL STACK IF OP$ = "DROPC" THEN TOP(BSC) = TOP(BSC)-1 END IF REM DUP AE STACK DUP: IF OP$ = "DUP" THEN STK(ARI, TOP(ARI)+1) = STK(ARI, TOP(ARI)) TOP(ARI) = TOP(ARI)+1 END IF REM DUP CALL STACK DUPC: IF OP$ = "DUPC" THEN STK(BSC, TOP(BSC)+1) = STK(BSC, TOP(BSC)) TOP(BSC) = TOP(BSC)+1 END IF REM REPORT SYNTAX ERROR AND RETURN TO LINE COLLECT ROUTINE. IF OP$ = "ERR" THEN PRINT PRINT "WHAT? "; S$ = BASIC$(BC) J = INSTR(S$,INP$) IF J THEN S$ = LEFT$(S$,ABS(J-1))+"?"+INP$ GOSUB EXPANDTOKENS PRINT BC+" "+T$ REM PRINT LEN(INP$) REM PRINT ASC(INP$) BC = 0 DI = RAM(IC) END IF REM RETURN TO THE LINE COLLECT ROUTINE. IF OP$ = "FIN" THEN BC = 0 DI = RAM(IC) END IF REM INPUT A LINE TO LBUF. GETLINE: IF OP$ = "GETLINE" THEN PRINT ">"; INPUT S$ GOSUB ENTOKEN INP$ = S$ REM PRINT "'"+S$+"'" VTAB = 0 END IF REM READ A NUMBER FROM THE TERMINAL AND PUSH ITS VALUE ONTO THE AESTK IF OP$ = "GETNUM" THEN PRINT " "; IF LEN(OLDINP$)=0 THEN INPUT X$ ELSE X$ = OLDINP$ END IF X = VAL(X$) REM TURN STRING INPUT INTO ASCII OF FIRST CHARACTER IF X$<>"0" AND X=0 THEN X=ASC(X$+" ") TOP(ARI) = TOP(ARI)+1 STK(ARI, TOP(ARI)) = X J = INSTR(X$,",") IF J>0 THEN OLDINP$ = MID$(X$,J+1,255) ELSE OLDINP$ = "" END IF VTAB = 0 END IF REM READ A STRING FROM THE TERMINAL AND STORE ITS VALUE IN A$ IF OP$ = "GETSTR" THEN PRINT " "; INPUT X$ X$ = LEFT$(X$,32) FOR X=1 TO LEN(X$) VAR(VARASTRING+X-1) = ASC(MID$(X$,X,1)) NEXT X VAR(VARASTRING+X-1)=0 REM PRINT OP$ VTAB = 0 END IF REM TEST VALUE AT THE TOP OF THE AE STACK TO BE WITHIN RANGE. IF NOT, REPORT AN ERROR. IF SO, ATTEMPT TO POSITION CURSOR AT THAT LINE. IF IT EXISTS, BEGIN INTERPRETATION THERE; IF NOT REPORT AN ERROR. IF OP$ = "GOTOP" THEN BC = STK(ARI, TOP(ARI))-1 TOP(ARI) = TOP(ARI)-1 GOSUB NEXTLINE GOSUB NEXTSTATEMENT REM WILL ACTUALLY SKIP TO NEXT HIGHER LINE NUMBER IF IT DOESN'T EXIST END IF REM REPLACE TOP OF STACK BY VARIABLE VALUE IT INDEXES. IF OP$ = "IND" THEN STK(ARI, TOP(ARI)) = VAR(STK(ARI, TOP(ARI))) END IF REM PERFORM GLOBAL INITIALIZATION. CLEARS PROGRAM AREA, EMPTIES GOSUB STACK, ETC. IF OP$ = "INITW" THEN GOSUB INITW END IF REM INITIALIZE VARIABLES (ADDED COMMAND) IF OP$ = "INITV" THEN FOR V = 0 TO 255 VAR(V) = 0 NEXT V END IF REM PERFORM INITIALIZATION FOR EACH STATED EXECUTION. EMPTIES STACKS. IF OP$ = "INITS" THEN TOP(ARI) = 0 TOP(BSC) = 0 END IF REM INSERT LINE AFTER DELETING ANY LINE WITH SAME LINE NUMBER. IF OP$ = "INSERT" THEN BASIC$(VAL(INP$)) = "" END IF REM CONTINUE EXECUTION OF IL AT THE LINE SPECIFIED. IF OP$ = "JUMP" THEN DI = RAM(IC) REM PRINT "JUMP "+DI END IF REM CONTINUE EXECUTION OF IL AT THE LINE SPECIFIED, IF TOP OF STACK IS FALSE. IF OP$ = "JUMPF" THEN REM PRINT "JUMPF "+STK(ARI, TOP(ARI)) IF STK(ARI, TOP(ARI))=0 THEN DI = RAM(IC) ELSE IC = IC+1 END IF TOP(ARI) = TOP(ARI)-1 REM PRINT "JUMPF "+DI END IF REM LIST THE CONTENTS OF THE PROGRAM AREA. IF OP$ = "LIST" THEN FOR X = 1 TO 255 IF LEN(BASIC$(X))>0 THEN S$ = BASIC$(X) GOSUB EXPANDTOKENS PRINT LEFT$(" ",3-LEN(STR$(X)))+X+T$ END IF NEXT X END IF REM BIT OF A CHEAT BUT AVOIDS NEED FOR MEMORY MANAGEMENT. REM WRITE THE CONTENTS OF THE PROGRAM AREA. IF OP$ = "LLST" THEN WRITE DIM BASIC$,1 END IF REM USED TO ADD PROGRAMS TO THE LIBRARY. REM REPLACE TOP TWO ELEMENTS OF AESTK BY THEIR REMAINDER. IF OP$ = "MOD" THEN TOP(ARI) = TOP(ARI)-1 STK(ARI, TOP(ARI)) = INT(STK(ARI, TOP(ARI)) MOD STK(ARI, TOP(ARI)+1)) END IF REM REPLACE TOP TWO ELEMENTS OF AESTK BY THEIR PRODUCT. IF OP$ = "MUL" THEN TOP(ARI) = TOP(ARI)-1 STK(ARI, TOP(ARI)) = STK(ARI, TOP(ARI))*STK(ARI, TOP(ARI)+1) END IF REM IF THE PRESENT MODE IS DIRECT (LINE NUMBER ZERO), THEN RETURN TO LINE COLLECTION. OTHERWISE, SELECT THE NEXT LINE AND BEGIN INTERPRETATION. REM MODIFIED TO PASS IN LABEL TO JUMP TO IF OP$ = "NEXT" THEN IF BC>0 THEN GOSUB TRIM IF LEFT$(INP$,1)=":" THEN PRINT "SEPARATOR: "+INP$ INP$ = MID$(INP$,2,255) GOSUB TRIM IC = IC+1 ELSE GOSUB NEXTLINE GOSUB NEXTSTATEMENT END IF ELSE GOSUB NEXTSTATEMENT END IF END IF REM OUTPUT CRLF TO PRINTER. IF OP$ = "NLINE" THEN PRINT VTAB = 0 END IF REM OUTPUT CRLF TO PRINTER. IF OP$ = "NOP" THEN PRINT "NOP" END IF REM REPLACE CURRENT LINE NUMBER WITH VALUE ON SBRSTK. IF STACK IS EMPTY, REPORT ERROR. IF OP$ = "POPC" THEN IF TOP(BSC) = 0 THEN PRINT "HOW? "+RAM(IC-1)+"@"+BC ELSE BC = STK(BSC, TOP(BSC)) TOP(BSC) = TOP(BSC)-1 REM PRINT "CALL STACK: "+TOP(BSC)+" DEEP" END IF END IF REM PUSH A LITERAL ONTO THE AESTK IF OP$ = "PUSH" THEN TOP(ARI) = TOP(ARI)+1 STK(ARI, TOP(ARI)) = RAM(IC) IC = IC+1 END IF REM PUSH A BYTE FROM THE BASIC TEXT ONTO THE AESTK IF OP$ = "PUSHB" THEN REM PUSH ONTO ARITHMETIC STACK TOP(ARI) = TOP(ARI)+1 STK(ARI, TOP(ARI)) = ASC(LEFT$(INP$,1)) INP$ = MID$(INP$,2,255) END IF REM PUSH PRESENT LINE NUMBER ON SBRSTK. REPORT OVERFLOW AS ERROR. IF OP$ = "PUSHC" THEN IF TOP(BSC)<16 THEN TOP(BSC) = TOP(BSC)+1 STK(BSC, TOP(BSC)) = BC REM OR BC-1? ELSE PRINT "SORRY. "+RAM(IC-1)+"@"+BC END IF END IF REM PRINT BYTE OBTAINED BY POPPING THE TOP OF THE EXPRESSION STACK. IF OP$ = "PUTCHR" THEN PRINT CHR$(STK(ARI, TOP(ARI))); VTAB = VTAB+1 IF VTAB=32 THEN VTAB=0 TOP(ARI) = TOP(ARI)-1 END IF REM PRINT NUMBER OBTAINED BY POPPING THE TOP OF THE EXPRESSION STACK. IF OP$ = "PUTNUM" THEN IF LEN(STK(ARI, TOP(ARI)))+VTAB>31 THEN PRINT VTAB = LEN(STK(ARI, TOP(ARI))) ELSE VTAB = LEN(STK(ARI, TOP(ARI)))+VTAB END IF PRINT STK(ARI, TOP(ARI)); TOP(ARI) = TOP(ARI)-1 END IF PUTSTR: REM PRINT CHARACTERS FROM THE BASIC TEXT UP TO BUT NOT INCLUDING THE CLOSING QUOTE MARK. IF A CR IS FOUND IN THE PROGRAM TEXT, REPORT AN ERROR. MOVE THE CURSOR TO THE POINT FOLLOWING THE CLOSING QUOTE. IF OP$ = "PUTSTR" THEN L = INSTR(INP$+CHR$(34), CHR$(34)) S$ = LEFT$(INP$, L-1) INP$ = MID$(INP$, L+1, 255) IF LEN(S$)+VTAB<=31 THEN PRINT S$; VTAB = VTAB+LEN(S$) ELSE REPEAT J=INSTR(S$+" "," ") T$=LEFT$(S$,J-1) S$=MID$(S$,J+1,255) IF LEN(T$)+VTAB>32 THEN PRINT VTAB=0 END IF PRINT T$; VTAB = VTAB+LEN(T$) IF VTAB<31 THEN PRINT " "; VTAB = VTAB+1 ELSE IF VTAB>=32 THEN VTAB = VTAB-32 END IF UNTIL LEN(S$)=0 END IF END IF REM PUSH A RANDOM NUMBER ONTO THE AESTK IF OP$ = "RND" THEN STK(ARI, TOP(ARI)) = INT(RND*STK(ARI, TOP(ARI))+1) REM PRINT "RND = "+STK(ARI, TOP(ARI)) END IF REM PUSH A LITERAL ONTO THE AESTK AND THEN RETURN IF OP$ = "RTNS" THEN TOP(ARI) = TOP(ARI)+1 STK(ARI, TOP(ARI)) = RAM(IC) IC = IC+1 END IF REM RETURN TO THE IL LOCATION SPECIFIED BY THE TOP OF THE CONTROL STACK. IF LEFT$(OP$,3) = "RTN" THEN DI = STK(ILC, TOP(ILC)) TOP(ILC) = TOP(ILC)-1 END IF REM PLACE THE VALUE AT THE TOP OF THE AESTK INTO THE VARIABLE DESIGNATED BY THE INDEX SPECIFIED BY THE VALUE IMMEDIATELY BELOW IT. DELETE BOTH FROM THE STACK. IF OP$ = "STORE" THEN VAR(STK(ARI, TOP(ARI)-1)) = STK(ARI, TOP(ARI)) TOP(ARI) = TOP(ARI)-2 END IF REM REPLACE TOP TWO ELEMENTS OF AESTK BY THEIR DIFFERENCE. SUBTRACT: IF OP$ = "SUB" THEN TOP(ARI) = TOP(ARI)-1 REM PRINT STK(ARI, TOP(ARI)) + "-" + STK(ARI, TOP(ARI)+1) STK(ARI, TOP(ARI)) = STK(ARI, TOP(ARI)) - STK(ARI, TOP(ARI)+1) END IF REM DELETE LEADING BLANKS. IF STRING MATCHES THE BASIC LINE, ADVANCE CURSOR OVER THE MATCHED STRING AND EXECUTE THE NEXT IL INSTRUCTION IF A MATCH FAILS, EXECUTE THE IL INSTRUCTION AT THE LABLED LBL. IF OP$ = "TEST" THEN DI = RAM(IC) IC = IC+1 L = RAM(IC) REM PRINT "LEN = "+L+": "; GOSUB TRIM FOR X = 1 TO L REM PRINT CHR$(RAM(IC+X)); IF RAM(IC+X)<>ASC(MID$(INP$+"@",X,1)) THEN EXIT END IF NEXT X IF X>L THEN INP$ = MID$(INP$,X,255) DI = IC+X REM PRINT "!" ELSE REM PRINT END IF END IF REM DELETE LEADING BLANKS. IF BYTE MATCHES THE BASIC LINE, ADVANCE CURSOR AND EXECUTE THE NEXT IL INSTRUCTION IF A MATCH FAILS, EXECUTE THE IL INSTRUCTION AT THE LABLED LBL. IF OP$ = "TESTB" THEN GOSUB TRIM REM PRINT RAM(IC+1)+" "+LEN(INP$) REM +" "+ASC(INP$)+": "+INP$ IF LEN(INP$)=0 THEN DI = RAM(IC) ELSE IF RAM(IC+1) = ASC(INP$) THEN INP$ = MID$(INP$,2,255) DI = IC+2 REM PRINT "!" ELSE REM PRINT DI = RAM(IC) END IF END IF REM TESTE - TEST FOR END OF LINE IF OP$ = "TESTE" THEN GOSUB TRIM REM PRINT "(TESTE = "+LEN(INP$)+")"; IF LEN(INP$)=0 THEN DI = IC+1 ELSE DI = RAM(IC) END IF END IF REM AFTER EDITING LEADING BLANKS, LOOK FOR A LINE NUMBER. REPORT ERROR IF INVALID; TRANSFER TO LBL IF NOT PRESENT. IF OP$ = "TESTL" THEN GOSUB TRIM IF INP$<"0" OR INP$>"99" THEN DI = RAM(IC) ELSE IF VAL(INP$)>255 THEN PRINT "SORRY." IC = IC+1 END IF END IF REM TEST FOR NUMBER. IF PRESENT, PLACE ITS VALUE ONTO THE AESTK AND CONTINUE EXECUTION AT NEXT SUGGESTED LOCATION. OTHERWISE CONTINUE AT LBL. IF OP$ = "TESTN" THEN GOSUB TRIM FOR X = 1 TO LEN(INP$) IF MID$(INP$,X,1)<"0" OR MID$(INP$,X,1)>"9" THEN EXIT NEXT X IF X = 1 THEN DI = RAM(IC) ELSE I = VAL(INP$) IF I<-32768 OR I>32767 THEN PRINT "SORRY.." I = 32767*SGN(I) END IF TOP(ARI) = TOP(ARI)+1 STK(ARI, TOP(ARI)) = I INP$ = MID$(INP$, X, 255) IC = IC+1 END IF END IF REM TEST FOR RELOP. IF PRESENT, PLACE ITS VALUE ONTO THE AESTK AND CONTINUE EXECUTION AT NEXT SUGGESTED LOCATION. OTHERWISE CONTINUE AT LBL. IF OP$ = "TESTR" THEN GOSUB TRIM I = 0 FOR X = 1 TO LEN(INP$) IF MID$(INP$,X,1)<"<" OR MID$(INP$,X,1)>">" THEN EXIT ELSE IF MID$(INP$,X,1)=">" THEN I = I OR 4 ELSE I = I OR (ASC(MID$(INP$,X,1))-ASC("<")+1) END IF END IF NEXT X IF X = 1 THEN DI = RAM(IC) ELSE TOP(ARI) = TOP(ARI)+1 STK(ARI, TOP(ARI)) = I INP$ = MID$(INP$, X, 255) IC = IC+1 END IF END IF REM TEST FOR VARIABLE (I.E LETTER) IF PRESENT. PLACE ITS INDEX VALUE ONTO THE AESTK AND CONTINUE EXECUTION AT NEXT SUGGESTED LOCATION. OTHERWISE CONTINUE AT LBL. IF OP$ = "TESTV" THEN GOSUB TRIM IF INP$<"A" OR LEFT$(INP$,1)>"Z" THEN DI = RAM(IC) ELSE REM PUSH ONTO ARITHMETIC STACK TOP(ARI) = TOP(ARI)+1 STK(ARI, TOP(ARI)) = ASC(LEFT$(INP$,1))-65+VARA INP$ = MID$(INP$,2,255) IF LEFT$(INP$,1)="$" THEN INP$ = MID$(INP$,2,255) STK(ARI, TOP(ARI)) = STK(ARI, TOP(ARI))-26 IF STK(ARI, TOP(ARI)) = VARSTRINGS THEN STK(ARI, TOP(ARI)) = VARASTRING END IF IC = IC+1 END IF END IF RETURN INITW: TOP(ARI) = 0 TOP(BSC) = 0 BC = 0 TOP(ILC) = 0 FOR B = 0 TO 255 BASIC$(B) = "" NEXT B FOR V = 1 TO 26 VAR(V) = 0 NEXT V REM PRELOAD PROGRAM LISTING: PRINT "SELECT PROGRAM TO LOAD:" PRINT "B)AGELS" PRINT "H)URKLE" PRINT "SNARK)" PRINT "N)UMBER" PRINT "S)TARS" PRINT "T)RAP" INPUT S$ PGM=ASC(S$) IF PGM=ASC("B") THEN RESTORE BAGELS ELSE IF PGM=ASC("H") THEN RESTORE HURKLE ELSE IF PGM=ASC("K") THEN RESTORE SNARK ELSE IF PGM=ASC("N") THEN RESTORE NUMBER ELSE IF PGM=ASC("S") THEN RESTORE STARS ELSE IF PGM=ASC("T") THEN RESTORE TRAP ELSE IF PGM=ASC("Z") THEN RESTORE ZTEST END IF REPEAT READ S$ GOSUB TOKENIZE UNTIL VAL(S$)=255 PRINT "OK." RETURN TRIM: WHILE LEFT$(INP$,1)=" " AND LEN(INP$)>0 INP$ = MID$(INP$, 2, 255) WEND RETURN EXPANDTOKENS: T$ = "" FOR Y=1 TO LEN(S$) IF ASC(MID$(S$,Y,1))<32 THEN T$ = T$ + TKN$(ASC(MID$(S$,Y,1)))+" " ELSE T$ = T$ + MID$(S$,Y,1) END IF NEXT Y RETURN ENTOKEN: REM REPLACE ' WITH " FOR J = 1 TO LEN(S$) IF MID$(S$,J,1)="'" THEN MID$(S$,J,1)=CHR$(34) NEXT J REM REPLACE "" WITH ' WHILE INSTR(S$,CHR$(34)+CHR$(34))>0 J=INSTR(S$,CHR$(34)+CHR$(34)) S$=LEFT$(S$,J-1)+"'"+MID$(S$,J+2,255) WEND B = TRUE FOR X = 0 TO TKNMAX FOR J = 1 TO LEN(S$) IF MID$(S$,J,LEN(TKN$(X)))=TKN$(X) AND B THEN S$ = LEFT$(S$,J-1) + CHR$(X) + MID$(S$,J+LEN(TKN$(X))-(MID$(S$,J+LEN(TKN$(X)),1)=" "),255) END IF IF MID$(S$,J,1)=CHR$(34) THEN B = NOT B NEXT J NEXT X RETURN TOKENIZE: GOSUB ENTOKEN X = VAL(S$) BASIC$(X) = MID$(S$,INSTR(S$," "),255) RETURN NEXTLINE: IF BC>254 THEN BC=254 REPEAT BC = BC+1 UNTIL LEN(BASIC$(BC)) > 0 OR BC=255 IF LEN(BASIC$(BC)) = 0 THEN BC = 0 RETURN NEXTSTATEMENT: IF BC=0 THEN REM HARD-CODED JUMP :-( DI = 0 ELSE REM PRINT BASIC$(BC) IF LEN(OLDINP$)=0 THEN REM SKIP THE LINE NUMBER INP$ = MID$(BASIC$(BC),INSTR(BASIC$(BC)," ")+1,255) ELSE INP$ = OLDINP$ OLDINP$ = "" END IF REM NEEDS TO BE SMARTER ABOUT : IN QUOTES J = INSTR(INP$,":") IF J>0 THEN OLDINP$ = MID$(INP$,J+1,255) INP$ = LEFT$(INP$,J-1) BC = BC-1 END IF GOSUB TRIM REM PRINT INP$ DI = RAM(IC) END IF RETURN END IL: DATA ";THE IL CONTROL SECTION" DATA "PRMT: GETLINE ;PROMPT AND GET LINE" DATA " TESTL EXEC ;TEST FOR LINE NUM" DATA " INSERT ;INSERT/DEL LINE" DATA " JUMP PRMT" DATA ";" DATA ";STATEMENT EXECUTOR" DATA "EXEC: INITS ;RESET STACKS" DATA "STMT: TESTB @L,GOTO ;LET" DATA "LET1: TESTV SYN ;YES, PLACE VAR ADDRESS ON AESTK" DATA " TESTB '(',LET2" DATA " DROP ;REMOVE VAR A FROM STACK" DATA " CALL RELN" DATA " TESTB ')',SYN" DATA "LET2: TESTB '=',SYN" DATA " CALL RELN ;PUSH VALUE" DATA " STORE ;POP AND STORE IN VAR" DATA " TESTB ',',LET3 ;MORE?" DATA " JUMP LET1" DATA "LET3: NEXT STMT ;SEQUENCE TO NEXT" DATA "GOTO: TESTB @G,GOSB ;GOTO" DATA " CALL RELN ;PUSH LINE #" DATA " GOTOP STMT ;POP AND JUMP" DATA "GOSB: TESTB @S,PRNT" DATA " CALL RELN ;GET DESTINATION" DATA " PUSHC ;SAVE RETURN LINE" DATA " GOTOP STMT ;AND JUMP" PRNT: DATA "PRNT: TESTB @P,IF ;PRINT" DATA "PQUO: TESTB ''',PCHR ;TEST FOR QUOTE" DATA " PUTSTR ;PRINT STRING" DATA " JUMP PSEM" DATA "PCHR: TESTB @H,PEND ;TEST FOR CHR$(" DATA " CALL RELN" DATA " PUTCHR" DATA " TESTB ')',SYN" DATA " JUMP PSEM" DATA "PEND: TESTE PNUM ;END OF LINE?" DATA " JUMP PNLN" DATA "PNUM: CALL RELN" DATA " PUTNUM ;PRINT IT" DATA "PSEM: TESTB ';',PNLN ; MORE?" DATA " TESTE PQUO ;END OF LINE?" DATA " NEXT STMT" DATA "PNLN: NLINE" DATA "NXT: NEXT STMT" DATA "IF: TESTB @J,INPT ;IF STATEMENT" DATA " CALL RELN ;GET CONDITION" DATA " JUMPF NXT ;JUMP IF FALSE" DATA " JUMP STMT" DATA "INPT: TESTB @I,RETN ;INPUT" DATA " TESTB ''',INPV ;TEST FOR QUOTE" DATA " PUTSTR ;PRINT STRING" DATA " TESTB ';',INPV ;OPTIONAL" DATA "INPV: TESTV SYN ;PUSH VAR ADDRESS ON AESTK" DATA " DUP" DATA " PUSH 173" DATA " SUB" DATA " JUMPF INPS ;INPUT A$" DATA "INPN: GETNUM ;PUSH # FROM TTY" DATA " STORE ;STORE IT" DATA " TESTB ',',INPX ;ANOTHER VAR?" DATA " JUMP INPV" DATA "INPS: GETSTR" DATA "INPX: NEXT STMT ;SEQUENCE TO NEXT" DATA "RETN: TESTB @V,FOR ;RETURN STATEMENT" DATA " POPC ;RESTORE LINE NUMBER OF CALL" DATA " NEXT STMT ;SEQUENCE TO NEXT STATEMENT" DATA "FOR: TESTB @F,NEXT" DATA " TESTV SYN ;PUSH VAR" DATA " TESTB '=',SYN" DATA " CALL RELN ;PUSH EXPR" DATA " STORE ;STORE RESULT" DATA " TESTB @T,SYN ;TO" DATA " PUSH 0 ;END CONDITION VAR" DATA " CALL RELN ;PUSH EXPR" DATA " STORE ;SAVE ENS CONDITIO " DATA " PUSHC ;SAVE LINE TO RETURN TO" DATA " NEXT STMT" DATA "NEXT: TESTB @X,DO" DATA " TESTV SYN ;V%" DATA " DUP ;V% V%" DATA " DUP ;V% V% V%" DATA " IND ;V% V% V" DATA " PUSH 1 ;V% V% V 1" DATA " ADD ;V% V% V+1" DATA " STORE ;V%" DATA " IND ;V" DATA " PUSH 4 ;V >" DATA " PUSH 0 ;V > 0" DATA " IND ;V > 0% END CONDITION" DATA " CMPS ;FL" DATA " JUMPF LOOP ;ITERATE" REM DATA " NOP" DATA " JUMP DEND ;END LOOP" DATA "DO: TESTB @D,UNTL" DATA " PUSHC ;SAVE RETURN LINE" DATA " NEXT STMT" DATA "UNTL: TESTB @U,WHIL" DATA " CALL RELN ;GET COMPARISON" DATA " JUMPF LOOP ;LOOP IF FALSE" DATA " JUMP DEND ;END DO" DATA "WHIL: TESTB @W,LIST" DATA " CALL RELN ;GET COMPARISON" DATA " JUMPF DEND ;JUMP IF FALSE" DATA "LOOP: DUPC ;DUPLICATE CALL" DATA " POPC ;RESTORE LINE AFTER FOR/DO" DATA " NEXT STMT ;SEQUENCE TO NEXT STATEMENT" DATA "DEND: DROPC ;NEED TO DROP CALL" REM DATA " NOP" DATA " NEXT STMT" DATA "LIST: TESTB @M,REM ;LIST COMMAND" DATA " LIST" DATA " NEXT STMT" DATA "REM: TESTB @R,RUN" DATA " NEXT STMT" DATA "RUN: TESTB @N,NEW ;RUN COMMAND" DATA " INITV ;CLEAR VARS" DATA " PUSH 1 ; NEED TO TRANSFER TO FIRST LINE" DATA " GOTOP STMT ;" DATA "NEW: TESTB @Q,END ;NEW COMMAND" DATA " INITW ;RE-INITIALIZE" DATA " JUMP PRMT" DATA "END: TESTB @E,SYN" DATA " FIN PRMT" DATA "SYN: ERR PRMT ;SYNTAX ERROR" DATA "RELN: CALL EXPR" DATA " TESTR RRTN ;<,<=,=,>=,=,<>" DATA " CALL EXPR" DATA " CMPS ;COMPARE AND PUSH" DATA "RRTN: RTN" DATA "EXPR: CALL TERM" DATA "EPLS: TESTB '+',EMNS ;LEADING TERM" DATA " CALL TERM" DATA " ADD" DATA " JUMP EPLS" DATA "EMNS: TESTB '-',RRTN ;ANY MORE?" DATA " CALL TERM ;DIFFERENCE TERM" DATA " SUB" DATA " JUMP EPLS" DATA "TERM: CALL FACT" DATA "TMUL: TESTB '*',TDIV" DATA " CALL FACT ;PRODUCT FACTOR." DATA " MUL" DATA " JUMP TMUL" DATA "TDIV: TESTB '/',TMOD" DATA " CALL FACT ;QUOTIENT FACTOR." DATA " DIV" DATA " JUMP TMUL" DATA "TMOD: TESTB '%',RRTN" DATA " CALL FACT ;QUOTIENT FACTOR." DATA " MOD" DATA " JUMP TMUL" DATA "FACT: TESTB @O,FCHR ;RND(" DATA " CALL RELN ;" DATA " TESTB ')',SYN ;" DATA " RND ;" DATA " RTN ;" DATA "FCHR: TESTB @H,FASC ;CHR$(" DATA "FFUN: CALL RELN " DATA " TESTB ')',SYN " DATA " RTN " DATA "FASC: TESTB @K,FV ;ASC(" DATA " JUMP FFUN " DATA "FV: TESTV FNUM " DATA " TESTB '(',FVB" DATA " DROP ;NEED TO DROP V FROM STACK" DATA " CALL RELN " DATA " TESTB ')',SYN " DATA "FVB: IND ;YES, GET THE VALUE." DATA " RTN" DATA "FNUM: TESTN FPRN ;PUSH NUMBER." DATA " RTN" DATA "FPRN: TESTB '(',FQUO ;PARENTHESIZED EXPR." DATA " CALL RELN" DATA " TESTB ')',SYN" DATA " RTN" DATA "FQUO: TESTB ''',SYN" DATA " PUSHB" DATA " TESTB ''',SYN" DATA " RTN" DATA "EOF:" BAGELS: DATA "1 PRINT 'BAGELS'" DATA "2 REM 'CREATIVE COMPUTING MORRISTOWN, NEW JERSEY':PRINT:PRINT" DATA "3 REM *** BAGLES NUMBER GUESSING GAME" DATA "4 REM *** ORIGINAL SOURCE UNKNOWN BUT SUSPECTED TO BE" DATA "5 REM *** LAWRENCE HALL OF SCIENCE, U.C. BERKELY" DATA "6 LET Y=0,T=255" DATA "7 PRINT:PRINT:PRINT" DATA "8 INPUT 'WOULD YOU LIKE THE RULES?';A$" DATA "9 IF A$='N' GOTO 25" DATA "10 PRINT:PRINT 'I AM THINKING OF A THREE-DIGIT" DATA "12 PRINT 'NUMBER. TRY TO GUESS MY NUMBER'" DATA "14 PRINT 'AND I WILL GIVE YOU CLUES'" DATA "15 PRINT 'AS FOLLOWS'" DATA "16 PRINT ' PICO - ONE DIGIT CORRECT BUT IN THE WRONG POSITION'" DATA "18 PRINT ' FERMI - ONE DIGIT CORRECT AND IN THE RIGHT POSITION'" DATA "20 PRINT ' BAGELS - NO DIGITS CORRECT'" DATA "25 DO" DATA "30 FOR J = 1 TO 3" DATA "35 LET A(J)=RND(10)-1" DATA "40 NEXT J" DATA "45 LOOP UNTIL (A(1)<>A(2))*(A(2)<>A(3))*(A(1)<>A(3))" DATA "50 PRINT:PRINT 'O.K. I HAVE A NUMBER IN MIND.'" DATA "55 PRINT 'THE NUMBER I HAVE IN MIND'" DATA "60 PRINT 'HAS NO TWO DIGITS THE SAME.'" DATA "65 LET I=0" DATA "70 DO" DATA "75 LET I=I+1" DATA "80 PRINT 'GUESS #';I;'?';" DATA "85 INPUT A$" DATA "89 REM STRING STORED IN ARRAY" DATA "90 LET V=172" DATA "95 FOR J=V+1 TO V+3" DATA "96 LET A(J)=A(J)-48" DATA "97 NEXT J" DATA "100 LET P=0,F=0" DATA "105 IF A(1)=A(V+2) LET P=P+1" DATA "110 IF A(1)=A(V+3) LET P=P+1" DATA "115 IF A(2)=A(V+1) LET P=P+1" DATA "120 IF A(2)=A(V+3) LET P=P+1" DATA "125 IF A(3)=A(V+1) LET P=P+1" DATA "130 IF A(3)=A(V+2) LET P=P+1" DATA "135 FOR J=1 TO 3" DATA "140 IF A(J)=A(V+J) LET F=F+1" DATA "145 NEXT J" DATA "150 IF P=0 GOTO 170" DATA "155 FOR J=1 TO P" DATA "160 PRINT 'PICO ';" DATA "165 NEXT J" DATA "170 IF F=0 GOTO 190" DATA "175 FOR J=1 TO F" DATA "180 PRINT 'FERMI ';" DATA "185 NEXT J" DATA "190 IF P+F=0 PRINT 'BAGELS';" DATA "195 PRINT" DATA "200 LOOP UNTIL (F=3)+(I=20)" DATA "205 IF F=3 GOTO 225" DATA "210 PRINT 'OH WELL.'" DATA "215 PRINT 'THAT''S TWENTY GUESSES. MY NUMBER WAS';100*A(1)+10*A(2)+A(3)" DATA "220 GOTO 235" DATA "225 PRINT 'YOU GOT IT!!!':PRINT" DATA "230 LET S=S+1" DATA "235 INPUT 'PLAY AGAIN?';A$" DATA "240 IF A$='Y' GOTO 25" DATA "245 IF S PRINT 'A ';S;'-POINT BAGELS BUFF!!'" DATA "250 PRINT 'HOPE YOU HAD FUN. BYE.'" DATA "255 END" REM HAVE A$ START AT BEGINNKNG? GUESS: HURKLE: DATA "10 PRINT 'HURKLE':PRINT 'BY BOB ALBRECHT':PRINT" DATA "20 LET N=5,G=10" DATA "30 PRINT 'A HURKLE IS HIDING ON A ';G;' BY '" DATA "35 PRINT G;' GRID. HOMEBASE ON THE GRID'" DATA "40 PRINT 'IS POINT 0,0 IN THE SOUTHWEST'" DATA "45 PRINT 'CORNER, AND ANY POINT ON THE'" DATA "46 PRINT 'GRID IS DESIGNATED BY A PAIR'" DATA "47 PRINT 'OF WHOLE NUMBERS SEPARATED BY A'" DATA "50 PRINT 'COMMA. THE FIRST NUMBER IS THE'" DATA "55 PRINT 'HORIZONTAL POSITION AND THE'" DATA "60 PRINT 'SECOND NUMBER IS THE VERTICAL'" DATA "65 PRINT 'POSITION. YOU MUST TRY TO GUESS" DATA "66 PRINT 'THE HURKLE''S GRIDPOINT. YOU GET'" DATA "67 PRINT N;' TRIES. AFTER EACH TRY, I WILL'" DATA "70 PRINT 'TELL YOU THE APPROXIMATE '" DATA "73 PRINT 'DIRECTION TO GO TO LOOK FOR THE'" DATA "74 PRINT 'HURKLE.'" DATA "75 PRINT" DATA "100 DO" DATA "110 LET A=RND(G),B=RND(G),K=0" REM DATA "115 PRINT A;',';B" DATA "120 DO" DATA "125 LET K=K+1" DATA "130 PRINT 'GUESS #';K;'?';" DATA "135 INPUT X,Y" DATA "140 IF (X<>A)+(Y<>B) PRINT 'GO ';" DATA "150 IF Y>B PRINT 'SOUTH';" DATA "152 IF YA PRINT 'WEST';" DATA "156 IF X=N)+((X=A)*(Y=B))" DATA "180 LOOP UNTIL (K>=N)+((X=A)*(Y=B))" DATA "190 PRINT" DATA "200 IF (X<>A)+(Y<>B) PRINT 'SORRY, THAT''S ';N;' GUESSES." DATA "205 IF (X<>A)+(Y<>B) PRINT 'THE HURKLE IS AT ';A;',';B;'.'" DATA "210 IF ((X=A)*(Y=B)) PRINT 'YOU FOUND HIM IN ';K;' GUESSES!'" DATA "220 PRINT" DATA "230 PRINT 'LET''S PLAY AGAIN, HURKLE IS'" DATA "235 PRINT 'HIDING.'" DATA "240 LOOP WHILE 1" DATA "255 END" NUMBER: DATA "1 PRINT 'NUMBER'" DATA "2 PRINT 'CREATIVE COMPUTING MORRISTOWN, NEW JERSEY'" DATA "3 PRINT:PRINT:PRINT" DATA "4 PRINT 'YOU HAVE 100 POINTS. BY GUESSING NUMBERS FROM 1 TO 5, YOU'" DATA "5 PRINT 'CAN GAIN OR LOSE POINTS DEPENDING UPON HOW CLOSE YOU GET TO'" DATA "6 PRINT 'A RANDOM NUMBER SELECTED BY THE COMPUTER.': PRINT" DATA "7 PRINT 'YOU OCCASIONALLY WILL GET A JACKPOT WHICH WILL DOUBLE(!)'" DATA "8 PRINT 'YOUR POINT COUNT. YOU WIN WHEN YOU GET 250 POINTS.'" DATA "9 PRINT: LET P=50" DATA "12 INPUT 'GUESS A NUMBER FROM 1 TO 5?';G" DATA "15 LET R=RND(5)" DATA "16 LET S=RND(5)" DATA "17 LET T=RND(5)" DATA "18 LET U=RND(5)" DATA "19 LET V=RND(5)" DATA "20 IF G=R GOTO 30" DATA "21 IF G=S GOTO 40" DATA "22 IF G=T GOTO 50" DATA "23 IF G=U GOTO 60" DATA "24 IF G=V GOTO 70" DATA "25 IF G>5 GOTO 12" DATA "30 IF P>=5 LET P=P-5" DATA "35 GOTO 80" DATA "40 LET P=P+5" DATA "45 GOTO 80" DATA "50 LET P=P+(P<127)*P/2+(P>=127)*(255-P)" DATA "53 PRINT 'YOU HIT THE JACKPOT!!!'" DATA "55 GOTO 80" DATA "60 LET P=P+1" DATA "65 GOTO 80" DATA "70 LET P=P/2" DATA "80 IF P>200 THEN 90" DATA "82 PRINT 'YOU HAVE ';P;' POINTS.':PRINT" DATA "85 GOTO 12" DATA "90 PRINT '!!!!YOU WIN!!!! WITH ';P;' POINTS.'" DATA "255 END" SNARK: DATA "3 PRINT ' *** SNARK *** CATCH HIM WITH A WELL PLACED CIRCLE'" DATA "6 PRINT ' *** PEOPLE''S COMPUTER COMPANY, MENLO PARK CA &J&J'" DATA "9 INPUT 'WANT THE RULES ?';A$" DATA "12 IF A$='N' GOTO 410" DATA "15 PRINT" DATA "18 PRINT 'A SNARK IS HIDING IN A 10 BY 10 GRID LIKE THE ONE SHOWN BELOW'" DATA "21 PRINT" DATA "24 PRINT ' Y'" DATA "27 FOR Y=0 TO 9" DATA "30 PRINT (9-Y);' . . . . . . . . . .'" DATA "33 NEXT Y" DATA "36 PRINT ' X 0 1 2 3 4 5 6 7 8 9 .... '" DATA "39 INPUT 'HIT ENTER TO CONTINUE';A$" DATA "42 PRINT " DATA "45 PRINT 'TRY TO CATCH HIM. HERE''S HOW ... WHEN I ASK, YOU TYPE'" DATA "48 PRINT 'THE X,Y COORDINATES OF A GRIDPOINT (IF YOU DON''T KNOW'" DATA "51 PRINT 'WHAT THAT MEANS, ASK SOMEONE) AND PRESS THE RETURN KEY.'" DATA "54 PRINT 'THEN, WHEN I ASK FOR ''RADIUS'', YOU TYPE THE RADIUS'" DATA "57 PRINT 'OF A CIRCLE CENTERED ON THE GRIDPOINT WHOSE X,Y'" DATA "60 PRINT 'COORDINATES YOU JUST ENTERED. I WILL THEN TELL YOU'" DATA "63 PRINT 'WHETHER THE SNARK IS ''INSIDE'' YOUR CIRCLE, ''OUTSIDE'' '" DATA "66 PRINT 'YOUR CIRCLE, OR ''ON'' YOUR CIRCLE.'" DATA "69 PRINT " DATA "72 PRINT '***IMPORTANT***IF YOU THINK YOU KNOW WHERE HE IS'" DATA "75 PRINT 'HIDING, ENTER 0 (ZERO) AS THE RADIUS. GOOD HUNTING.'" DATA "78 REM *** HIDE THE SNARK" DATA "81 LET X=RND(10),Y=RND(10)" DATA "87 PRINT " DATA "90 PRINT 'THE SNARK IS HIDING ... START GUESSING.'" DATA "93 REM *** GUESSING BEGINS " DATA "96 LET K=1" DATA "99 PRINT" DATA "102 INPUT 'COORDINATES?';A,B" DATA "108 LET D=(X-A)*(X-A)+(Y-B)*(Y-B)" DATA "111 INPUT 'RADIUS?';R" DATA "114 IF R<>0 GOTO 120" DATA "117 IF D=0 GOTO 154" DATA "120 IF DR*R PRINT 'SNARK IS OUTSIDE YOUR CIRCLE.'" DATA "127 IF D=R*R PRINT 'SNARK IS ON YOUR CIRCLE.'" DATA "145 LET K=K+1" DATA "148 GOTO 102" DATA "151 REM *** WE GOT A WINNER" DATA "154 PRINT " DATA "157 PRINT 'YOU CAUGHT HIM IN ';K;' GUESSES.'" DATA "160 PRINT 'GOOD SHOW.'" DATA "163 INPUT 'WANT TO PLAY AGAIN ?';A$" DATA "166 IF A$='Y' GOTO 90" DATA "255 END" STARS: DATA "5 PRINT 'STARS'" DATA "10 PRINT 'PEOPLE''S COMPUTER CENTER, MENLO PARK, CA'" DATA "15 REM *** A IS LIMIT ON NUMBER, M IS NUMBER OF GUESSES" DATA "20 LET A=100,M=7" DATA "25 INPUT 'DO YOU WANT INSTRUCTIONS?';A$" DATA "30 IF A$='N' GOTO 75" DATA "35 REM *** INSTRUCTIONS ON HOW TO PLAY" DATA "40 PRINT 'I AM THINKING OF A WHOLE NUMBER FROM 1 TO ';A;'. ';" DATA "45 PRINT 'TRY TO GUESS MY NUMBER. AFTER YOU GUESS, I ';" DATA "50 PRINT 'WILL TYPE ONE OR MORE STARS (*). THE MORE ';" DATA "55 PRINT 'STARS I TYPE, THE CLOSER YOU ARE TO MY NUMBER. '" DATA "60 PRINT 'ONE STAR (*) MEANS FAR AWAY, SEVEN STARS (*******) ';" DATA "65 PRINT 'MEANS REALLY CLOSE! YOU GET ';M;' GUESSES.'" DATA "70 REM *** COMPUTER THINKS OF A NUMBER" DATA "75 PRINT:PRINT" DATA "80 LET X=RND(A),K=0" DATA "85 PRINT 'OK, I AM THINKING OF A NUMBER, START GUESSING.'" DATA "90 REM *** GUESSING BEGINS, HUMAN GETS M GUESSES" DATA "100 DO" DATA "105 LET K=K+1" DATA "110 PRINT:INPUT 'YOUR GUESS?';G" DATA "115 IF G>X LET D=G-X" DATA "120 IF G<=X LET D=X-G" DATA "125 PRINT '*';" DATA "130 IF D<64 PRINT '*';" DATA "135 IF D<32 PRINT '*';" DATA "140 IF D<16 PRINT '*';" DATA "145 IF D<8 PRINT '*';" DATA "150 IF D<4 PRINT '*';" DATA "155 IF D<2 PRINT '*';" DATA "160 LOOP UNTIL (D=0)+(K=M)" DATA "165 IF D=0 GOTO 185" DATA "170 PRINT:PRINT 'SORRY, THAT''S ';M;' GUESSES. THE NUMBER WAS ';X" DATA "175 GOTO 240" DATA "180 REM *** WE HAVE A WINNER" DATA "185 FOR N=1 TO 24" DATA "190 PRINT '*';" DATA "195 NEXT N" DATA "200 PRINT:PRINT" DATA "205 PRINT 'YOU GOT IT IN ';K;' GUESSES!!!'" DATA "240 INPUT 'PLAY AGAIN?';A$" DATA "245 IF A$='Y' GOTO 75" DATA "255 END" TRAP: DATA "1 PRINT 'TRAP'" DATA "2 PRINT 'CREATIVE COMPUTING MORRISTOWN, NEW JERSEY'" DATA "3 PRINT:PRINT:PRINT" DATA "4 LET G=6, N=100" DATA "5 REM-TRAP" DATA "6 REM-STEVE ULLMAN, 8-1-72" DATA "7 PRINT 'INSTRUCTIONS?';" DATA "8 INPUT Z$" DATA "9 IF Z$='N' GOTO 26" DATA "10 PRINT 'I AM THINKING OF A NUMBER BETWEEN 1 AND ';N;' ';" DATA "12 PRINT 'TRY TO GUESS MY NUMBER. ON EACH GUESS, ';" DATA "14 PRINT 'YOU ARE TO ENTER 2 NUMBERS, TRYING TO TRAP ';" DATA "16 PRINT 'MY NUMBER BETWEEN THE TWO NUMBERS. I WILL ';" DATA "18 PRINT 'TELL YOU IF YOU HAVE TRAPPED MY NUMBER, IF MY ';" DATA "19 PRINT 'NUMBER IS LARGER THAN YOUR TWO NUMBERS, OR IF ';" DATA "20 PRINT 'MY NUMBER IS SMALLER THAN YOUR TWO NUMBERS. ';" DATA "22 PRINT 'IF YOU WANT TO GUESS ONE SINGLE NUMBER, TYPE ';" DATA "24 PRINT 'YOUR GUESS FOR BOTH YOUR TRAP NUMBERS. ';" DATA "26 PRINT 'YOU GET ';G;' GUESSES TO GET MY NUMBER.'" DATA "28 LET X=RND(N)" DATA "30 FOR Q=1 TO G" DATA "32 PRINT " DATA "34 PRINT 'GUESS #';Q;'?';" DATA "36 INPUT A,B" DATA "38 IF (A=B)*(X=A) GOTO 56" DATA "40 IF A>B LET R=A,A=B,B=R" DATA "42 IF (A<=X)*(X<=B) PRINT 'YOU HAVE TRAPPED MY NUMBER.'" DATA "44 IF XA)*(X>B) PRINT 'MY NUMBER IS LARGER THAN YOUR TRAP NUMBERS.'" DATA "48 NEXT Q" DATA "50 PRINT 'SORRY, THAT''S ';G;' GUESSES. THE NUMBER WAS ';X" DATA "52 PRINT" DATA "56 IF (A=B)*(X=A) PRINT 'YOU GOT IT!!!'" DATA "58 PRINT " DATA "60 PRINT 'TRY AGAIN.'" DATA "62 PRINT" DATA "64 GOTO 26" DATA "255 END" ZTEST: DATA "255 END" REM CALL VAR HAD TO BE REPLACED REM MPY TO MUL REM LIT WASNT DOCUMENTED REM NEED TO REMEMBER LOCATION OF STMT LABEL REM NEED TO HARDCODE JUMP TO CON FOR ERR AND FOR REM CHANGED S17 TO SYN, ADDED TO DONE REM DELETED "END" AND FIN REM CHANGED "CLEAR" TO "NEW" REM REMOVE "DONE" REM REMOVE "SPC" (USEFUL FOR SCIENTIFIC PROGRAMMING RATHER THAN GAMES) REM "LIT B / RTN" BECOMES "RTNS" REM REMOVE "NEG" AND UNARY SIGN REM HAVE INPUT SUPPORT ONE VARIABLE REM INPUT MULTIPLE VARIABLES REM LET INPUT DISPLAY A LABEL TO SAVE A LINE REM ; DELIMETER REM ADDED COMMA TO LET REM PRINT REQUIRED AN ARGUMENT REM CANT NEST FOR LOOPS REM FOR LOOP END CONDITION EXPRESSION CALCULATED ONLY AT START OF THE LOOP