2 'ADAPTED FOR CP/M AND MICROSOFT BASIC 5.01 ON 5/11/80
3 'FOR 4.51 ON 3/18/81, AND FOR MODEL III ON 2/20/83, FOR CP/M AND MBASIC 4.51/5.2+ AGAIN ON 3/23/83; FOR 48K CP/M ON 7/2/83 WITH OVERLAYS: THIS IS THE SECOND OVERLAY, CREATOR.OVL
4 'THIS IS PUBLIC DOMAIN SOFTWARE AND MAY NOT BE SOLD OR INCORPORATED IN ANY COMMERCIAL SOFTWARE WITHOUT THE EXPRESS EXPRESS PERMISSION OF THE AUTHOR
10 ON ERROR GOTO 1990
19 GOTO 1400
20 FX=0:IF LEN(CV$)<1 THEN RETURN
30 FOR II=1 TO LEN(CV$):CV%=ASC(MID$(CV$,II,1)):IF CV%=34 AND FX=0 THEN FX=1:ELSE IF CV%=34 AND FX=1 THEN FX=0
40 IF CV%>90 AND FX=0 THEN CV%=CV% AND 95
50 MID$(CV$,II,1)=CHR$(CV%):NEXT II:RETURN
1400 PRINT #1,"1006 ON FC GOSUB ";:FOR I=1 TO A-1:PRINT #1,MID$(STR$(D%(I)-10),2,4);",";:NEXT :PRINT #1,MID$(STR$(D%(A)-10),2)
1410 PRINT #1,"1007 IF FC<";A;" THEN 1005 ELSE ";LN+10
1420 PRINT #1,"29010 FOR I=1 TO ";A:DIM H$(50):PRINT CLS$;"When the record is displayed, what title should be used for":FOR I=1 TO A:PRINT"FIELD NUMBER:";I;:LINE INPUT H$(I):PRINT #1,22000+I;"DATA";Q$;H$(I);Q$:NEXT I
1430 PRINT CLS$;"Do you want to display computed data with your record (Y/N)?";
1440 DC$=INKEY$:IF DC$="" THEN 1440:ELSE CV$=DC$:GOSUB 20:DC$=CV$:PRINT DC$:IF INSTR("YN",DC$)<1 THEN 1430:ELSE IF DC$="N" THEN 1510
1450 PRINT CLS$;"All right. You may display computed data on as many fields as":PRINT"you desire. However, you should remember that, to do this, you":PRINT"will have to tell me in some detail just what you want printed"
1460 PRINT"and how it should be printed.":PRINT"All fields are available for printing or calculations. Any":PRINT"operation allowed in BASIC is permitted, including all string,":PRINT"logical, and mathematical operations."
1470 PRINT"HOWEVER: ALL FIELDS ARE TO BE TREATED AS STRINGS. Therefore,":PRINT"if you want to display the sum of field 7 and field 9, you must":PRINT"tell me to display VAL(G$(7))+VAL(G$(9)). All fields must be"
1480 PRINT"referenced by means of this G$() array, where the subscript":PRINT"(number inside parentheses) is the number of the field with":PRINT"which you are working. I will ask you for a command line, a"
1490 PRINT"display title, and a print format for each computed or derived":PRINT"field you want to display. NOW DEPRESS ANY KEY TO CONTINUE.";
1500 DC$=INKEY$:IF DC$="" THEN 1500:ELSE PRINT CLS$:JL=29030:GOSUB 2000
1510 IF RS<256 THEN PRINT #1,"12910 FIELD #1,";RS;" AS DL$:LSET DL$=STRING$(";RS;",250):PUT 1,RP:LSET KP$=MKI$(-RP):PUT 2,KP:GOTO";SL
1520 IF RS=256 THEN PRINT #1,"12910 FIELD #1,255 AS DL$,1 AS DX$:LSET DL$=STRING$(255,250):LSET DX$=CHR$(250):PUT 1,RP:LSET KP$=MKI$(-RP):PUT 2,KP:GOTO";SL
1530 PRINT #1,"10860 GOTO";SL
1540 PRINT #1,"11840 IF UF>";A;" OR UF<0 THEN PRINT";Q$;"INVALID FIELD.";Q$;":GOTO 11810":PRINT #1,"11850 IF UF=0 THEN";SL:PRINT #1,"11860 PRINT CHR$(13);STRING$(63,32);CHR$(13);"
1545 PRINT #1,"11865 ON UF GOSUB ";
1550 FOR TZ=1 TO A-1:PRINT #1,MID$(STR$(D%(TZ)-10),2);",";:NEXT TZ:PRINT #1,MID$(STR$(D%(A)-10),2):PRINT #1,"11870 IF UF<>";KF;" THEN 11900 ELSE ZZ$=STRING$(F%(";KF;"),32):LSET ZZ$=G$(";KF;
1560 IF RS<256 THEN PRINT #1,"):FIELD #1,";RS;" AS DL$:LSET DL$=STRING$(";RS;",250):PUT 1,RP:LSET KP$=MKI$(-RP):PUT 2,KP:GOSUB 26000:KP=RP"
1570 IF RS=256 THEN PRINT #1,"):FIELD #1,255 AS DL$,1 AS DX$:LSET DL$=STRING$(255,250):LSET DX$=CHR$(250):PUT 1,RP:LSET KP$=MKI$(-RP):PUT 2,KP:GOSUB 26000:KP=RP"
1580 PRINT #1,"11999 FOR I=1 TO ";A;":LSET F$(I)=G$(I):NEXT :PUT 1,RP:G$=";Q$;Q$;":GOTO 11200":PRINT #1,"27010 PRINT CLS$:GOSUB ";D%(KF)-10;":KF$=STRING$(F%(";KF;"),32):LSET KF$=G$(";KF;")"
1590 PRINT #1,"27040 KP=KP+1:IF KP>";MS;" OR KP<2 THEN KP=1:REM CIRCULATE AROUND"
1600 PRINT #1,"27050 GET 2,KP:RP=CVI(KP$):IF RP<-1 THEN 27040:ELSE IF RP=0 THEN ERROR 62:ELSE IF RP=-1 THEN PRINT";Q$;"RECORD NOT FOUND.";Q$;":FOR I=1 TO 2000:NEXT I:RUN"
1610 PRINT #1,"27055 GET 1,RP:IF LEFT$(F$(";KF;"),LEN(ZZ$))=ZZ$ THEN RETURN:ELSE 27040"
1650 LN=LN+10:PRINT #1,LN;"REM*LOOK FOR RECORD SPACE":LN=LN+10:PRINT #1,LN;"GOSUB ";LN+10;":GOTO";LN+60:LN=LN+10:PRINT #1,LN;"KP=KP+1:IF KP>";MS;" OR KP<2 THEN KP=2":PRINT #1,"11890 KP=KP+1:IF KP>";MS;" OR KP<2 THEN KP=2"
1660 PRINT #1,"11895 GET 2,KP:IF CVI(KP$)<>-1 THEN 11890":PRINT #1,"11896 GET 2,1:RP=CVI(KP$)+1:LSET KP$=MKI$(RP):PUT 2,1:LSET KP$=MKI$(RP):PUT 2,KP"
1670 LN=LN+10:PRINT #1,LN;"GET 2,KP:RP=CVI(KP$):IF RP>0 THEN";LN-10:LN=LN+10:PRINT #1,LN;"IF RP<-1 THEN RETURN":LN=LN+10:PRINT #1,LN;"IF RP=0 THEN ERROR 62":LN=LN+10:PRINT #1,LN;"RETURN":LN=LN+10:PRINT #1,LN;"FOR K=1 TO ";A
1690 LN=LN+10:PRINT #1,LN;"IF RP<-1 THEN PUT 1,ABS(RP):LSET KP$=MKI$(ABS(RP)):PUT 2,KP:ELSE PK=KP:GET 2,1:KP=1+CVI(KP$):LSET KP$=MKI$(KP):PUT 2,PK:PUT 1,KP:PUT 2,1"
1700 PRINT CLS$;"Now we are almost done. We need to ask the operator if he is":PRINT"done with entry or update. You may choose the message you wish."
1710 PRINT"The operator's input will be limited to a single key depression.":PRINT"I would suggest something of the form:"
1720 PRINT"Are you finished with entry? (Y/N) Enter your choice below:":LINE INPUT TM$
1730 PRINT"If the operator is NOT done, what should the reply be?";
1740 ND$=INKEY$:IF ND$="" THEN 1740:ELSE CV$=ND$:GOSUB 20:ND$=CV$:PRINT ND$:IF ND$<" " THEN 1730
1750 PRINT"If the operator IS done, what should the reply be?";
1760 ID$=INKEY$:IF ID$="" THEN 1760:ELSE CV$=ID$:GOSUB 20:ID$=CV$:PRINT ID$:IF ID$<" " THEN 1750:ELSE LN=LN+10:PRINT #1,LN;"PRINT";Q$;TM$;Q$;";":LN=LN+10:PRINT #1,LN;"TM$=INKEY$:IF TM$=";Q$;Q$;" THEN";LN;":ELSE PRINT TM$":BL=LN-10
1770 LN=LN+10:PRINT #1,LN;"REM*IF DONE, RETURN TO MENU ELSE CONTINUE ENTRY OR RE-DISPLAY CHOICE":LN=LN+10:PRINT #1,LN;"IF TM$=";Q$;ID$;Q$;" THEN";SL
1780 LN=LN+10:PRINT #1,LN;"IF TM$<>";Q$;ND$;Q$;" THEN PRINT";Q$;"PLEASE ANSWER ";ND$;" OR ";ID$;Q$;":GOTO";BL:LN=LN+10:PRINT #1,LN;"FOR I=1 TO ";A;":G$(I)=";Q$;Q$;":NEXT :FC=0:PRINT CLS$:UF=0:G$=";Q$;Q$;":GOTO 1000"
1790 PRINT"Do you want to cut down on remarks in the generated program?":PRINT"Please answer Y or N: ";
1800 CV$=INKEY$:IF CV$="" THEN 1800:ELSE GOSUB 20:PRINT CV$
1810 IF CV$="Y" THEN OPEN"I",2,"C451MIN.LIB":ELSE IF CV$="N" THEN OPEN"I",2,"C451.LIB":ELSE 1790
1820 PRINT CLS$;"WAIT A MOMENT WHILE I FINISH YOUR PROGRAM."
1830 IF EOF(2) THEN 1900
1840 LINE INPUT #2,A$
1850 IF S3%<1 AND VAL(A$)>29999 AND VAL(A$)<30999 THEN 1830
1860 IF S4%<1 AND VAL(A$)>30998 AND VAL(A$)<31900 THEN 1830
1870 IF S1%<1 AND VAL(A$)>=40000! AND VAL(A$)<40500! THEN 1830
1880 IF S2%<1 AND VAL(A$)>=40500! AND VAL(A$)<41000! THEN 1830
1890 PRINT #1,A$:GOTO 1830
1900 CLOSE
1910 PRINT CLS$;"Your program has been written and saved on the specified drive.":PRINT"You may now load it and run it, if you wish. Remember, your":PRINT"data file does NOT exist until you initialize it!"
1920 PRINT"Thanks for running the CREATOR!":FOR I=1 TO 2000:NEXT I:NEW
2000 PRINT"REMEMBER, ALL FIELDS ARE STRINGS WITHIN THE ARRAY G$()."
2010 PRINT"TO PERFORM ARITHMETIC ON A FIELD, IT IS NECESSARY TO TAKE ITS":PRINT"VALUE FIRST, WITH THE VAL COMMAND. FOR EXAMPLE, TO PRINT THE":PRINT"SUM OF FIELDS 1,2, AND 3 YOU WOULD TYPE THE COMMAND LINE"
2020 PRINT"VAL(G$(1))+VAL(G$(2))+VAL(G$(3))"
2030 PRINT:PRINT"Now, type in a command line which will tell me what operations":PRINT"I should perform. Please don't type more than 240 characters.":PRINT"HIT THE RETURN WHEN YOU ARE DONE."
2040 PRINT:PRINT"COMMAND LINE:";:LINE INPUT CV$:IF LEN(CV$)>240 THEN PRINT"TOO LONG! TRY AGAIN!":GOTO 2040:ELSE IF LEN(CV$)<1 THEN RETURN
2050 K=0:JK=0:J=0:FOR I=1 TO LEN(CV$):IF MID$(CV$,I,1)=Q$ THEN J=ABS(J-1)
2060 IF J THEN 2080
2070 IF MID$(CV$,I,1)=")" THEN K=K+1:ELSE IF MID$(CV$,I,1)="(" THEN JK=JK+1
2080 NEXT I:IF JK<>K THEN PRINT"MISMATCHED PARENTHESES SOMEWHERE. PLEASE TRY AGAIN."
2090 IF J THEN PRINT"MISMATCHED QUOTATION MARKS (";Q$;") IN YOUR COMMAND. PLEASE TRY AGAIN."
2100 IF J>0 OR (JK<>K) THEN 2040
2110 PRINT"What title should I use for this data:";:LINE INPUT TI$
2120 IF INSTR(TI$,Q$) THEN PRINT"NO QUOTATION MARKS ALLOWED.":GOTO 2110
2140 PRINT"If this field is numeric, you may use a formatted print.":PRINT"If it is not, or you do not wish to print it in a formatted":PRINT"way, you need not. DO YOU WISH TO USE A FORMATTED PRINT (Y/N)"
2150 TI$=INKEY$:IF TI$="" THEN 2150:ELSE IF TI$="N" THEN 2250
2160 IF TI$<>"Y" THEN 2140
2170 LINE INPUT"Number of places to the left of the decimal point=";NL$:IF VAL(NL$)<0 OR VAL(NL$)>16 THEN PRINT"Illegal (0-16 only).":GOTO 2170
2180 LINE INPUT"Number of places to the right of the decimal point";NR$:IF VAL(NR$)<0 OR VAL(NL$)+VAL(NR$)>16 THEN PRINT"Illegal number of places or illegal total places (0-16).":GOTO 2180
2190 PRINT"Do you want to use commas (Y/N): ";
2200 NC$=INKEY$:IF NC$="" THEN 2200:ELSE IF NC$<>"N" AND NC$<>"Y" THEN 2200
2210 PRINT NC$
2220 TI$="USING"+Q$+STRING$(VAL(NL$),"#"):IF NC$="Y" THEN TI$=TI$+","