1 ! PILOT VERSION 1 EDIT 2 4/ 8/75 2 ! W$=RESIDENT ACCOUNT OF THE PILOT SERIES OF PROGRAMS FOR CHAINING 3 W$="" 4 IF E% THEN RETURN ELSE 80 5 !*******************************DEFINITION'S AND SUBROUTINES********** 6 ! ****BELOW EVALUTES THE SYNTAX OF ARITHMETIC EXPRESSIONS**** 7 DEF FND%(A$) 8 DIM C%(128) 9 M0%=71%:Q%=0% 11 ON ERROR GOTO 47:RESTORE 12 FOR B=1 TO M0% 13 READ Z$,Z% 14 DATA "ABS",1,"SGN",1,"INT",1,"FIX",1,"COS",1 15 DATA "COS",1,"SIN",1,"TAN",1,"ATN",1,"SQR",1 16 DATA "EXP",1,"LOG10",1,"LOG",1 17 DATA "RND",6,"PI",2,"==",3,"<=",3,"<>",3,">=",3 18 DATA "=",3,"<",3,">",3,"**",3,"*",3,"^",3,"/",3 19 DATA "A",2,"B",2,"C",2,"D",2,"E",2,"F",2,"G",2,"H",2 20 DATA "I",2,"J",2,"K",2,"L",2,"M",2,"N",2,"O",2,"P",2 21 DATA "Q",2,"R",2,"S",2,"T",2,"U",2,"V",2,"W",2,"X",2,"Y",2,"Z",2 22 DATA "0",7,"1",7,"2",7,"3",7,"4",7,"5",7,"6",7,"7",7 23 DATA "8",7,"9",7,"",7,".",7,".",7,".",7,"",2 24 DATA "(",4,")",5,"+",7,"-",7 26 X=INSTR(1,A$,Z$):IF X=0 THEN 28 27 A$=LEFT(A$,X-1)+CHR$(Z%)+RIGHT(A$,X+LEN(Z$)):GOTO 26 28 NEXT B 29 CHANGE A$ TO C% 30 FOR B=1 TO C%(0)-1% 31 X=C%(B):X4=C%(B+1):IF X<1 OR X>7 THEN 43 !EXPRESSION NO GOOD 32 ON X GOTO 33,34,35,36,37,38,39 33 IF X4<>4 THEN 43 ELSE 40 34 IF X4<>3 AND X4<>5 AND X4<>13 AND X4<>7 THEN 43 ELSE 40 35 X1=X4:IF X1<>1 AND X1<>2 AND X1<>4 AND X1<>6 AND X1<>7 THEN 43 ELSE 40 36 X2=X2+1:X1=X4: IF X1<>1 AND X1<>2 AND X1<>4 AND X1<>6 AND X1<>7 THEN 43 ELSE 40 37 X2=X2-1:X1=X4:IF X1<>3 AND X1<>5 AND X1<>7 AND X1<>13 THEN 43 ELSE 40 38 X1=X4: IF X1<>3 AND X1<>4 AND X1<>13 THEN 43 ELSE 40 39 X1=X4: IF X1<>1 AND X1<>2 AND X1<>4 AND X1<>6 AND X1<> 7 THEN 43 40 NEXT B 41 IF X2<>0 THEN 43 42 FND%=0%:GOTO 44 43 FND%=-1% 44 ON ERROR GOTO 1010:FNEND 47 IF ERR=52 THEN Q%=Q%+1%:IF Q%>10 THEN ON ERROR GOTO 0 ELSE RESUME 11 48 DEF FNA$(A$)=RIGHT(A$,LEN(A$)) !****RETURN'S LAST !****CHARACTER OF STRING******** 49 !**********RETURN'S A$ WITHOUT LINE TERMINATORS********* 50 DEF FNB$(A$):IF FNA$(A$)=CHR$(0) THEN A$=LEFT(A$,LEN(A$)-3) ELSE IF FNA$(A$)=CHR$(10) THEN A$=LEFT(A$,LEN(A$)-2) ELSE IF FNA$(A$)=CHR$(27) THEN A$=LEFT(A$,LEN(A$)-1):PRINT 51 FNB$=A$ 52 FNEND 53 !*********RETURN'S POSITION OF NEXT SPACE OR CR**************** 54 DEF FNB:X=INSTR(1,A$," "):X1=LEN(A$)+1:X=X1 IF X=0:FNB=X:FNEND 55 !***********RETURN STRING WITHOUT SPACES OR TAB'S********** 56 DEF FNC$(A$):R$(1)=" ":R$(2)=CHR$(9):Q=1 57 X=INSTR(1,A$,R$(Q)):IF X=0 THEN 58 ELSE A$=LEFT(A$,X-1)+RIGHT(A$,X+1):GOTO 57 58 Q=Q+1:IF Q=3 THEN 59 ELSE 57 59 FNC$=A$:FNEND 60 !************SUBROUTINE FOR 'PEGGING' PILOT STRINGS******* 61 C1$="" !GIVE IT AN INITIAL VALUE 62 A$=RIGHT(A$,2):A1$=LEFT(A$,1) !THE FIRST CHRACTER OF A$ IS '$' 63 X1=INSTR(1,L$,A1$):IF X1=0 OR A1$="" THEN 64 ELSE C1$=C1$+A1$:GOTO 62 64 IF LEN(C1$)=0 THEN C$=C$+"$":C1$="":RETURN !CHECK FOR NULL STRING 65 FOR X=1 TO D 66 IF D$(X)=LEFT(C1$,8%) THEN 69 67 NEXT X 68 D=D+1:D$(D)=C1$:X=D 69 C1$=NUM$(X):C$=C$+CHR$(2)+MID(C1$,2,LEN(C1$)-1)+CHR$(2):C1$="" 70 RETURN 71 !***REMOVE LEADING SPACES AND TABS*** 72 DEF FND$(A$) 73 IF LEN(A$)<>0% THEN IF ASCII(A$)=32% OR ASCII(A$)=9% OR ASCII(A$)=0% THEN A$=RIGHT(A$,2%):GOTO 73 74 FND$=A$:FNEND 80 !*************INITIALIZE PILOT*************************** 85 PRINT "PILOT PROGRAM NAME ";:INPUT LINE Z$:IF ASCII(Z$)=10 THEN 1150 ELSE IF ASCII(Z$)=13 THEN PRINT "PLEASE TYPE THE NAME OF " "PILOT PROGRAM YOU WISH TRANSLATED TO BASIC":GOTO 85 86 Z$=FNB$(Z$) 90 X=INSTR(1,Z$,"."):IF X=0 THENZ$=Z$+".PI" 95 Z1$=LEFT(Z$,INSTR(1,Z$,"."))+"BAS":X=INSTR(1,Z1$,"["):X1=INSTR(1,Z1$,"]") :IF X<>0 THEN Z1$=LEFT(Z1$,X-1)+RIGHT(Z1$,X1+1) 96 GOTO 110 100 !*****ENTRY FROM EDITOR** 103 PRINT:E%=-1%:GOSUB 3 105 Z$=SYS(CHR$(7)):GOTO 90 110 L$="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" ! THE ALPHA-NUMERICS 115 J$=NUM$(ASCII(SYS(CHR$(6)+CHR$(9)))/2) ! JOB NUMBER 117 K=TIME(1) ! START COUNTING RUN TIME 120 IF LEN(J$)=3 THEN J$="0"+J$ 125 OPEN "COMP"+J$ AS FILE 1 130 OPEN "COML"+J$ AS FILE 2 135 ON ERROR GOTO 145 140 OPEN Z$ FOR INPUT AS FILE 3%:GOTO 150 145 PRINT Z$" - ";RIGHT(SYS(CHR$(6)+CHR$(9)+CHR$(ERR)),3):RESUME 85 150 !BUILD STRING TO XLATE HERE 155 J1$=J1$+CHR$(0) FOR A=1 TO 4 160 J1$=J1$+CHR$(A) FOR A=4 TO 96 165 J1$=J1$+CHR$(A) FOR A=65 TO 90 170 J1$=J1$+CHR$(A) FOR A=123 TO 127 172 J1$=J1$+J1$ 173 A=0 ! RESET LINE COUNTER??!! 175 ! J1$=TABLE STRING FOR XLATE 180 DIM #1,C$(300)=128 ! STATEMENT OBJECTS 185 DIM #2,A%(300),B$(300)=8,D$(300)=8 ! OTHER DATA 186 D$(300),C$(300)="" ! PRE EXTEND FILES TO REDUCE OVERHEAD 190 ON ERROR GOTO 1010 195 PRINT "PILOT TO BASIC TRANSLATOR OMSI PILOT-73 V01.2" 196 PRINT "PASS 1" ! BECAUSE IT IS!! 200 !*************GET A LINE AND INITIALIZE COUNTERS******* 210 INPUT LINE #3%,A$:A$=FNB$(A$):E$=A$:A$=XLATE(A$,J1$) 220 A=A+1 ! LINE NUMBER COUNTER 230 C$,C1$,B$(A),C$(A)="":X,X1,C=0 250 !************LOOK FOR LABELS************* 260 A$=FND$(A$) ! REMOVE LEADING BLANKS 270 IF LEFT(A$,1)<>"*" THEN 290 ! NO LABEL HERE 280 X=FNB:B$(A)=MID(A$,2,X-2):A$=RIGHT(A$,X) 290 A$=FND$(A$) 300 !*****************STATEMENT TYPES*********** 305 IF LEN(A$)=0 THEN A%(A)=0:GOTO 200 310 A$=FND$(A$):A1$=LEFT(A$,1) 320 X%=INSTR(1,"YNTAJUMERC:",A1$) 330 IF X% THEN A$=RIGHT(A$,2) ELSE 1080 ! ERROR 340 IF X%=11% THEN A$=":"+A$ 350 A$=FND$(A$) 360 A%(A)=X% 370 IF LEFT(A$,1)=":" THEN 650 380 !*********************CONDITIONALS************ 390 X%=INSTR(1,A$,":"):IF X% THEN A1$=LEFT(A$,X%-1) ELSE 1080 ! ILLEGAL SOMETHING? 400 A$=RIGHT(A$,X%):A1$=FNC$(A1$) 420 IF A1$="Y" OR A1$="N" THEN IF A%(A)=1 OR A%(A)=2 THEN 1080 ELSE C$=A1$+CHR$(1):GOTO 650 430 IF LEFT(A1$,1)<>"(" THEN 1080 ! ERROR (YOU SCREWED IT BUDDY!) 440 X%=INSTR(1,A1$,")"): IF X% THEN A1$=FNC$(MID(A1$,2%,X%-2%)) ELSE 1080 ! ERROR 445 IF LEN(A1$)=1 THEN A1$=A1$+"<>0" 450 R$="<> == <= >= = < > ": R%,R1%=0% 455 R%=INSTR(R%+1%,R$," "): IF R% THEN X%=INSTR(1%,A1$,MID(R$,R1%+1%,R%-R1%-1%)): IF X% THEN 460 ELSE R1%=R%: GOTO 455 457 GOTO 1090 !ERROR 460 IF FND%(A1$) THEN 1090 ! ILLEGAL CONDITION (I.E. ERROR ) 470 C$=A1$+CHR$(1) 650 !*******************BRANCH CONTROL******************** 660 ON A%(A) GOTO 670,670,690,730,800,800,850,200,900,920,985 661 !********************END ('E:')*************** 662 A%(A)=0:GOTO 250 ! EXIT 670 !****************************'Y:',"N:",AND "T:" PARSE********* 680 C$=MID("YN",A%(A),1)+CHR$(1):A$=FND$(A$) 690 IF LEFT(A$,1)<>":" THEN 1080 ! ERROR 700 A$=RIGHT(A$,2) 710 X%=INSTR(1,A$,"$"):IF X% THEN C$=C$+LEFT(A$,X%-1):A$=RIGHT(A$,X%): GOSUB 60:GOTO 710 720 C$=C$+FNB$(A$):X=INSTR(1,C$,"'"):X1=INSTR(1,C$,'"'): GOTO 1065 IF X<>0 AND X1<>0:C$(A)=C$:GOTO 200 !EXIT 730 !***************************'A:' ACCEPT PARSE ********************* 740 A$=FND$(RIGHT(A$,2)) 750 IF LEN(A$)=0 THEN C$(A)=C$:GOTO 200 760 A1$=LEFT(A$,1):IF A1$<>"$" AND A1$<>"#" THEN 1100 ! ERROR 770 IF A1$="$" THEN GOSUB 60:A$=FND$(A$):IF LEN(A$)>0 THEN 1100 ELSE C$(A)=C$:GOTO 200 ! ERROR OR EXIT HERE 780 IF INSTR(1,LEFT(L$,26),MID(A$,2,1))=0 THEN 1100 ! ERROR 790 C$=C$+"#"+MID(A$,2,1):A$=RIGHT(A$,3):A$=FND$(A$): IF A$<>"" THEN 1100 ELSE C$(A)=C$:GOTO 200 ! ERROR AND EXIT 800 !*********************JUMP AND USE ('J:' AND 'U:') PARSE********* 810 A$=FND$(RIGHT(A$,2)) 820 A1$=LEFT(A$,1):IF A1$<>"*" THEN 1100 ! ERROR 830 X=FNB 840 C$=C$+MID(A$,2,X-2):C$(A)=C$:GOTO 200 ! EXIT 850 !*********************MATCH PARSE('M:')**************** 855 A$=RIGHT(A$,2) 860 X%=INSTR(1,A$," "):IF X% THEN A$=LEFT(A$,X%-1)+RIGHT(A$,X%+1):GOTO 860 870 A$=FNB$(A$):IF FNA$(A$)<>"," THEN A$=A$+"," 880 C$(A)=C$+A$:GOTO 200 ! EXIT 900 !************************REMARKABLE AREA ('R:' PARSE) ******** 910 C$(A)=FNB$(RIGHT(A$,2)):GOTO 200 ! EXIT 920 !*****************************COMPUTE PARSE*********************** 930 A2$=RIGHT(A$,2):A$=FNC$(A2$)+":":P$=LEFT(L$,26) 940 X=INSTR(1,A$,":"):IF X=0 THEN 983 945 A1$=LEFT(A$,X-1):A$=RIGHT(A$,X+1) 950 X=INSTR(1,A1$,"="):IF X=0 THEN 1090 ! ERROR 951 A3$=RIGHT(A1$,X+1) 952 A1$=LEFT(A1$,X-1)+"," 955 X=INSTR(1,A1$,","):IF X=0 THEN 970 960 X=INSTR(1,P$,LEFT(A1$,1)):IF X=0 THEN 1090 ! ERROR 965 A1$=RIGHT(A1$,3):GOTO 955 970 IF FND%(A3$) THEN 1090 ! ERROR 980 GOTO 940 983 c$(a)=c$+a2$: goto 200 985 !**************CONTINUE PARSE*********** 987 IF A=1 THEN 1105 ! ERROR 988 IF A%(A-1)=7 THEN IF INSTR(1%,C$(A-1),CHR$(1%))=0% THEN 1107 !ERROR 990 X%=INSTR(1,C$(A-1),CHR$(1)):IF X%=0% THEN A%(A)=A%(A-1):GOTO 660 1000 C$=LEFT(C$(A-1),X%):A%(A)=A%(A-1):GOTO 660 1010 !****************ERROR HANDLING ROUTINE******************* 1020 IF ERR<>11 THEN ON ERROR GOTO 0 ! SOME ERROR HANDLING ROUTINE?? 1040 !*****************EXIT****************************** 1050 D$(0)=CVT%$(D):A%(0)=A:B$(0)=CVT%$(K):Z1$=SYS(CHR$(8)+Z1$) 1055 CLOSE 1,2,3,4,5 1057 CHAIN W$+"PILGEN" 400 1060 !***************PILOT ERROR MESSAGES************ 1065 PRINT "ILLEGAL QUOTE MIXING ";:GOTO 1110 1070 PRINT "ILLEGAL LABEL ";:GOTO 1110 1080 PRINT "ILLEGAL INSTRUCTION ";:GOTO 1110 1090 PRINT "ILLEGAL EXPRESSION ";:GOTO 1110 1100 PRINT "ILLEGAL OBJECT ";:GOTO 1110 1105 PRINT "CONTINUE ";:GOTO 1110 1107 PRINT "CONTINUE FOR MATCH STATEMENT ";:GOTO 1110 1110 PRINT "IN STATEMENT"A:PRINT E$ 1115 PRINT "CORRECT LINE NOW ";:INPUT LINE T$:IF ASCII(T$)=13 THEN PRINT "VALID RESPONSES ARE YES AND NO ":GOTO 1115 1120 T%=ASCII(T$):IF T%=89 OR T%=10 THEN PRINT A;" ";:INPUT LINE A$: A$=XLATE(A$,J1$):E$=A$:A$=FNB$(A$):A=A-1:GOTO 220 !TRY AGAIN 1130 PRINT "CHAIN PILEDT ";:INPUT LINE T$ 1140 T%=ASCII(T$):IF T%=13 THEN PRINT"VALID RESPONSES ARE: " "YES, NO AND EXIT ":GOTO 1130 1141 IF T%=10% OR T%=89% THEN T$=SYS(CHR$(8%)+Z$+SPACE$(23%-LEN(Z$))+ W$+SPACE$(23%-LEN(W$))): CHAIN W$+"PILEDT" 20 1142 IF T%=ASCII("N") THEN CHAIN W$+"PILOT" 1143 IF T%<>ASCII("E") THEN T$=CHR$(13):GOTO 1140 1150 END