10 REM RBBS VERSION 2.5 20 REM *****RBBS - "Remote Bulletin Board System"***** 21 REM by Bruce R. Ratoff 22 REM adapted from Xitan Basic SJBBS by Howard Moulton 29 REM 30 REM 08/18/81 31 REM Changed time/date logic to look at in-memory time 32 REM and date maintained by my interrupt-driven time/date 33 REM routines. Commented out Bill E.'s code. (Bruce Ratoff) 39 REM 40 REM more changes by Bill Earnest, 3/24/81 41 REM NOTE CHGS AT 510-520,580,590,720, 42 REM 3650-3670,4600-4730,6000-. MY BYE INCLUDES THE @ ON 43 REM FIRST ENTRY SO USER NEEDNT REMEMBER "P". SYS. CLOCK 44 REM IS CALLED AROUND 4600 & LEAVES DATA IN 0F400H++. CALL 45 REM @ 580 AREA FORCES USER 0 FOR THOSE CARELESS FOLKS 46 REM THAT SAY RIBBS FROM ANYWHERE. LINE INPUT PROCESSING @ 47 REM 6000++ INCLUDES THE NEAR-LINE-END BELL. I USED SOME 48 REM PIECES FROM RBBS24 ALSO. THE LINE INPUT ISNT TOO VERY 49 REM SLOW EVEN UNDER MBASIC, BUT COMPILED IS BETTER. 50 REM Note that the program contains 2 calls to external 51 REM routines which are special to Bill Earnest's 52 REM system, at 53 REM 580-590 and 54 REM 4610-4730 (to call in a clock) 55 REM These calls will cause the program to crash unless 56 REM you implement similar routines and thus have been 57 REM disabled with REM statements. Remove the REMs if 58 REM if you have a use for them. Note too that several 59 REM of the RBBS2.4 routines are omitted in this version; 60 REM you may want to replace them. And note that Bill 61 REM has figured how to use the clock to put times into 62 REM the CALLERS file! --Ben Bronson 65 REM changes of 12/10/80 by Bruce Ratoff 66 REM FIXED BUG THAT PREVENTED "NEWCOM" FROM PRINTING 70 REM MADE "LASTCALR" A $SYS FILE 80 REM IMPROVED CONTROL-K RESPONSE (STILL NOT PERFECT BUT BETTER) 90 REM changes of 11/14/80 by Ron Fowler 100 REM ADDED PERSONAL MESSAGE FUNCTION 110 REM K FUNCTION STORES NAME OF ERASING USER IN MSG# RECORD 120 REM changes of 11/9/80 by Ron Fowler 130 REM 1: PRINT CALLERS FOR SYSOP 140 REM 2: SAVE KILLED MSG #S, PUT PWD'S IN MSG FILE 150 REM 3: RE-ENTRY OPTION, FILE "LASTCALR" 160 REM 10/21/80 --> Fix several minor bugs in P and S cmds. (BRR) 170 REM Changes 10/15/80 by Ron Fowler: 180 REM 1) added "Q", quick summary command 190 REM 2) added "X", "P" cmds - expert user mode, and bell toggle 200 REM 3) rearranged message entry for CBBS compatibility 210 REM 4) added ";" delimitation - "command anticipation" 220 REM 5) added password file access at 3 levels: 230 REM a. p1$ is high-level quick-access to cp/m 240 REM b. p2$ is sysop 'last name' (sysop has special priveliges) 250 REM c. p3$ is the normal cpm access password: 260 REM (IF P3$ IS "NOPASS", THEN CPM ACCESS IS UNRESTRICTED) 270 REM 6) coded several sequences as subroutines, to shorten code 280 REM 7) made several cosmetic changes 290 REM note: the file "PWDS" can be created by a text editor. The 300 REM passwords are sequential..e.g.,"GOTOCPM,FOWLER,NOPASS" 310 REM *** put the shortest version of your first name in line 920 320 REM 330 REM 500 DEFINT A-Z 510 REM [disabled] FOR I=8 TO 15: READ J: POKE I,J: NEXT I 520 REM [disabled] DATA 14,0,17,0,0,&HC3,5,0 530 VERS$="vers 2.5"' VERSION NUMBER 540 DIM A$(17),M(400,2) 550 POKE 0,&HCD 560 INC=1: ERS$=CHR$(8)+" "+CHR$(8) 570 ON ERROR GOTO 4810 580 RFLG=PEEK(&H5D):POKE &H5D,32 590 REM [disabled:] POKE 9,32: POKE 11,0: CALL BDCAL 600 REM 610 REM SIGNON FUNCTIONS 620 REM 630 MSGS=1:CALLS=MSGS+1:MNUM=CALLS+1 640 P2$="xxxxxx":P3$="NOPASS" 'DEFAULT PWDS 650 BK=0:GOSUB 4200:N=1:A$="Cranford, NJ RIBBS...":GOSUB 4200:N=0 660 OPEN "I",1,"A:PWDS":IF EOF(1) THEN 680 670 INPUT #1,P1$,P2$,P3$ 680 CLOSE #1 690 BEL=-1:XPR=0'INITIAL BEL ON, NOT EXPERT 700 A$=VERS$:GOSUB 4200:GOSUB 4200 710 SAV$="" 720 IF RFLG<>ASC("P") THEN 770 730 INC=0 740 OPEN "I",1,"A:LASTCALR":IF EOF(1) THEN 790 750 INPUT #1,N$,O$,TON:CLOSE 760 A$="Welcome back, "+N$+" "+O$+".":GOSUB 4200:GOSUB 4200:GOTO 990 770 GOSUB 1840:GOSUB 1740'REM PRINT INFO, THEN BULLETINS 780 BK=0:A$="(Prompting bell means system is ready for input).":GOSUB 4200:GOSUB 4200 790 A$="What is your FIRST name ?":GOSUB 4200:C=1:GOSUB 4400:C=0:N$=B$: IF N$="" THEN 790 800 IF N$=P1$ THEN 1620 ' DIRECT CPM EXIT 805 IF LEFT$(N$,1)=" " OR RIGHT$(N$,1)=" " THEN 790 810 IF N$<"A" OR LEN(N$)=1 THEN 790 820 A1$="What is your LAST name ?":GOSUB 4200:C=1:GOSUB 4400:C=0:O$=B$: IF O$="" THEN 790 830 IF O$<"A" OR LEN(O$)=1 THEN 790 835 IF LEFT$(O$,1)=" " OR RIGHT$(O$,1)=" " THEN 790 840 IF N$="SYSOP" AND O$=P2$ THEN O$="":GOTO 940 850 IF N$="SYSOP" THEN 790 860 A$="Checking user file...":GOSUB 4200:V=0:OPEN "R",1,"A:USERS",62: FIELD#1,62 AS RR$:GET#1,1:NU=VAL(RR$) 870 FOR I=2 TO NU+1:GET#1,I: IF INSTR(RR$,N$)>0 AND INSTR(RR$,O$)>0 THEN MF$=LEFT$(RR$,1):CLOSE: GOSUB 4200:GOTO 940 880 NEXT I 890 V=1:A1$="Where (City,State) are you calling from ?":GOSUB 4200: C=1:GOSUB 4400:C=0:ST$=B$:IF ST$="" THEN 820 900 A$="Hello "+N$+" "+O$+" from "+ST$:GOSUB 4200: A1$="Did I misspell anything ?":GOSUB 4200:C=1:GOSUB 4400:C=0: IF LEFT$(B$,1)="Y" THEN 790 910 A1$="This checking is only done the first time you call.":GOSUB 4200 920 S$=" "+N$+" "+O$+" "+ST$:RL=62:GOSUB 5000:NU=NU+1:PUT#1,NU+1: S$=STR$(NU):GOSUB 5000:PUT#1,1:CLOSE 930 FIL$="NEWCOM":GOSUB 5400:MF$=" " 940 A$="Logging "+N$+" "+O$+" to disk...":N=1:GOSUB 4200: OPEN "R",1,"A:CALLERS",60:FIELD#1,60 AS RR$:GET#1,1 950 RE=VAL(RR$)+1:S$=STR$(RE):RL=60:GOSUB 5000:PUT#1,1:RE=RE+1 960 GOSUB 4610 970 S$=N$+" "+O$+" "+ST$+" "+D$+" "+DT$:GOSUB 5000:PUT#1,RE:CLOSE#1 980 OPEN "O",1,"A:LASTCALR. "+CHR$(&HA0):PRINT #1,N$;",";O$;",";TON:CLOSE 990 BK=0:GOSUB 4200:A$="Active # of msg's ":N=1:GOSUB 4200: OPEN "R",1,"A:COUNTERS",5:FIELD#1,5 AS RR$:GET#1,MSGS:M=VAL(RR$) 1000 A$=STR$(M)+".":GOSUB 4200 1010 A$="You are caller # ":N=1:GOSUB 4200:GET#1,CALLS 1020 CN=VAL(RR$)+INC:A$=STR$(CN):LSET RR$=A$:GOSUB 4200:PUT#1,CALLS 1030 A$="Next msg # will be ":N=1:GOSUB 4200:GET#1,MNUM:U=VAL(RR$) 1040 A$=STR$(U+1):GOSUB 4200:CLOSE:GOSUB 4200 1100 REM 1110 REM LOOK FOR MSGS FOR THIS CALLER 1120 REM AND BUILD MESSAGE INDEX 1130 REM 1140 FT=1:MX=0:MZ=0:IU=0:'FLAG FIRST TIME FOR PRINTING HEADING 1150 OPEN "R",1,"A:SUMMARY",30:RE=1:FIELD#1,28 AS RR$ 1160 BK=0:GET#1,RE:IF EOF(1) THEN 1260 1170 G=VAL(RR$):MZ=MZ+1:M(MZ,1)=G:IF G=0 THEN 1250 1180 IF IU=0 THEN IU=G 1190 IF G>9998 THEN MZ=MZ-1:GOTO 1260 1200 GET#1,RE+3:GOSUB 5100:IF INSTR(S$,N$)>0 AND INSTR(S$,O$)>0 THEN 1230 1210 IF N$<>"SYSOP" THEN 1250 1220 IF INSTR(S$,"BRUCE")=0 THEN 1250 1230 IF FT THEN A$="Please retrieve and kill the following message(s) left for you:":GOSUB 4200:FT=0 1240 A$=STR$(G):N=1:GOSUB 4200 1250 GET#1,RE+5:M(MZ,2)=VAL(RR$):MX=MX+M(MZ,2)+6:RE=RE+6:GOTO 1160 1260 CLOSE:GOSUB 4200:GOSUB 4200 1300 REM 1310 REM *** MAIN COMMAND ACCEPTOR/DISPATCHER *** 1320 REM 1330 A1$="Function":IF NOT XPR THEN A1$=A1$+" (B,E,R,S,K,G,W,C,U,P,X,Q (or '?' if not known)" 1340 A1$=A1$+"?":GOSUB 4200:C=1:GOSUB 4400:C=0 1350 IF B$="" THEN 1300 1360 FF=INSTR("BER?SKGWCUPXQL",B$):GOSUB 1370:GOTO 1300 1370 IF FF=0 THEN 1390 1380 ON FF GOTO 1700,2100,2800,1900,5500,3700,3500,1800,1500,4000, 5300,5200,5600,5700 1390 IF N$+O$="SYSOP" THEN IF B$="%" THEN GOSUB 5700:GOTO 1300 1400 A$="I don't understand '"+B$+"', "+N$+".":GOSUB 4200:GOSUB 4200: SAV$="":RETURN 1500 REM 1510 REM ***EXIT TO CP/M*** 1520 REM 1530 IF MF$="*" THEN A$="You've lost that privelege, "+N$:GOSUB 4200: SAV$="":RETURN 1540 IF P3$="NOPASS" THEN 1570 1550 A1$="Password ?":GOSUB 4200:C=1:GOSUB 4400:C=0 1560 IF B$<>P3$ THEN A$="+++INVALID+++":GOSUB 4200:GOSUB 4200:RETURN 1570 IF XPR THEN 1620 1580 A$="Please remember to type BYE before hanging up the phone.":GOSUB 4200:GOSUB 4200 1590 A$="To re-enter RIBBS, type:":GOSUB 4200:A$="A>USER 3":GOSUB 4200: A$="A>RIBBS P":GOSUB 4200:GOSUB 4200 1600 A$="For info on software exchange, type:":GOSUB 4200: A$="A>TYPE THIS-SYS.DOC":GOSUB 4200:GOSUB 4200 1610 A$="For general info, type:":GOSUB 4200: A$="A>HELP":GOSUB 4200:GOSUB 4200 1620 GOSUB 4200:POKE 4,0:A$="Entering CP/M...":GOSUB 4200:POKE 0,&HC3:SYSTEM 1700 REM 1710 REM ***DISPLAY BULLETINS*** 1720 REM 1730 GOSUB 4130 1740 FIL$="A:BULLETIN":GOSUB 5400:RETURN 1800 REM 1810 REM ***DISPLAY WELCOME MESSAGE*** 1820 REM 1830 GOSUB 4130 1840 FIL$="A:INFO":GOSUB 5400:RETURN 1900 REM 1910 REM *** DISPLAY MENU OF FUNCTIONS *** 1920 REM 1930 GOSUB 4200:A$="Functions supported:":GOSUB 4200:IF BK THEN RETURN 1940 A$="S--> Scan messages R--> Retrieve message":GOSUB 4200: IF BK THEN RETURN 1950 A$="E--> Enter message K--> Kill message":GOSUB 4200:IF BK THEN RETURN 1960 A$="B--> retype Bulletins W--> retype welcome":GOSUB 4200:IF BK THEN RETURN 1970 A$="C--> exit to CP/M U--> list User file":GOSUB 4200:IF BK THEN RETURN 1980 A$="P--> Prompt (bel) togl X--> eXpert user mode":GOSUB 4200:IF BK THEN RETURN 1990 A$="Q--> Quick summary G--> Goodbye (signoff)":GOSUB 4200:IF BK THEN RETURN 2000 GOSUB 4200:A$="Commands may be strung together, separated by semicolons.": GOSUB 4200:A$="For example, 'R;123' retrieves message # 123.":GOSUB 4200: IF BK THEN RETURN 2010 GOSUB 4200:A$="Software exchange is done under CP/M using":GOSUB 4200: A$="the XMODEM program (for intelligent transfer)":GOSUB 4200: A$="or the TYPE command (simple ASCII listing).":GOSUB 4200 2020 IF BK THEN RETURN 2030 GOSUB 4200:RETURN 2100 REM 2110 REM ***ENTER A NEW MESSAGE*** 2120 REM 2130 F=0:GOSUB 4200:OPEN "R",1,"A:COUNTERS",5:A$="Msg # will be ":N=1: GOSUB 4200:FIELD#1,5 AS RR$:GET#1,MNUM:V=VAL(RR$) 2140 A$=STR$(V+1):GOSUB 4200:CLOSE 2150 GOSUB 4610 2160 GOSUB 4200: A1$="Today's date is "+D$: GOSUB 4200 2170 A1$="Who to (C/R for ALL)?":GOSUB 4200:C=1:GOSUB 4400:C=0:IF B$="" THEN T$="ALL" ELSE T$=B$ 2180 A1$="Subject?(26 char in summary)":GOSUB 4200:C=1:GOSUB 4400:C=0:K$=B$ 2190 IF LEN(K$)>30 THEN GOTO 2180 2200 A1$="Password?":GOSUB 4200:C=1:GOSUB 4400:C=0:PW$=B$ 2210 A1$="To enter msg,type in lines. (Bell @ end-8)":GOSUB 4200 2220 A1$="To edit,hit only C/R. (16 lines max)":GOSUB 4200 2230 A1$="No semicolons,please.":GOSUB 4200:GOSUB 4200:F=0 2240 IF F=16 THEN A$="Msg full.":GOSUB 4200:GOTO 2300 2250 F=F+1:A1$=STR$(F)+" ":N=1:GOSUB 4200:GOSUB 4400:IF B$="" THEN F=F-1:GOTO 2300 2260 IF F=12 THEN PRINT "(4 lines left)" 2270 IF F=14 THEN PRINT "(2 lines left)" 2280 IF F=15 THEN PRINT "(last line)" 2290 A$(F)=B$+" ":GOTO 2240 2300 GOSUB 4200:A1$="(L)ist, (E)dit, (Q)uit, (C)ontinue, (S)ave; Select?": IF XPR THEN A1$="L,E,Q,C,S?" 2310 GOSUB 4200:C=1:GOSUB 4400:C=0 2320 IF B$<>"L" THEN 2360 ELSE GOSUB 4130 2330 GOSUB 4200:FOR L=1 TO F:A$=STR$(L)+" "+A$(L) 2340 IF BK THEN 2300 ELSE GOSUB 4200:NEXT L 2350 GOSUB 4200:GOTO 2300 2360 IF B$="Q" THEN A$="Aborted":GOSUB 4200:RETURN 2370 IF B$="C" THEN 2240 2380 IF B$="E" THEN 2410 2390 IF B$="S" THEN 2460 2400 GOTO 2300 2410 GOSUB 4200:A1$="Line #?":GOSUB 4200:GOSUB 4400:L=VAL(B$):PP$="" 2420 IF L=0 OR L>F THEN 2300 ELSE A$="Was:":GOSUB 4200:A$=A$(L):GOSUB 4200 2430 A1$="Enter new line":IF NOT XPR THEN A1$=A1$+" (C/R for no change)" 2440 A1$=A1$+":":GOSUB 4200:GOSUB 4400 2450 IF B$="" THEN 2300 ELSE A$(L)=B$+" ":GOTO 2300 2460 REM 2470 IF PW$<>"" THEN PW$=";"+PW$ 2480 A$="Updating summary file, ":N=1:GOSUB 4200 2490 OPEN "R",1,"A:SUMMARY",30:RE=1:FIELD#1,30 AS RR$:RL=30 2500 RE=MZ*6+1:S$=STR$(V+1)+PW$:GOSUB 5000:PUT#1,RE 2510 RE=RE+1:S$=D$:GOSUB 5000:PUT#1,RE 2520 RE=RE+1:S$=N$+" "+O$:GOSUB 5000:PUT#1,RE 2530 RE=RE+1:S$=T$:GOSUB 5000:PUT#1,RE 2540 RE=RE+1:S$=K$:GOSUB 5000:PUT#1,RE 2550 RE=RE+1:S$=STR$(F):GOSUB 5000:PUT#1,RE 2560 RE=RE+1:S$=" 9999":GOSUB 5000:PUT#1,RE 2570 CLOSE#1 2580 A$="next msg #, ":N=1:GOSUB 4200: OPEN "R",1,"A:COUNTERS",5:FIELD#1,5 AS RR$ 2590 GET#1,MNUM:LSET RR$=STR$(VAL(RR$)+1):PUT#1,MNUM 2600 A$="active msg's, ":N=1:GOSUB 4200 2610 GET#1,MSGS:LSET RR$=STR$(VAL(RR$)+1):PUT#1,MSGS:CLOSE#1 2620 A$="and msg file.":N=1:GOSUB 4200:OPEN "R",1,"A:MESSAGES",65:RL=65 2630 FIELD#1,65 AS RR$ 2640 RE=MX+1 2650 S$=STR$(V+1)+PW$:GOSUB 5000:PUT#1,RE 2660 RE=RE+1:S$=D$:GOSUB 5000:PUT#1,RE 2670 RE=RE+1:S$=N$+" "+O$:GOSUB 5000:PUT#1,RE 2680 RE=RE+1:S$=T$:GOSUB 5000:PUT#1,RE 2690 RE=RE+1:S$=K$:GOSUB 5000:PUT#1,RE 2700 RE=RE+1:S$=STR$(F):GOSUB 5000:PUT#1,RE 2710 RE=RE+1 2720 FOR P=1 TO F:S$=A$(P):GOSUB 5000:PUT#1,RE:RE=RE+1:NEXT P: S$=" 9999":GOSUB 5000:PUT#1,RE:CLOSE#1:MX=MX+F+6:MZ=MZ+1: M(MZ,1)=V+1:M(MZ,2)=F 2730 GOSUB 4200:GOSUB 4200:U=U+1:RETURN 2800 REM 2810 REM ***RETRIEVE MESSAGE*** 2820 REM 2830 GOSUB 4200:A1$="MSG # ("+STR$(IU)+" -"+STR$(U)+" )": IF NOT XPR THEN A1$=A1$+" to retrieve (c/r to end)" 2840 A1$=A1$+"?":GOSUB 4200:GOSUB 4400:GOSUB 4200 2850 IF LEN(B$)=0 THEN M=0 ELSE M=VAL(B$) 2860 IF M<1 THEN GOSUB 4200:RETURN 2870 IF M>U THEN A$="There aren't that many msg's, "+N$+".":GOSUB 4200:SAV$="":GOTO 2830 2880 GOSUB 4130:GOSUB 4200 2890 OPEN "R",1,"A:MESSAGES",65:RE=1:FIELD#1,65 AS RR$:MI=0 2900 MI=MI+1:IF (MI>MZ) OR BK THEN 3070 ELSE G=M(MI,1) 2910 IF GM THEN 3040 2930 GOSUB 5800:IF OK THEN 2940 ELSE RE=RE+M(MI,2):GOTO 2900 2940 RE=RE+1:GET#1,RE:GOSUB 5100:D$=S$ 2950 RE=RE+1:GET#1,RE:GOSUB 5100:NO$=S$ 2960 RE=RE+1:GET#1,RE:GOSUB 5100:T$=S$ 2970 RE=RE+1:GET#1,RE:GOSUB 5100:GOSUB 5930:K$=S$ 2980 RE=RE+1:GET#1,RE:J=VAL(RR$):GOSUB 4200 2990 A$="Msg #"+STR$(G)+" was entered on date "+D$+" from "+NO$:GOSUB 4200 3000 A$="To "+T$+" about "+K$:GOSUB 4200:GOSUB 4200 3010 RE=RE+1:FOR P=1 TO J:GET#1,RE:GOSUB 5100:A$=S$:GOSUB 4200 3020 IF BK THEN 3070 3030 RE=RE+1:NEXT P:GOSUB 4200 3040 IF RIGHT$(B$,1)<>"+" THEN CLOSE:GOTO 2810 3050 M=M+1:MI=0:RE=1 3060 IF M<=U AND NOT BK THEN 2900 3070 CLOSE:A$="End of msg's.":GOSUB 4200:GOSUB 4200:D$="":NO$="":RETURN 3100 REM 3110 REM ***SUMMARIZE MESSAGES*** 3120 REM COMMON CODE FOR S AND Q CMDS 3130 REM 3140 GOSUB 4200: A1$="Msg # ("+STR$(IU)+" -"+STR$(U)+" ) to start (C/R to end)?": GOSUB 4200:C=1:GOSUB 4400:C=0:GOSUB 4200 3150 IF LEN(B$)=0 THEN M=0 ELSE M=VAL(B$):GOSUB 4300 3160 IP=INSTR(B$,","):IF IP>0 THEN B$=MID$(B$,IP+1) ELSE ST=0:GOTO 3210 3170 IF LEN(B$)<3 THEN RETURN 3180 IF MID$(B$,2,1)<>"=" THEN RETURN 3190 SV$=MID$(B$,3):B$=LEFT$(B$,1):ST=INSTR("FTS",B$) 3200 IF ST=0 THEN RETURN 3210 IF M<1 THEN RETURN 3220 IF M>U THEN A$="There aren't that many msg's, "+N$+".":GOSUB 4200:SAV$="":RETURN 3230 IF NOT QU THEN GOSUB 4130:GOSUB 4200 3240 OPEN "R",1,"A:SUMMARY",30:RE=1:FIELD #1,28 AS RR$ 3250 GET #1,RE 3260 IF EOF(1) OR BK THEN 3430 ELSE G=VAL(RR$) 3270 IF G>9998 THEN 3430 3280 IF G"Y" THEN 3530 3560 OPEN "R",1,"A:COMMENTS",65:FIELD#1,65 AS RR$:GET#1,1:RE=VAL(RR$)+1:RL=65 3570 IF RE=1 THEN RE=2 3580 S$="From: "+N$+" "+O$:GOSUB 5000 3590 PUT#1,RE 3600 A$="Enter comments; to end, hit C/R.":GOSUB 4200 3610 A$="Ok>":N=1:GOSUB 4200:GOSUB 4400 3620 IF B$="" THEN 3630 ELSE RE=RE+1:S$=B$:RL=65:GOSUB 5000:PUT#1,RE:GOTO 3610 3630 S$=STR$(RE):RL=65:GOSUB 5000:PUT#1,1:CLOSE 3640 GOSUB 4200: A$="Character count: "+STR$(A)+" typed by system - "+STR$(D)+ " typed by you.":GOSUB 4200: A$="From Bruce: thanks for calling, "+N$+".":GOSUB 4200 3650 GOSUB 4680: TAC=CURT-TON 3660 IF TAC < 0 THEN TAC=TAC+1440 3670 A$="I enjoyed your call the past"+STR$(TAC)+" minutes.":GOSUB 4200 3680 A$="***** End of connection ******":GOSUB 4200:GOSUB 4200:SYSTEM 3700 REM 3710 REM ***KILL A MESSAGE*** 3720 REM 3730 GOSUB 4200:A1$="Message # to kill?":GOSUB 4200:GOSUB 4400 3740 IF LEN(B$)=0 THEN M=0 ELSE M=VAL(B$) 3750 IF M<1 THEN GOSUB 4200:RETURN 3760 IF M>U THEN A$="There aren't that many msg's, "+N$+".":GOSUB 4200:SAV$="":GOTO 3720 3770 A$="Scanning summary file...":GOSUB 4200: OPEN "R",1,"A:SUMMARY",30:RE=1:FIELD#1,30 AS RR$:RL=30 3780 GET#1,RE 3790 IF EOF(1) THEN 3960 ELSE G=VAL(RR$) 3800 IF G>9998 THEN 3960 3810 IF GM THEN 3960 3830 GOSUB 5800:IF NOT OK THEN 3960 3840 GOSUB 5100:PW=INSTR(S$,";"):PW$="" 3850 IF PW=0 OR N$+O$="SYSOP" OR PERS THEN PERS=0:GOTO 3870 3860 PW$=MID$(S$,PW+1):A1$="Password ?":GOSUB 4200:C=1:GOSUB 4400:C=0: IF B$<>PW$ THEN A$="Incorrect.":GOSUB 4200:GOSUB 4200:CLOSE:RETURN 3870 S$=" 0"+":"+STR$(G):GOSUB 5000:PUT#1,RE:CLOSE 3880 A$="Updating message file...":GOSUB 4200 3890 OPEN "R",1,"A:MESSAGES",65:RE=1:FIELD#1,65 AS RR$:MI=0 3900 MI=MI+1:IF MI>MZ THEN 3960 ELSE G=M(MI,1) 3910 IF G"*" THEN GOSUB 5100:A$=S$:GOSUB 4200 4050 IF BK THEN 4070 4060 NEXT I 4070 CLOSE:GOSUB 4200:RETURN 4100 REM 4110 REM **** PRINT CONTROL-CHAR INFO 4120 REM 4130 GOSUB 4200 4140 A$="Use ctl-K to abort, ctl-S to pause." 4200 REM 4210 REM ***PRINT STRING FROM A$ ON CONSOLE*** 4220 REM 4230 IF SAV$<>"" AND A1$<>"" THEN A1$="":RETURN 4240 IF A1$<>"" THEN A$=A1$:A1$="" 4250 IF RIGHT$(A$,1)="?" OR N=1 THEN PRINT A$;:PP$=A$:GOTO 4280 4260 BI=ASC(INKEY$+" "):IF BI=19 THEN BI=ASC(INPUT$(1)) 4270 IF BI=11 THEN BK=-1:GOTO 4300 ELSE PRINT A$ 4280 A=A+LEN(A$) 4290 IF N$+O$="SYSOP" AND INP(255)=1 THEN LPRINT A$;: IF N=0 AND RIGHT$(A$,1)<>"?" THEN LPRINT 4300 A$="":N=0 4310 RETURN 4400 REM 4410 REM ***ACCEPT STRING INTO B$ FROM CONSOLE*** 4420 REM 4430 IF BEL AND SAV$="" THEN PRINT CHR$(7); 4440 B$="":BK=0 4450 IF SAV$="" THEN GOSUB 6000 4460 SP=INSTR(SAV$,";"):IF SP=0 THEN B$=SAV$:SAV$="":GOTO 4480 4470 B$=LEFT$(SAV$,SP-1):SAV$=MID$(SAV$,SP+1) 4480 IF LEN(B$)=0 THEN RETURN 4490 IF C=0 THEN 4510 4500 FOR ZZ=1 TO LEN(B$):MID$(B$,ZZ,1)=CHR$(ASC(MID$(B$,ZZ,1))+32*(ASC(MID$(B$,ZZ,1))>96)):NEXT ZZ 4510 IF LEN(B$)<64 THEN 4560 4520 A$="Input line too long - would be truncated to:":GOSUB 4200 4530 B$=LEFT$(B$,63):PRINT B$ 4540 LINE INPUT "Retype line (Y/N)?";QQ$:QQ$=LEFT$(QQ$,1) 4550 IF QQ$="Y" OR QQ$="y" THEN PRINT PP$;:SAV$="":GOTO 4400 4560 D=D+LEN(B$):RETURN 4570 RETURN 4600 REM 4610 REM READ ENTER REAL TIME CLOCK/CALENDER 4620 REM 4630 GOSUB 4710: TON=CURT 4640 DM$=HEX$(PEEK(&H52)):DD$=HEX$(PEEK(&H53)) 4650 DY$="81":D$=DM$+"/"+DD$+"/"+DY$ 4660 DH$=HEX$(PEEK(&H50)):DM$=HEX$(PEEK(&H51)) 4670 DT$=DH$+":"+DM$: RETURN 4680 REM READ CLOCK NOW 4690 REM CLOCK=&HEDE3 4700 REM CALL CLOCK 4710 REM GET LAST CLOCK VALUE 4720 CURT = VAL(HEX$(PEEK(&H50)))*60+VAL(HEX$(PEEK(&H51))) 4730 RETURN 4800 REM ***ON ERROR HANDLER*** 4810 IF ERL=660 THEN RESUME 680 4820 IF ERL=5430 THEN RESUME 5450 4830 IF ERL=940 THEN RE=0:RESUME 950 4840 IF ERL=990 THEN M=0:RESUME 1000 4850 IF ERL=1010 THEN C=0:RESUME 1020 4860 IF ERL=1030 THEN U=0:RESUME 1040 4870 IF ERL=2130 THEN V=0:RESUME 2140 4880 IF ERL=2580 THEN C=0:RESUME 2590 4890 IF ERL=2600 THEN C=0:RESUME 2610 4900 RESUME NEXT 5000 REM 5010 REM FILL AND STORE DISK RECORD 5020 REM 5030 LSET RR$=LEFT$(S$+SPACE$(RL-2),RL-2)+CHR$(13)+CHR$(10) 5040 RETURN 5100 REM 5110 REM UNPACK DISK RECORD 5120 REM 5130 ZZ=LEN(RR$)-2 5140 WHILE MID$(RR$,ZZ,1)=" " 5150 ZZ=ZZ-1:IF ZZ=1 THEN 5170 5160 WEND 5170 S$=LEFT$(RR$,ZZ) 5180 IF MID$(S$,ZZ,1)="?" THEN S$=S$+" " 5190 RETURN 5200 REM 5210 REM *** TOGGLE EXPERT USER MODE 5220 REM 5230 XPR=NOT XPR:RETURN 5300 REM 5310 REM *** TOGGLE BELL PROMPT 5320 REM 5330 BEL=NOT BEL:RETURN 5400 REM 5410 REM SUBROUTINE TO PRINT A FILE 5420 REM 5430 OPEN "I",1,FIL$:BK=0 5440 IF EOF(1) OR BK THEN 5450 ELSE LINE INPUT #1,A$:GOSUB 4200:GOTO 5440 5450 CLOSE #1:RETURN 5500 REM FULL SUMMARY 5510 QU=0:GOSUB 3100:RETURN 5600 REM QUICK SUMMARY 5610 QU=-1:GOSUB 3100:RETURN 5700 REM PRINT "CALLERS" FILE...FOR SYSOP ONLY (PRIVATE CMD) 5710 GOSUB 4200 5720 IF N$+O$<>"SYSOP" THEN 1400' IF NOT SYSOP, SAY "I DON'T UNDERSTAND". 5730 OPEN "R",1,"A:CALLERS",60:FIELD #1,60 AS RR$:GET #1,1:SIZ=VAL(RR$) 5740 CA=CN 5750 FOR CNT=SIZ+1 TO 2 STEP -1 5760 GET #1,CNT:GOSUB 5100:A$=SPACE$(5-LEN(STR$(CA)))+STR$(CA)+" "+S$:GOSUB 4200:IF BK THEN 5790 5770 CA=CA-1 5780 NEXT CNT 5790 CLOSE:A$= "END OF CALLERS.":GOSUB 4200:GOSUB 4200:RETURN 5800 REM TEST FOR PERSONAL MESSAGES 5810 PERS=0:OK=-1:GET #1,RE:IF INSTR(RR$,";*")=0 THEN 5860 5820 PERS=-1 5830 IF N$+O$="SYSOP" THEN 5860 5840 GET #1,RE+3:GOSUB 5900:IF OK THEN 5860 5850 GET #1,RE+2:GOSUB 5900 5860 RETURN 5900 REM TEST 'FROM' OR 'TO' FIELD FOR USER'S NAME 5910 IF INSTR(RR$,N$)>0 AND INSTR(RR$,O$)>0 THEN OK=-1 ELSE OK=0 5920 RETURN 5930 IF PERS THEN S$="("+S$:S$=S$+")":PERS=0 5940 RETURN 6000 CHC=0: SAV$="" 6010 NCH=ASC(INPUT$(1)) 6020 IF NCH=127 THEN 6080 6030 IF NCH<32 THEN 6110 6040 IF CHC>=63 THEN 6010 6050 SAV$=SAV$+CHR$(NCH): CHC=CHC+1: PRINT CHR$(NCH); 6060 IF CHC=55 THEN PRINT CHR$(7); 6070 GOTO 6010 6080 IF CHC=0 THEN 6010 ELSE PRINT RIGHT$(SAV$,1);: GOTO 6100 6090 IF CHC=0 THEN 6010 ELSE PRINT ERS$; 6100 CHC=CHC-1: SAV$=LEFT$(SAV$,CHC): GOTO 6010 6110 IF NCH=8 THEN 6090 6120 IF NCH=13 THEN PRINT: RETURN 6130 IF NCH=21 THEN PRINT " #": GOTO 6000 6140 IF NCH<>24 OR CHC=0 THEN 6010 6150 FOR BCC=1 TO CHC: PRINT ERS$;: NEXT BCC: GOTO 6000