Roberts Labs BBS

Products: TINYBOARD
Developer(s): Kenneth Roberts
Date: 198x
Type: Program
Platform(s): TS 2068

Based on TinyBoard, with improvements.

Related Products

Bulletin board software, written by Randy and Lucy Gordon. The original Tinyboard BBS software program provided the ability of an unexpanded TS 2068 to serve as a host system. The program provided the “bare bones” essentials (no frills approach) to operate as a remote message base. The selections from the menu included reading, scanning, writing

Source Code

    3 REM SYMBL SHIFT S "NOT"         ENDS CHAT MODE FOR SYSOP.
    5 REM SYMBL SHIFT 2 "@"           SAVES MESSAGE FOR SYSOP.
   10 GO TO VAL "9000"
 1000 PRINT "AWAITING A CALL"
 1001 OUT VAL "119",VAL "34"
 1002 OUT VAL "119",NOT PI
 1010 PRINT AT VAL "4",NOT PI;"CHAT IS        ";b$
 1011 PRINT AT VAL "10",NOT PI;"CODE ENTRY IS  ";s$
 1012 PRINT AT PI+PI,NOT PI;"CALLS RECEIVED  ";s
 1014 PRINT AT VAL "8",NOT PI;"MESSAGES        ";w
 1015 LET a=IN CODE "w"
 1016 IF CODE INKEY$=CODE "NOT " THEN GO TO edit
 1020 IF a=VAL "5" THEN GO TO ansloop
 1070 OUT CODE "w",VAL "2"
 1080 OUT CODE "w",VAL "34"
 1090 PAUSE VAL "300"
 2001 OUT CODE "w",CODE "@": OUT CODE "w",CODE "{": OUT CODE "w",CODE "7": POKE VAL "23674",NOT PI: POKE VAL "23673",NOT PI: POKE VAL "23672",NOT PI
 2003 PAUSE CODE "x": CLS : GO SUB logonbull: LET x=IN CODE "s": LET p$="Full NAME: ": GO SUB send: GO SUB inname: LET u$=y$:: LPRINT u$
 2004 IF o=SGN PI THEN GO TO VAL "2006"
 2005 LET f=NOT PI: LET f1=f: LET p$="Code Input: ": GO SUB send: GO SUB incode
 2006 LET y=f: RESTORE VAL "2007"
 2007 DATA "--------------------------------","  *>*> EXECUTIVE MAIN MENU <*<*","<R>ead Messages  <L>eave Message","<C>hat Mode      <T>ime On","<D>aily Special  <S>ystems Data","<M>essage Log    <G>oodbye","--------------------------------","Choice?: "
 2008 GO SUB cr:: IF USR output THEN : OUT CODE "s",CODE " ": PRINT 
 2020 FOR p=SGN PI TO VAL "8": PRINT : IF USR output THEN : OUT CODE "s",VAL "13" AND p<VAL "8": READ p$: GO SUB send
 2034 NEXT p
 2036 GO SUB timer: IF VAL x$(VAL "4" TO SQR EXP PI)>VAL "30" THEN LET f1=SGN PI: GO TO quit
 2037 ON ERR GO TO quit: LET c$=CHR$ USR input: PRINT c$: PRINT 
 2038 IF c$="d" OR c$="D" THEN LET p$=h$: OUT CODE "s",VAL "13": GO SUB send: PAUSE CODE "x": GO TO inputcom
 2039 IF c$="s" OR c$="S" THEN LET p$=z$: OUT CODE "s",VAL "13": GO SUB send: PAUSE CODE "x": GO TO inputcom
 2040 IF c$="r" OR c$="R" THEN FOR x=SGN PI TO SQR PI: GO SUB cr:: NEXT x: GO TO read
 2041 IF c$="t" OR c$="T" THEN GO SUB timer: LET p$="Connect Time ": LET p$=p$+x$: GO SUB scr::: GO TO menu
 2043 IF c$="M" OR c$="m" THEN GO TO VAL "4500"
 2045 IF c$="c" OR c$="C" THEN GO TO chat
 2047 IF c$="g" OR c$="G" THEN PAUSE VAL "30": GO TO quit
 2050 IF c$="l" OR c$="L" THEN GO TO leave
 2070 GO TO inputcom
 3000 LET p$="Message Number? ": GO SUB send: GO SUB innum
 3015 LET y=numin
 3018 IF m$(y,SGN PI)=" " THEN LET p$(SGN PI TO VAL "28")="No message Found............": LET p$=p$(SGN PI TO VAL "28")+CHR$ PI: GO SUB scr::: GO TO inputcom
 3019 PRINT AT VAL "21",NOT PI;"                                ": PRINT AT VAL "21",NOT PI;y: LET c$=SCREEN$ (VAL "21",NOT PI): LET c$=c$+SCREEN$ (VAL "21",SGN PI): LET p$="MESSAGE NUMBER: "+c$: GO SUB cr: GO SUB scr
 3024 FOR v=SGN PI TO VAL "563": POKE VAL "23692",CODE " COPY "
 3025 IF CODE m$(y,v)=INT PI THEN LET v=VAL "564": NEXT v: PAUSE CODE "<": GO TO VAL "3036"
 3030 PRINT m$(y,v);: IF USR output THEN : OUT CODE "s",CODE m$(y,v)
 3031 IF v>CODE "@" THEN NEXT v
 3032 IF (v>CODE " " AND CODE m$(y,v)=VAL "13") THEN LET v=CODE "@": GO SUB cr:
 3033 IF (v<CODE " " AND CODE m$(y,v)=VAL "13") THEN LET v=CODE " "
 3035 NEXT v: GO SUB cr: GO SUB sendv
 3040 LET p$="Read Another? (Y/N) ": GO SUB scr:::
 3042 LET v$=CHR$ USR input: PRINT v$
 3045 IF v$="y" OR v$="Y" THEN GO TO read
 3060 GO TO inputcom
 4010 LET y1=y1+SGN PI: IF y1>CODE "(" THEN LET y1=SGN PI
 4011 DIM l$(VAL "564"): LET m$(y1)=l$
 4012 GO SUB cr: LET p$="To Whom? : ": GO SUB send: ON ERR GO TO inputcom: LET m$(y1,SGN PI TO VAL "4")="TO: ": FOR x=SQR EXP PI TO CODE " ": LET m$(y1,x)=CHR$ USR input: PRINT m$(y1,x);
 4013 IF CODE m$(y1,x)=VAL "13" THEN LET x=CODE " "
 4014 NEXT x
 4015 LET m$(y1,CODE "!" TO CODE "&")="FROM: ": LET m$(y1,CODE "'" TO CODE "@")=u$
 4018 GO SUB cr: LET p$="Input Message (500 chars Max)..Type<CONTROL C> To Save...": GO SUB scr:
 4019: FOR x=SGN PI TO SQR PI: GO SUB cr: NEXT x
 4020 ON ERR GO TO quit: FOR v=CODE "A" TO VAL "563": POKE VAL "23692",CODE " COPY ": LET m1=USR input
 4050 LET m$(y1,v)=CHR$ m1: PRINT m$(y1,v);: IF m1=INT PI THEN LET v=VAL "564": NEXT v: LET w=w+SGN PI: LET p$="SAVED...": GO SUB cr: GO SUB scr: PAUSE VAL "30": GO TO inputcom
 4053 IF CODE m$(y1,v)<VAL "8" OR CODE m$(y1,v)>CODE "z" THEN LET m$(y1,v)=CHR$ PI: LET v=VAL "564": NEXT v: GO TO inputcom
 4054 IF CODE m$(y1,v)>=VAL "24" AND CODE m$(y1,v)<=VAL "31" THEN LET m$(y1,v)=CHR$ PI: LET v=VAL "564": NEXT v: GO TO inputcom
 4055 NEXT v
 4070 GO TO inputcom
 4500 FOR q=SGN PI TO CODE "("
 4510 IF m$(q,1)="T" THEN GO SUB VAL "4600"
 4520 NEXT q
 4530 LET p$="END OF MESSAGE LOG -"
 4535 GO SUB scr: GO TO inputcom
 4600 PRINT AT VAL "21",NOT PI;"                                ": PRINT AT VAL "21",NOT PI;q: LET c$=SCREEN$ (VAL "21",NOT PI): LET c$=c$+SCREEN$ (VAL "21",SGN PI): LET p$="MESSAGE NUMBER: "+c$: GO SUB cr: GO SUB scr
 4610 LET p$=m$(q,SGN PI TO VAL "28")
 4620 GO SUB send: GO SUB cr: RETURN 
 5000 LET n$="\d\i\s\c\oN\n\e\c\t": BORDER NOT PI: CLS 
 5001 ON ERR RESET 
 5105 CLS : PAUSE PI*PI
 5110 LET p$="*****Thank You For Calling!*****"+q$+"    >>ROBERTS LABS. B.B.S.<<    "+q$+"      Goodbye - "
 5112 IF f=SGN PI THEN LET p$(SGN PI TO VAL "28")="YOU ENTERED AN IMPROPER CODE"
 5113 IF f1=SGN PI THEN LET p$(SGN PI TO VAL "28")="SORRY - YOUR TIME IS UP....."
 5115 PAUSE VAL "30": CLS : IF USR output THEN : OUT CODE "s",VAL "28": IF USR output THEN : OUT CODE "s",VAL "31"
 5120 GO SUB send
 5121 PAUSE CODE "x"
 5125 OUT CODE "w",CODE "@": OUT CODE "w",NOT PI: OUT CODE "w",NOT PI
 5130 PAUSE CODE "x": CLS : GO TO autoans
 6000 LET s=s+SGN PI
 6001 PAUSE CODE "<": FOR x=SGN PI TO VAL "30": IF USR output THEN : OUT CODE "s",NOT PI: NEXT x
 6002 IF IN CODE "w"<CODE "\  " THEN GO TO quit
 6005 IF USR output THEN : OUT CODE "s",VAL "28": IF USR output THEN : OUT CODE "s",VAL "31"
 6008 IF USR output THEN : OUT CODE "s",VAL "28"
 6010 FOR x=SGN PI TO VAL "10": GO SUB cr: NEXT x
 6020 FOR x=SGN PI TO LEN t$: POKE VAL "23692",CODE " COPY ": PRINT t$(x);: IF USR output THEN : OUT CODE "s",CODE t$(x): NEXT x
 6025 FOR x=SGN PI TO LEN j$: POKE VAL "23692",CODE " COPY ": PRINT FLASH SGN PI;j$(x);: IF USR output THEN : OUT CODE "s",CODE j$(x): NEXT x
 6030 FOR x=SGN PI TO SQR EXP PI: GO SUB cr: NEXT x
 6040 RETURN 
 6500 CLS : LET t$=""
 6510 INPUT AT VAL "22",NOT PI;AT NOT PI,NOT PI; LINE t$
 6530 CLS : GO TO VAL "8500"
 6600 CLS : LET h$=""
 6610 INPUT AT VAL "22",NOT PI;AT NOT PI,NOT PI; LINE h$
 6630 CLS : GO TO VAL "8500"
 7000 IF b=SGN PI THEN GO TO VAL "7007"
 7001 REM ON ERR GO TO inputcom
 7003 RANDOMIZE USR 65200
 7004 PRINT : GO SUB cr: LET p$="PAGING SYSOP........": GO SUB send: FOR x=SGN PI TO PI*PI: BEEP VAL ".1",SGN PI: NEXT x: GO SUB cr:
 7005 FOR x=SGN PI TO VAL "128": IF INKEY$<>"" THEN GO TO VAL "7008"
 7006 IF INKEY$="" THEN PRINT "-";: IF USR output THEN : OUT CODE "s",CODE ".": BEEP VAL ".1",PI*PI: NEXT x
 7007 LET p$="The SYSOP is NOT AVAILABLE.....": GO SUB send: FOR x=SGN PI TO PI*PI: BEEP VAL ".1",SGN PI: NEXT x: GO SUB cr: GO TO menu
 7008 GO SUB cr: LET p$="YOU ARE NOW IN CHAT MODE:": GO SUB send: FOR X=SGN PI TO PI*PI: BEEP VAL ".1",SGN PI: NEXT X: GO SUB cr
 7009 CLS : PRINT "You are in chat with            ";u$: PRINT : PRINT "SYMBL SHIFT/NOT TO ESCAPE..."
 7010 IF CODE INKEY$=CODE "NOT " THEN GO TO inputcom
 7011 POKE VAL "23692",CODE " COPY "
 7020 LET rxrdy=NOT PI: LET txrdy=NOT PI
 7100 LET a=USR VAL "65000": LET txrdy=SGN PI AND (a=SGN PI OR a=INT PI): LET rxrdy=SGN PI AND (a=VAL "2" OR a=INT PI)
 7130 IF rxrdy THEN LET k=USR VAL "65100": PRINT CHR$ k;: IF k=VAL "13" THEN PRINT ">";
 7140 IF txrdy AND INKEY$<>"" THEN GO SUB VAL "7160"
 7150 GO TO VAL "7010"
 7160 IF txrdy THEN LET i$=INKEY$: PRINT i$;: OUT CODE "s",CODE i$: FOR x=SGN PI TO SQR EXP PI: NEXT x: IF CODE i$=VAL "13" THEN PRINT ">";
 7161 IF INKEY$<>"" THEN GO TO VAL "7161"
 7162 RETURN 
 7500 DIM g$(2): LET u=SGN PI: GO SUB sendv
 7515 ON ERR GO TO inputcom
 7520 LET v$=CHR$ USR input: IF CODE v$>CODE "/" AND CODE v$<CODE ":" THEN PRINT v$;
 7521 IF CODE v$=VAL "13" THEN GO TO VAL "7530"
 7522 IF CODE v$<CODE STR$ TAN PI OR CODE v$>CODE "9" THEN GO TO VAL "7500"
 7525 LET g$(u)=v$: IF u<INT PI THEN LET u=u+SGN PI
 7530 IF CODE v$=VAL "13" OR u>VAL "2" THEN GO TO VAL "7550"
 7540 GO TO VAL "7520"
 7550 LET numin=VAL g$
 7560 IF numin<SGN PI OR numin>CODE "(" THEN LET numin=SGN PI
 7570 RETURN 
 7600 LET f=NOT PI
 7610 ON ERR GO TO quit
 7630 GO SUB sendv: GO SUB inname: LET x$=y$: PRINT x$
 7640 IF x$=o$ THEN RETURN 
 7650 LET f=SGN PI: GO TO quit
 8001 DIM y$(CODE " "): LET u=SGN PI: GO SUB sendv
 8005 ON ERR GO TO quit: LET v$=CHR$ USR input: PRINT v$;
 8010 LET y$(u)=v$ AND u<CODE " ": LET u=u+SGN PI
 8011 IF CODE v$=VAL "13" THEN GO TO menu
 8020 GO TO VAL "8005"
 8100 FOR x=SGN PI TO LEN p$: POKE VAL "23692",CODE " COPY ": IF USR output THEN : OUT CODE "s",CODE p$(x): PRINT p$(x);: NEXT x: IF c$="c" OR c$="C" THEN RETURN 
 8105 FOR q=SGN PI TO LEN n$: POKE VAL "23692",CODE " COPY ": IF USR output THEN : OUT CODE "s",CODE n$(q): PRINT ; FLASH SGN PI;n$(q);: NEXT q
 8106 RETURN 
 8150 PRINT : IF USR output THEN : OUT CODE "s",VAL "13": RETURN 
 8175 IF USR output THEN : OUT CODE "s",SQR EXP PI: RETURN 
 8200 CLS : PRINT " The CODE is";AT SQR PI,NOT PI;o$;AT VAL "4",NOT PI;" Is this OK? Y/N": INPUT a$: LET o=o+SGN PI
 8210 IF a$="n" THEN PRINT '" INPUT CODE UP TO 32 CHARACTERS";: INPUT k$: IF a$="n" THEN LET o$=k$
 8500 BORDER PI: CLS 
 8501 IF o=SGN PI THEN LET s$="OFF": GO TO VAL "8510"
 8502 LET o=NOT PI: LET s$="ON "
 8505 IF b=SGN PI THEN LET b$="OFF": GO TO VAL "8510"
 8508 LET b$="ON  ": LET b=NOT PI
 8510: PRINT AT NOT PI,VAL "12";"SYSOP MENU";AT SQR PI,NOT PI;"<R>EAD MESSAGES"," <P>ASSWORD ";s$;AT VAL "4",NOT PI;"<D>ELETE MESSAGES";AT VAL "6",NOT PI;"<L>EAVE MESSAGES";AT VAL "8",NOT PI;"<Q>UIT MENU","  <C>HAT IS ";b$;AT VAL "10",NOT PI;"<S>AVE MESSAGE BASE";AT VAL "12",NOT PI;"<N>EW LOGON BULLETIN";AT VAL "14",NOT PI;"<I>NPUT DAILY SPECIAL";AT VAL "16",NOT PI;"<E>NTER SYSTEMS DATA";AT VAL "18",NOT PI;"<V>IEW LOGON & SPECIAL"
 8520 LET i$=INKEY$
 8521 IF I$="n" THEN GO TO VAL "6500"
 8522 IF i$="q" THEN GO TO quit
 8523 IF i$="i" THEN GO TO VAL "6600"
 8524 IF i$="v" THEN GO TO VAL "8600"
 8525 IF i$="" THEN GO TO VAL "8520"
 8526 IF i$="s" THEN GO TO VAL "9999"
 8527 IF i$="e" THEN GO TO VAL "8800"
 8528 IF i$="p" THEN GO TO VAL "8200"
 8529 IF i$="c" THEN LET b=b+SGN PI: GO TO VAL "8505"
 8530 IF i$="r" THEN INPUT ;"MESSAGE #?: ";x: CLS : PRINT "MESSAGE # ";x: PRINT m$(x)(SGN PI TO CODE " ")'m$(x)(CODE "!" TO CODE "@")'m$(x)(CODE "A" TO ): PRINT "PRESS ENTER TO CONTINUE": PAUSE NOT PI: GO TO edit
 8540 IF i$="d" THEN INPUT "message #?: ";x: PRINT "message # ";x;" deleted.": LET m$(x)=l$: LET m$(x,SGN PI TO VAL "28")="NO MESSAGE FOUND............": PAUSE NOT PI: GO TO edit
 8550 IF i$="l" THEN LET y1=y1+SGN PI: CLS : PRINT "message # ";y1: PRINT : GO SUB VAL "8700": FOR x=SGN PI TO VAL "564": LET m$(y1,x)=w$(x): PRINT m$(y1,x);
 8551 IF m$(y1,x)="@" THEN LET m$(y1,x)=CHR$ PI: LET x=VAL "600": PRINT "SAVED...": PAUSE CODE "<": GO TO VAL "8500"
 8554 IF i$="l" THEN IF CODE INKEY$=CODE "NOT " THEN LET m$(y1,x)=CHR$ PI: GO TO edit
 8560 IF i$="l" THEN NEXT x: PAUSE NOT PI: GO TO edit
 8599 CLS : GO TO edit
 8600 CLS : PRINT "LOGON"'t$: PAUSE NOT PI
 8610 CLS : PRINT "DAILY"'h$: PAUSE NOT PI
 8620 GO TO VAL "8500"
 8700 INPUT AT VAL "22",NOT PI;AT SQR PI,NOT PI; LINE w$
 8710 RETURN 
 8800 INPUT AT VAL "22",NOT PI;AT NOT PI,NOT PI; LINE z$
 8810 GO TO VAL "8500"
 9004 PAPER NOT PI: BORDER NOT PI: INK VAL "7": CLS 
 9005 CLEAR VAL "64999": GO SUB VAL "9500"
 9006 LET c$="": LET u$="": LET z$="": LET f1=NOT PI: DIM y(SGN PI,SGN PI): LET y1=NOT PI: DIM l$(VAL "564"): DIM m$(CODE "(",VAL "564"): FOR x=SGN PI TO CODE "(": LET m$(x)="NO MESSAGES FOUND..."+CHR$ PI: NEXT x: FOR x=SGN PI TO PI: BEEP VAL ".1",EXP PI: NEXT x: PRINT '"Do you wish to LOAD a message   base?": INPUT x$: IF x$="y" OR x$="Y" THEN PRINT '"Start MESSAGE BASE tape...       (2 part LOAD...)": LOAD "" DATA m$(): LOAD "" DATA y(): LET y1=y(SGN PI,SGN PI)
 9007 LET q$="                                ": LET t$="      ROBERTS LABS. B.B.S.      "+q$+q$: LET j$="   For PROFESSIONAL use only.   ": FOR x=SGN PI TO PI: BEEP VAL ".1",EXP PI: NEXT x: PRINT '"Do You wish to load a logon     bulletin?": INPUT x$: IF x$="y" THEN PRINT '"Start bulletin Tape...": LOAD "" DATA t$()
 9008 PRINT '"<NOT> from most modes will exit to SYSOP mode.": PAUSE CODE "TAN "
 9009 LET f=NOT PI: LET y=NOT PI: LET edit=VAL "8500": LET timer=VAL "9990": LET innum=VAL "7500": LET z$="\''"
 9010 LET sendv=VAL "8175": LET scr=VAL "4620": LET cr=VAL "8150": LET chat=VAL "7000": LET menu=VAL "2006": LET warmstart=VAL "2000": LET logonbull=VAL "6000": LET statchk=VAL "65000": LET input=VAL "65100": LET output=VAL "65200": LET ansloop=VAL "1010": LET inputcom=VAL "2006": LET autoans=VAL "1000": LET read=VAL "3000": LET leave=VAL "4000": LET quit=VAL "5000"
 9011 LET send=VAL "8100": LET inname=VAL "8000": LET incode=VAL "7600": LET h$="No new daily message": LET b$="ON ": LET w=NOT PI: LET s=w: LET b=w: LET o$=".": LET s$="ON": LET o=w
 9012 PRINT '''"  "; FLASH SGN PI;"Now going to autoans mode": PAUSE CODE "TAN ": CLS 
 9100 GO TO quit
 9510 RESTORE VAL "9515": FOR x=VAL "65000" TO VAL "65008": READ x1: POKE x,x1: NEXT x
 9515 DATA 175,219,119,230,3,79,6,0,201
 9520 RESTORE VAL "9525": FOR x=VAL "65100" TO VAL "65132": READ x1: POKE x,x1: NEXT x
 9525 DATA 219,119,230,128,200,175,219,119,230,2,40,244,219,115,6,0,79,219,119,230,128,200,175,219,119,230,1,40,244,121,211,115,201
 9530 RESTORE VAL "9535": FOR x=VAL "65200" TO VAL "65212": READ x1: POKE x,x1: NEXT x
 9535 DATA 219,119,230,128,200,175,219,119,230,1,40,244,201
 9540 RETURN 
 9992 DIM x$(SQR EXP PI): LET time=INT ((PEEK VAL "23672"+VAL "256"*PEEK VAL "23673"+VAL "256"*VAL "256"*PEEK VAL "23674")/CODE "<"): LET hr=INT (time/CODE "<"/CODE "<"): LET min=INT ((time-(hr*CODE "<"*CODE "<"))/CODE "<"): PRINT AT VAL "21",EXP INT PI;"0" AND hr<VAL "10";hr;":";"0" AND min<VAL "10";min: FOR x=SGN PI TO SQR EXP PI: LET x$(x)=SCREEN$ (VAL "21",x+VAL "19"): NEXT x
 9993 RETURN 
 9995 BORDER NOT PI: PAPER NOT PI: INK VAL "7": CLS 
 9996 GO TO PI*PI
 9997 SAVE "rbbs" LINE VAL "9995"
 9998 STOP 
 9999 SAVE "mbase" DATA m$(): LET y(SGN PI,SGN PI)=y1: SAVE "msctr" DATA y(): GO TO edit
Scroll to Top