BBSes

Date: 198x
Type: Program
Platform(s): TS 2068
Tags: BBS

A group of programs used to host BBSs. Recovered from several unlabeled cassettes.

Includes:

  • 1stUG BBS
  • A & J BBS
  • Farmers BBS
  • Ralph BBS
  • TSBBS

The first three programs (1stUG BBS, A&J BBS, and Farmers BBS) share a common ancestry in a package called “TSTinyboard”, with each operator customizing the DATA statements, welcome messages, and sysop access credentials; the fourth (TS-BBS, attributed to “Willie’s TS-BBS”) is a more independently structured variant with a separate user-file system tracking up to 50 users with passwords, call counts, and message-waiting flags.

All four programs use RANDOMIZE USR with fixed machine code addresses to transmit and receive serial data through the modem port (OUT 119 for modem control, OUT 115 for serial data output), and the machine code routines are POKEd in from DATA statements at initialization.

The programs store up to 20 or 40 messages in a dimensioned string array and use CHR$ 3 (ETX) as an end-of-message sentinel; message bases can be saved and loaded from tape or microdrive.

Line-number variables (such as nl, sm, beep, menu, cls, con, leave, chat, edit, quit) are used throughout as indirect GO TO/GO SUB targets.


Program Analysis

Overview and Family Relationships

These four programs represent a family of BBS implementations sharing a common codebase called “TSTinyboard,” credited to Randy & Lucy Gordon and extensively modified by Paul Holmgren (PEH Software, 1986). The 1stUG BBS, A&J BBS, and Farmers BBS are all derivatives of TSTinyboard, while TS-BBS (“Willie’s TS-BBS”) is a more ambitious independent rewrite with a full user database. All four target a 300-baud modem on port 119 (modem control) and port 115 (serial data), consistent with the TS2050 modem hardware.

Machine Code Routines

All four programs rely on small machine code stubs POKEd from DATA statements at startup. These routines handle serial I/O at addresses that vary slightly between implementations:

  • 1stUG/Ralph BBS: rcv=26724, xmt=26759 — fixed ROM entry points for receive and transmit.
  • A&J BBS: Machine code is POKEd to addresses 6500065212; three separate routines handle status check (statchk=65000), receive (input=65100), and transmit (output=65200).
  • Farmers BBS: Same three-routine layout as A&J BBS, POKEd to the same addresses, with identical DATA byte sequences.
  • TS-BBS: Loads machine code from a separate cassette file named bbsmc using LOAD "bbsmc"CODE, storing 2200 bytes at address 65000.

The A&J and Farmers BBS DATA bytes for the receive routine (65100–65145) implement a polling loop: IN 119 checks modem status, tests bit 7 (carrier detect, AND 128), times out to return 0, then reads a byte from port 115 when ready. The transmit routine at 65200 similarly polls for the transmit-ready bit before outputting.

Program Structure

All four programs follow a similar call flow:

  1. Initialization: dimension arrays, POKE machine code, set line-number variables as indirect jump targets.
  2. Auto-answer loop: poll IN 119 for ring indication (value 5), answer with OUT 119,2 then OUT 119,34.
  3. Warm start: configure UART registers (OUT 119,64; OUT 119,123; OUT 119,55 for 7-bit even parity, 1 stop bit).
  4. Logon bulletin, caller name input, main menu dispatch.
  5. Message read/leave, chat, quick scan, utilities, and sysop editor.
  6. Disconnect: OUT 119,64; OUT 119,0 to drop carrier.

Line-Number Variables as Jump Targets

The 1stUG and Ralph BBS programs make heavy use of numeric variables holding line numbers, used as the destination in GO TO ret or GO SUB nl. Examples include nl=30, sm=41, beep=60, menu=270, cls=380, con=580. This avoids storing literal line numbers in every branch, saving tokenized program space. GO TO VAL "number" is also used extensively for the same reason, preventing the interpreter from storing a two-byte line-number reference.

Message Storage

Messages are stored in a dimensioned string array m$. The field layout is consistent across the TSTinyboard family:

ColumnsContent
1–32“TO: ” + recipient name
33–64“FROM: ” / “From: ” + sender name
65–endMessage body, terminated by CHR$ 3 (ETX)

The 1stUG and Ralph BBS use DIM m$(41,600) (40 user messages plus one sysop slot at index sm=41). A&J and Farmers BBS use DIM m$(20,1000), allowing longer messages but fewer slots. TS-BBS uses DIM m$(50,500) with a separate parallel array m(50) tracking whether each slot is occupied.

Date/Time Handling

All programs use the system frame counter at addresses 23672–23674 (the three-byte ticker incremented 50 times per second). Time is reconstructed by reading PEEK 23672 + 256*PEEK 23673 + 65536*PEEK 23674 and dividing by 3600 (frames per hour at 50 Hz). The 1stUG BBS contains a notable bug in its timer: it divides by beep (which is set to 60 at line 1860) rather than 60 to get hours, meaning the time computation uses the correct divisor only by coincidence of the variable’s value. Ralph BBS corrects this by using 60 explicitly in the arithmetic. TS-BBS resets the clock to zero at logon (POKE 23672,0 etc.) to measure session duration rather than wall time.

Serial Output Idiom

The standard idiom for sending a character to the caller combines local screen display with remote transmission:

POKE 23692,255: PRINT p$(x);: RANDOMIZE USR output: OUT 115,CODE p$(x)

The POKE 23692,255 resets the scroll counter to prevent the “scroll?” prompt. RANDOMIZE USR output calls the transmit-ready polling routine (return value is discarded by RANDOMIZE), and OUT 115,CODE p$(x) sends the byte. Some routines call the machine code address directly via USR and test the return value for carrier-detect.

Chat Mode

All four programs implement a half-duplex chat mode. The A&J and Farmers BBS versions call a status-check routine at address 65000 that returns 1 (transmit ready), 2 (receive ready), or 3 (both). The 1stUG and Ralph BBS chat modes use USR 26715 for the same purpose. TS-BBS implements chat similarly at line 7100. The sysop exits chat via SYMBOL SHIFT+NOT (producing the token STEP in the listing — rendered as the keyword token — code 195).

Sysop Editor

Each program includes a local sysop editor accessible by pressing NOT/STEP on the sysop’s keyboard. The editor provides read, delete, and leave-message operations operating directly on the m$ array, as well as clock-set and save functions. The 1stUG and Ralph BBS editors use PAUSE ed (where ed=NOT PI=0 normally, meaning no pause) as a convenient zero-wait. When the sysop is composing a message via the editor, ed is set to a non-zero value to signal the message-entry routine to store the result differently.

A&J BBS: Dual Message Base

The A&J BBS adds a message-base switching feature absent from the other three. Two bases (“General” and “Humor/Insults”) are stored on separate microdrive files (@mess1/@msg1 and @mess2/@msg2). Switching saves the current base and loads the other atomically. Message counters y1y4 track the circular write pointer, total message count, and bank number, stored in a DIM y(4,1) array saved alongside the message data.

TS-BBS: User Database

TS-BBS is the most feature-complete of the four. It maintains arrays f$(50,20) (first names), l$(50,20) (last names), w$(50,8) (passwords), z$(50) (last-call date), t(50) (call count), and w(50) (message-waiting count). New users are prompted for a password and welcomed; returning users are verified against their stored password and shown their call count and last-call date. The getkey subroutine at line 7235 implements a full line-input buffer with backspace handling and CTRL-C termination, used consistently throughout.

Notable Bugs and Anomalies

  • 1stUG BBS line 210: LET temp=hr*beep+min uses beep=60 as a multiplier for hours, which accidentally produces the correct result (hours×60+minutes = total minutes), but the variable name is misleading and its reuse for BEEP loop counts at line 70 is confusing.
  • Farmers BBS: The auto-answer loop at lines 40–120 references GO TO 40 but line 40 does not exist; this is a valid technique that causes execution to fall through to the next available line.
  • A&J BBS line 2744: The subroutine starting at line 2744 (IF y3>20 THEN LET y2=y2+1: RETURN) is never reachable by a direct GO SUB 2744 call — line 2740 contains GO SUB 2740 and line 2754 the counter-wrap; line 1600 calls GO SUB 2744 which would fall into line 2754 directly.
  • TS-BBS line 7150: References GO TO 7010, which does not exist; execution falls to line 7015 (the POKE 23692 line), which is harmless but slightly wasteful.
  • Ralph BBS line 910: LPRINT "Tried caht" — “chat” is misspelled as “caht.”

Content

Appears On

Related Products

Related Articles

Related Content

Image Gallery

BBSes

Source Code

 1stUG BBS
 
    0 REM CODE FLASH w NEW O<>CODE FLASH w NEW   >=CODE FLASH w NEW ( POKE FLASH sO FLASH w NEW   >=CODE FLASH w NEW ( POKE y OPEN #s<>CODE FLASH w NEW   >=CODE FLASH w NEW ( POKE <>
   10 GO TO VAL "1820"
   20 REM send a nl= NEW LINE 
   30 POKE 23692,255: PRINT : RANDOMIZE USR xmt: OUT 115,nlv: RETURN 
   40 REM PRINT TO caller 
   50 GO SUB nl: PRINT p$;: FOR x=SGN PI TO LEN p$: RANDOMIZE USR xmt: OUT 115,CODE p$(x): NEXT x: RETURN 
   60 REM BEEP 
   70 FOR x=9 TO 2 STEP -SGN PI: BEEP .2,15: NEXT x: RETURN 
   80 REM test FOR sysop access 
   90 IF IN mc<128 THEN GO TO VAL "1250"
  100 IF INKEY$="c" OR INKEY$="C" THEN GO TO chat
  110 IF INKEY$="NOT " THEN GO TO edit
  120 GO TO ret
  130 REM CLOSE # modem 
  140 GO SUB VAL "1770"
  150 OUT mc,34: OUT mc,ed
  160 REM test FOR IN call 
  170 GO SUB VAL "1290": PRINT AT 17,27;T$(2): LET ret=VAL "180": GO TO VAL "110"
  180 IF IN mc=5 THEN GO TO 170
  190 OUT mc,2: OUT mc,34: PAUSE ret
  200 REM start/set on LINE time 
  210 ON ERR GO TO 1250: OUT mc,64: OUT mc,123: OUT mc,55: GO SUB beep: LET temp=hr*beep+min
  220 LET nlv=CODE l$: LET p$="Hello"+l$+"Hello, Is this 2 lines Y/N >": GO SUB sm
  230 LET c$=CHR$ USR rcv: IF c$="y" OR c$="Y" THEN GO TO VAL "1020"
  240 IF c$="n" OR c$="N" THEN LET nlv=10: GO TO VAL "1020"
  250 GO TO 230
  260 REM menu 
  270 RESTORE VAL "1350": ON ERR GO TO VAL "1720": GO SUB cls: GO SUB 1160
  280 LET p$="(C,G,L,Q,R,T,U)? ": GO SUB sm: LET c$=CHR$ USR rcv: PRINT c$: GO SUB nl
  290 IF c$="c" OR c$="C" THEN GO TO chat
  300 IF c$="g" OR c$="G" THEN GO TO quit
  310 IF c$="l" OR c$="L" THEN GO TO leave
  320 IF c$="q" OR c$="Q" THEN GO TO VAL "840"
  330 IF c$="r" OR c$="R" THEN GO SUB nl: GO TO read
  340 IF c$="t" OR c$="T" THEN GO SUB VAL "1290": GO SUB sm: GO TO VAL "280"
  350 IF c$="u" OR c$="U" THEN GO TO VAL "1190"
  360 GO TO VAL "280"
  370 REM CLS SCREEN$ ,12=FF 
  380 CLS : OUT 115,12: RETURN 
  390 REM FORMAT & READ header 
  400 LET p1=32: LET p2=64: LET c$=m$(y, TO p2): FOR x=5 TO p2
  410 IF c$(x)=l$ AND x<=32 THEN LET p1=x: LET x=39
  420 IF c$(x)=l$ AND (x>32) AND (x<=64) THEN LET p2=x: LET X=64
  430 NEXT x: LET p$="Message :"+STR$ y+"  "+d$(y*14-13 TO y*14)+l$+c$( TO p1)+c$(33 TO p2): RETURN 
  440 REM READ mess 
  450 LET p$="Message 1 to 40, Menu=0 >? ": GO SUB sm: LET c$="   ": ON ERR GO TO menu
  460 FOR x=SGN x TO PI: LET c$(x)=CHR$ USR rcv: IF c$(2)=l$ THEN LET c$=c$(SGN PI): GO TO VAL "500"
  470 IF c$(PI)=l$ THEN LET c$=c$( TO 2): GO TO VAL "500"
  480 IF (c$(x)<"0") OR (c$(x)>"9") THEN GO TO VAL "450"
  490 NEXT x: IF LEN c$>2 THEN GO TO read
  500 GO SUB nl: LET y=VAL c$: IF NOT y THEN GO TO menu
  510 IF m$(y,1)=" " THEN GO TO VAL "1760"
  520 GO SUB 390: LET p$=p$+m$(y,65 TO )
  530 GO SUB cls: PRINT ''"Working": FOR x=SGN PI TO LEN p$: LET c=CODE p$(x): IF c=3 THEN GO TO VAL "560"
  540 RANDOMIZE USR xmt: OUT 115,c
  550 NEXT x: LET x=x-SGN PI
  560 GO SUB nl: PRINT p$( TO x): LPRINT "Read mess. "+STR$ y: GO TO VAL "450"
  570 REM con= CONTINUE  
  580 GO SUB nl: LET p$="Press  <ENTER>  when ready": GO SUB sm
  590 IF CHR$ USR rcv=l$ THEN GO TO ret
  600 GO TO VAL "590"
  610 REM leave message
  620 GO SUB CLS: LET p$="Is this message for Sysop Y/N>": GO SUB sm: LET c$=CHR$ USR rcv: IF c$="y" OR c$="Y" THEN GO TO VAL "1800"
  630 GO SUB nl: FOR y=SGN PI TO VAL "40"
  640 IF m$(y,1)=" " THEN GO TO VAL "660"
  650 NEXT y: GO TO VAL "1740"
  660 IF ed THEN GO TO VAL "1670"
  670 LPRINT "Left mess. #";y
  680 LET p$="Who Gets Mess. "+STR$ y+"?": GO SUB sm: GO SUB nl: LET m$(y)="TO: ": FOR x=5 TO 31
  690 LET m$(y,x)=CHR$ USR rcv: IF m$(y,x)=CHR$ 8 THEN LET x=x-SGN PI: GO TO 690
  700 IF m$(y,x)=l$ THEN GO TO VAL "720"
  710 PRINT m$(y,x);: NEXT x: LET m$(y,x)=l$
  720 LET m$(y,33 TO )="From: "+n$: LET p$="Input Message (535 chars max).. <CTRL C> to save...": GO SUB sm: GO SUB nl
  730 LET ret=VAL "780": FOR x=CODE "A" TO VAL "600"
  740 LET c=USR rcv: IF c=8 THEN LET x=x-SGN x: GO TO VAL "740"
  750 IF x<65 THEN GO TO VAL "720"
  760 LET m$(y,x)=CHR$ c: PRINT m$(y,x);: IF c=INT PI THEN GO TO VAL "790"
  770 GO TO 90
  780 NEXT x: LET x=VAL "600"
  790 IF ed THEN LET ed=x
  800 LET p$="Message"+(" full and" AND x>=600)+" saved.": GO SUB sm: GO SUB 830: IF ed THEN GO TO VAL "1810"
  810 GO TO VAL "870"
  820 REM FORMAT date/time 
  830 GO SUB 1290: LET d$(y*14-13 TO y*14)=p$: RETURN 
  840 REM Quick scan 
  850 LET ret=VAL "860": FOR y=SGN PI TO 40: IF m$(y,1)<>" " THEN GO SUB 390: GO SUB sm: IF NOT ed THEN GO TO 90
  860 NEXT Y: IF ed THEN LET ed=NOT PI: GO TO VAL "1710"
  870 LET ret=menu: GO TO con
  880 REM chat 
  890 LET p$="Paging sysop....": GO SUB sm
  900 FOR x=SGN x TO VAL "144": IF INKEY$="" THEN PRINT ".";: RANDOMIZE USR xmt: OUT 115,46: BEEP .1,15: NEXT x: LET p$="Sorry, all we found were cobwebs": GO SUB sm: LPRINT "Tried Chat": PAUSE con: GO TO menu
  910 GO SUB cls: LET p$=N$+"entering chat mode": GO SUB sm: GO SUB nl: POKE 23658,ed: PRINT '"SYMBL SHIFT/NOT TO LEAVE CHAT"
  920 IF INKEY$="NOT " THEN GO TO edit
  930 LET rcv1=ed: LET xmt1=ed
  940 LET x=USR 26715: LET Xmt1=x AND (x=1 OR x=3): LET Rcv1=x AND (x=2 OR x=3)
  950 IF Rcv1 THEN LET c=USR rcv: PRINT CHR$ c;: IF c=CODE l$ THEN PRINT '">";
  960 IF Xmt1 AND INKEY$<>"" THEN GO TO 980
  970 GO TO 920
  980 IF Xmt1 THEN LET c$=INKEY$: PRINT c$;: OUT 115,CODE c$: FOR x=NOT PI TO PI: NEXT x: IF c$=l$ THEN RANDOMIZE USR xmt: OUT 115,62
  990 IF INKEY$<>"" THEN GO TO 990
 1000 GO TO 920
 1010 REM send logon SCREEN$ 
 1020 RESTORE VAL "1380": GO SUB cls: GO SUB VAL "1160": LET ret=VAL "1040": GO TO con
 1030 REM send bulletin  
 1040 RESTORE VAL "1410": GO SUB cls: GO SUB VAL "1160"
 1050 REM INPUT callers name 
 1060 LET p$="Who's calling?"+l$: GO SUB sm: LET N$="                           ": RANDOMIZE USR xmt: OUT 115,5: GO SUB beep: FOR x=SGN x TO LEN n$
 1070 LET n$(x)=CHR$ USR rcv: IF n$(x)=CHR$ 8 THEN LET x=x-SGN PI: GO TO 1070
 1080 IF x<SGN PI THEN GO TO VAL "1060"
 1090 IF n$(x)=l$ THEN GO TO 1110
 1100 PRINT n$(x);: NEXT x: LET x=x-SGN PI: LET n$=n$+l$
 1110 LET n$=n$( TO x): IF LEN n$<5 THEN GO TO VAL "1060"
 1120 LET p$=N$+"Correct (Y/N) >": GO SUB sm: LET c$=CHR$ USR rcv
 1130 IF c$="n" OR c$="N" THEN GO TO 1060
 1140 GO SUB nl: GO SUB 1290: LPRINT N$'p$( TO 14): GO TO menu
 1150 REM send SCREEN$ DATA 
 1160 READ y: LET ret=VAL "1170": FOR y=SGN PI TO y: READ p$: GO SUB sm: GO TO 90
 1170 NEXT y: RETURN 
 1180 REM user LIST 
 1190 RESTORE VAL "1440": GO SUB cls: GO SUB VAL "1160": LET ret=menu: GO TO con
 1200 REM quit bbs 
 1210 GO SUB cls
 1220 RESTORE VAL "1500": GO SUB VAL "1160"
 1230 LET C$=CHR$ USR rcv: IF c$="n" OR c$="N" THEN GO TO menu
 1240 READ p$: GO SUB sm: GO SUB VAL "1290": GO SUB sm: LPRINT p$'': OUT mc,64: OUT mc,0
 1250 OUT mc,0: GO TO VAL "140"
 1260 REM timer
 1270 LET time=VAL "INT ((PEEK 23672+256*PEEK 23673+65536*PEEK 23674)/3600)": LET hr=INT (time/beep): LET min=INT (time-hr*beep): IF hr>=24 THEN LET hr=NOT PI: LET dy=dy+SGN PI: GO SUB VAL "1910"
 1280 RETURN 
 1290 GO SUB 1270: LET time=INT ((hr*beep+min)-temp)
 1300 LET p1=INT (time/beep): LET p2=INT (time-(p1*beep)): IF p1<NOT x THEN LET p1=p1+24
 1310 LET c=SGN PI: GO SUB 1330: LET c=2: LET p1=hr: LET p2=min: GO SUB 1330
 1320 LET p$=STR$ mo+"-"+STR$ dy+"-"+STR$ yr+";"+t$(2)+"  Online "+t$(1)+l$: RETURN 
 1330 LET t$(c)=("0" AND LEN STR$ p1=SGN PI)+STR$ p1+":"+("0" AND LEN STR$ p2=SGN PI)+STR$ p2: RETURN 
 1340 REM menu DATA 
 1350 DATA 10,"    I.S.T.U.G.'s TIMEX-BOARD","","<C>hat","<G>oodby","<L>eave a Message"
 1360 DATA "<Q>uick Scan messages","<R>ead message","<T>ime on","<U>sers list",""
 1370 REM logon DATA 
 1380 DATA 15,"  WELCOME TO I.S.T.U.G.'s BBS","-------------------------------- ","Settings:","DUPLEX: FULL   WORD SIZE: 7","PARITY: EVEN   STOP BITS: 1",""
 1390 DATA  "","We are operating on an unex-","panded Timex 2068, a 2050 modem","and a 2040 printer.","","Tell us what you think about","this BBS","","Open 24hrs a day, 7 days a week"
 1400 REM Bull DATA 
 1410 DATA 8,"Sysop: Willie Jones","Mad Programmer: Paul Holmgren","","**** >>>  -Bullentin-   <<< **** "
 1420 DATA "","Keep your Modem's warm and stay","tuned to the I.S.T.U.G. BBs",""
 1430 REM USR DATA 
 1440 DATA 8,""
 1450 DATA ""
 1460 DATA ""
 1470 DATA ""
 1480 DATA "","If we missed you please Leave","Sysop a mess. and you will be","added to our list."
 1490 REM quit DATA 
 1500 DATA 8,"","The Indiana Sinclair/Timex","","Users Group hopes you enjoyed"
 1510 DATA "","our little Bulletin Board.","","Are you ready to leave Y/N >","Goodby. Hanging up now"
 1520 REM edit 
 1530 ON ERR RESET 
 1540 LET p$="Commander Sysop taking Control, Please Stand By": GO SUB sm
 1550 CLS : PRINT "SYSOP EDITOR"''"C heck Time"'"D elete a mess."'"E stablish correct time"'"H ang up"'"L eave a mess."'"M ain Menu"'"Q uick Scan Mess."'"R ead Mess."'"S ave messages"''"(C,D,E,H,L,M,Q,R,S)"
 1560 POKE VAL "23658",VAL "8": PAUSE ed: LET c$=INKEY$
 1570 IF c$="C" THEN GO SUB VAL "1290": PRINT p$( TO 14): GO TO VAL "1710"
 1580 IF c$="D" THEN INPUT "DELETE Mess. #?: ";x: PRINT "Mess. # ";x;" deleted.": LET m$(x)="": GO TO VAL "1710"
 1590 IF c$="E" THEN GO SUB VAL "1900"
 1600 IF c$="H" THEN GO TO quit
 1610 IF c$="L" THEN LET ed=nl: GO TO VAL "630"
 1620 IF c$="M" THEN GO TO menu
 1630 IF c$="Q" THEN LET ed=nl: GO TO VAL "840"
 1640 IF c$="R" THEN INPUT " READ  Mess. #?: ";y: CLS : GO SUB VAL "390": PRINT p$'m$(y,CODE "A" TO ): GO TO VAL "1710"
 1650 IF c$="S" THEN LET m$(sm)=d$: SAVE "TSBBSmbase" DATA m$()
 1660 GO TO VAL "1550"
 1670 CLS : LET ed=NOT PI: INPUT " SYMBL SHIFT/NOT  TO STOP :"'"Mess. TO ? ";p$: LET m$(y)="To :"+p$+l$: LET m$(y,VAL "33" TO )="From : Sysop Willie"+l$: GO SUB VAL "830": GO SUB VAL "390": PRINT P$: LET p$=""
 1680 INPUT LINE c$: IF c$="NOT " THEN LET p$=p$+CHR$ PI: GO TO VAL "1700"
 1690 LET p$=p$+c$+l$: PRINT c$: IF LEN p$<=VAL "535" THEN GO TO VAL "1680"
 1700 LET m$(y,CODE "A" TO )=p$: PRINT 
 1710 PRINT " NEXT ?": PAUSE ed: GO TO VAL "1550"
 1720 REM error trapped messages 
 1730 ON ERR RESET : LET p$="Sorry "+N$+" A bug has Bit you,": GO SUB sm: GO SUB beep: GO TO menu: REM ?=control G= BEEP 
 1740 IF ed THEN PRINT "I'm full, delete something first": LET ED=NOT X: GO TO VAL "1710"
 1750 LET p$="Message base full right now.    Please try later": GO SUB sm: GO TO con
 1760 LET ret=read: LET p$="Sorry no message "+STR$ y+". Try again": GO SUB sm: GO SUB nl: GO TO con
 1770 REM idle SCREEN$ 
 1780 CLS : PRINT AT VAL "7",VAL "7";"The I.S.T.U.G. BBS";AT VAL "10",VAL "6";"Scanning Phone Line."'''''''"* PEH SOFTWARE: 9-27-86": RETURN 
 1790 REM LPRINT sysop mess 
 1800 GO SUB cls: LET y=sm: LET m$(y)="": LET ed=y: GO TO VAL "720"
 1810 LPRINT n$;m$(sm,65 TO ed): LET ed=NOT PI: GO TO menu
 1820 REM OPEN # 40 mess. base 
 1830 PAPER NOT PI: BORDER NOT PI: INK VAL "9": CLS 
 1840 PRINT '" NOT  from most modes will GO TO SYSOP edit menu."
 1850 LET rcv=VAL "26724": LET xmt=VAL "26759": DIM T$(2,5): LET temp=PI: LET nlv=VAL "13": LET mc=VAL "119"
 1860 LET nl=VAL "30": LET sm=VAL "41": LET beep=VAL "60": LET menu=VAL "270": LET cls=VAL "380": LET read=VAL "450": LET con=VAL "580": LET leave=VAL "620": LET chat=VAL "890": LET edit=VAL "1530": LET quit=VAL "1210": LET l$=CHR$ 13: DIM m$(VAL "41",VAL "600"): LET ed=NOT PI
 1870 INPUT "Add a Message base? ";p$: IF p$="y" OR p$="Y" THEN PRINT "Start MESSAGE BASE tape.": LOAD "" DATA m$()
 1880 LET d$=m$(sm): GO TO edit
 1890 REM FORMAT & POKE clock 
 1900 INPUT "Month  1-12 ";mo,"Day  1-31 ";dy,"Hour  00-23 ";hr,"Minute ";min,"Year  86 ";yr
 1910 LET x=VAL "(hr*3600+min*60)*60": LET y=INT (x/65536): POKE 23674,y
 1920 LET p1=x-y*65536: LET x=INT (p1/256): POKE 23673,x: POKE 23672,p1-x*256: RETURN 
 1930 REM SAVE 
 1940 CLEAR : SAVE "BBS" LINE VAL "1820": GO TO VAL "1820"
 
 A&J BBS
 
    1 REM TS TINYBOARD * by Randy & Lucy Gordon
    2 REM Modifyed for use on A&J microdrive by John Ryan
   10 GO TO 1700
   20 IF uu=1 OR uu=3 OR uu=7 OR uu=8 OR uu=10 OR uu=13 THEN RETURN 
   80 IF uu<32 OR uu>127 THEN LET uu=0
   90 RETURN 
  100 LET ty=INT VAL "((65536*PEEK 23674+256*PEEK 23673+PEEK 23672)/3600)"
  110 LET ht=INT (ty/60)
  130 LET mt=INT (ty-ht*60)
  140 IF ht=24 THEN LET ht=0: LET dy=dy+1
  150 RETURN 
  160 REM autoans
  170 OUT 119,34
  180 OUT 119,0
  190 REM ansloop
  200 GO SUB 100
  220 IF INKEY$="NOT " THEN GO TO 1520
  230 IF IN 119=5 THEN GO TO 190
  240 FOR x=1 TO 5: BEEP .1,40: NEXT x
  250 OUT 119,2
  260 OUT 119,34
  270 PAUSE 300
  280 REM warmstart
  290 OUT 119,64: OUT 119,123: OUT 119,55: LET tw=INT mt: REM set online timer
  300 REM menu
  310 PAUSE 120: GO SUB 1160
  330 PAUSE 120: CLS : LET x=IN 115: LET p$="Full name: ": LET p$=p$+CHR$ 7: FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): PRINT p$(x);: NEXT x: GO SUB 1420: LPRINT u$
  340 RESTORE 350: PAUSE 200
  350 DATA "The Rats Den","MAIN MENU","<R>ead messages","<L>eave message","<C>hat with Fat Rat Daddy","<T>ime on","<G>oodbye","<I>nfo files","<M>essage base change"," ","Choice?:"
  360 RANDOMIZE USR output: OUT 115,13: PRINT 
  370 FOR p=1 TO 11: PRINT : RANDOMIZE USR output: OUT 115,13: READ p$: FOR x=1 TO LEN p$: POKE 23692,255: PRINT p$(x);: RANDOMIZE USR output: OUT 115,CODE p$(x): NEXT x
  380 NEXT p
  390 IF INKEY$="c" THEN GO TO 1300
  400 ON ERR GO TO 1030: LET uv=0: LET uu=USR input: GO SUB 20: LET c$=CHR$ uu
  410 IF uv=60 THEN GO TO 1030
  420 IF c$=CHR$ 0 THEN LET uv=uv+1: GO TO 400
  430 PRINT c$: PRINT 
  440 IF c$="r" OR c$="R" THEN FOR x=1 TO 2: RANDOMIZE USR output: OUT 115,13: NEXT x: GO TO 520
  450 IF c$="t" OR c$="T" THEN RANDOMIZE USR output: OUT 115,13: GO SUB 2120: FOR x=1 TO LEN e$: RANDOMIZE USR output: OUT 115,CODE e$(x): NEXT x: GO SUB 2220: LET p$="Connect time ": LET p$=p$+x$(1): RANDOMIZE USR output: OUT 115,13: PRINT : FOR x=1 TO LEN p$: PRINT p$(x);: RANDOMIZE USR output: OUT 115,CODE p$(x): NEXT x: GO TO 340
  460 IF c$="c" OR c$="C" THEN GO TO 1260
  470 IF c$="g" OR c$="G" THEN PAUSE 30: GO TO 1030
  480 IF c$="i" OR c$="I" THEN GO TO 2270
  490 IF c$="l" OR c$="L" THEN GO TO 780
  500 IF c$="m" OR c$="M" THEN GO SUB 2760
  510 GO TO 340
  520 REM read messages
  530 RANDOMIZE USR output: OUT 115,13
  540 LET p$="Messages from "+STR$ y2+" to "+STR$ y3+"...Which one?": RANDOMIZE USR output: OUT 115,13
  550 FOR x=1 TO LEN p$: PRINT p$(x);: RANDOMIZE USR output: OUT 115,CODE p$(x): NEXT x: RANDOMIZE USR output: OUT 115,13: LET uv=0
  560 DIM q$(3): FOR x=1 TO 3: LET uu=USR input: GO SUB 20: LET q$(x)=CHR$ uu:: IF q$(x)=CHR$ 8 THEN LET x=x-1: NEXT x
  570 IF q$(x)=CHR$ 13 THEN LET x=3: GO TO 620
  580 IF uv=60 THEN LET x=3: NEXT x
  590 IF q$(x)=CHR$ 0 THEN LET x=x-1: LET uv=uv+1: GO TO 620
  600 IF CODE q$(x)>0 THEN LET uv=0: PRINT q$(x);
  610 IF CODE q$(x)<48 OR CODE q$(x)>57 THEN LET q$(x)="0"
  620 NEXT x: RANDOMIZE USR output: OUT 115,13: IF q$(1)=CHR$ 13 THEN GO TO 520
  630 IF uv=60 THEN GO TO 1030
  640 ON ERR GO TO 1030: LET y5=VAL q$: IF INT y5<y2 OR INT y5>y3 THEN GO TO 530
  650 LET y=INT y5: IF y5>20 THEN LET y=INT (y5-(20*y4))
  660 IF y<0 THEN LET y=y+20
  670 IF m$(y,1)=" " THEN RANDOMIZE USR output: OUT 115,13: LET p$="No message at that number...try another": FOR x=1 TO LEN p$: POKE 23692,255: PRINT p$(x);: RANDOMIZE USR output: OUT 115,CODE p$(x): NEXT x: GO TO 520
  680 LET p$="MESSAGE NUMBER: "+STR$ y5+CHR$ 13: RANDOMIZE USR output: OUT 115,13: FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): PRINT p$(x);: NEXT x: PRINT : PRINT 
  690 FOR v=1 TO 1000: POKE 23692,255
  700 IF CODE m$(y,v)=3 THEN LET v=1000: NEXT v: GO TO 340
  710 PRINT m$(y,v);: RANDOMIZE USR output: OUT 115,CODE m$(y,v)
  720 IF v>64 THEN NEXT v
  730 IF (v>32 AND CODE m$(y,v)=13) THEN LET v=64: RANDOMIZE USR output: OUT 115,13
  740 IF (v<32 AND CODE m$(y,v)=13) THEN LET v=32
  750 NEXT v
  760 RANDOMIZE USR output: OUT 115,13: PRINT 
  770 GO TO 340
  780 REM leave message
  790 LET y1=y1+1: IF y1>20 THEN LET y1=1
  800 LET y3=y3+1
  810 IF y3>20 THEN LET y2=y2+1
  820 LET y4=INT (y3/20)
  830 DIM l$(1000): LET m$(y1)=l$
  840 RANDOMIZE USR output: OUT 115,13: LET p$="Who gets message?: ": FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): PRINT p$(x);: NEXT x: ON ERR GO TO 1030: LET uv=0: LET m$(y1,1 TO 4)="TO: ": FOR x=5 TO 32: LET uu=USR input: GO SUB 20
  850 IF uv=60 THEN LET x=32: NEXT x
  860 IF uu=0 THEN LET x=x-1: LET uv=uv+1: NEXT x
  870 IF uu=8 THEN LET x=x-1: LET uv=0: NEXT x
  880 LET m$(y1,x)=CHR$ uu: PRINT m$(y1,x);: LET uv=0
  890 IF CODE m$(y1,x)=13 THEN LET x=32
  900 NEXT x
  910 IF uv=60 THEN GO TO 1030
  920 LET m$(y1,33 TO 38)="FROM: ": LET m$(y1,39 TO 64)=u$
  930 RANDOMIZE USR output: OUT 115,13: PRINT : LET p$="Input message (900 chars max)..<CTRL C> to save...": PRINT : RANDOMIZE USR output: OUT 115,13
  940 FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): PRINT p$(x);: NEXT x: FOR x=1 TO 2: RANDOMIZE USR output: OUT 115,13: PRINT : NEXT x
  950 ON ERR GO TO 1030: LET uv=0: FOR v=65 TO 999: POKE 23692,255: LET uu=USR input: GO SUB 20: REM ctrl C=03h=ETX
  960 IF uv=60 THEN LET v=999: GO TO 1000
  970 IF uu=8 THEN LET v=v-1: LET uv=0
  980 IF uu=0 THEN LET v=v-1: LET uv=uv+1: NEXT v
  990 LET m$(y1,v)=CHR$ uu: PRINT m$(y1,v);: LET uv=0: IF uu=3 THEN LET v=1000: NEXT v: LET m$(y1,1000)=CHR$ 3: GO TO 340
 1000 NEXT v: LET m$(y1,1000)=CHR$ 3
 1010 IF uv=60 THEN GO TO 1030
 1020 GO TO 340
 1030 REM quit message base
 1040 ON ERR GO TO 1030
 1050 IF y1<>0 THEN LET m$(y1,1000)=CHR$ 3
 1060 RANDOMIZE USR output: OUT 115,13
 1070 CLS : PAUSE 10
 1080 LET p$="Thank you for calling the       The Rat's Den"
 1090 LET p$=p$+CHR$ (13)
 1100 PAUSE 30: CLS : RANDOMIZE USR output: OUT 115,28: RANDOMIZE USR output: OUT 115,31
 1110 RESTORE 2070: GO SUB 1120: FOR z=1 TO 5: READ p$: LET p$=p$+CHR$ (13): GO SUB 1120: NEXT z: GO TO 1130
 1120 FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): PRINT p$(x);: NEXT x: RETURN 
 1130 PAUSE 120
 1140 OUT 119,64: OUT 119,0: OUT 119,0
 1150 PAUSE 60: CLS : GO TO 160
 1160 REM logonbull
 1170 PAUSE 30: FOR x=1 TO 30: RANDOMIZE USR output: OUT 115,0: NEXT x
 1180 IF IN 119<128 THEN GO TO 1030
 1190 RANDOMIZE USR output: OUT 115,28: RANDOMIZE USR output: OUT 115,31
 1200 RANDOMIZE USR 65200: OUT 115,28
 1210 FOR x=1 TO 17: RANDOMIZE USR 65200: OUT 115,13: PRINT : NEXT x
 1220 RESTORE 1970
 1230 FOR z=1 TO 10: READ t$: LET t$=t$+CHR$ 13: FOR x=1 TO LEN t$: POKE 23692,255: PRINT t$(x);: RANDOMIZE USR 65200: OUT 115,CODE t$(x): NEXT x: OUT 115,13: NEXT z
 1240 FOR x=1 TO 5: RANDOMIZE USR 65200: OUT 115,13: PRINT : NEXT x
 1250 RETURN 
 1260 REM chat
 1270 ON ERR GO TO 1030
 1280 PRINT : RANDOMIZE USR 65200: OUT 115,13: LET p$="You want to talk to the Rat?!!   AHAHAHA": FOR x=1 TO LEN p$: POKE 23692,255: PRINT p$(x);: RANDOMIZE USR 65200: OUT 115,CODE p$(x): NEXT x: PRINT : RANDOMIZE USR 65200: OUT 115,13
 1290 FOR x=1 TO 128: IF INKEY$="" THEN PRINT ".";: BEEP .1,1: RANDOMIZE USR 65200: OUT 115,46: NEXT x: LET p$="FRD is not available.....": FOR x=1 TO LEN p$: POKE 23692,255: PRINT p$(x);: RANDOMIZE USR 65200: OUT 115,CODE p$(x): NEXT x: PRINT : RANDOMIZE USR 65200: OUT 115,13: GO TO 320
 1300 RANDOMIZE USR 65200: OUT 115,13: LET p$="Well, you've GOT him!:": FOR x=1 TO LEN p$: POKE 23692,255: PRINT p$(x);: RANDOMIZE USR 65200: OUT 115,CODE p$(x): NEXT x: PRINT : RANDOMIZE USR 65200: OUT 115,13
 1310 CLS : PRINT "You are in chat mode with       ";u$: PRINT : PRINT "SYMBL SHIFT/NOT to escape..."
 1320 IF INKEY$="NOT " THEN GO TO 340
 1330 POKE 23692,255
 1340 LET RxRDY=0: LET TxRDY=0
 1350 LET a=USR 65000: LET TxRDY=1 AND (a=1 OR a=3): LET RxRDY=1 AND (a=2 OR a=3)
 1360 IF RxRDY THEN LET k=USR 65100: PRINT CHR$ k;: IF k=13 THEN PRINT ">";
 1370 IF TxRDY AND INKEY$<>"" THEN GO SUB 1390
 1380 GO TO 1320
 1390 IF TxRDY THEN LET i$=INKEY$: PRINT i$;: OUT 115,CODE i$: FOR x=1 TO 5: NEXT x: IF CODE i$=13 THEN PRINT ">";
 1400 IF INKEY$<>"" THEN GO TO 1400
 1410 RETURN 
 1420 REM inname
 1430 DIM u$(32): LET u=1
 1440 RANDOMIZE USR output: OUT 115,5: LET uv=0
 1450 ON ERR GO TO 1030: LET uu=USR input: GO SUB 20
 1460 IF uv=200 THEN GO TO 1030
 1470 IF uu=0 THEN LET uv=uv+1: GO TO 1450
 1480 LET v$=CHR$ uu: PRINT v$;
 1490 LET u$(u)=v$ AND u<32: LET u=u+1
 1500 IF CODE v$=13 THEN RETURN 
 1510 LET uv=0: GO TO 1450
 1520 REM edit
 1530 CLS : PRINT "SYSOP EDITOR"''"<R>ead messages"''"<D>elete messages"''"<L>eave messages"''"<Q>uit editor"''"<S>ave message base"
 1540 PRINT '"<B>reak program"''"<C>hange Mbase"
 1550 LET i$=INKEY$
 1560 IF i$="" THEN GO TO 1550
 1570 IF i$="s" OR i$="S" THEN GO TO 2240
 1580 IF i$="r" OR i$="R" THEN INPUT ;"message #?: ";x: PRINT "Message # ";x: PRINT m$(x): PAUSE 0: CLS : GO TO 1520
 1590 IF i$="d" OR i$="D" THEN INPUT ;"message #?: ";x: PRINT "Message # ";x;" deleted.": LET m$(x)=l$: PAUSE 0: CLS : GO TO 1520
 1600 IF i$="l" OR i$="L" THEN LET y1=y1+1: GO SUB 2740: LET y3=y3+1: GO SUB 2744: PRINT "Message # ";y1: PRINT : FOR x=64 TO 1000: PAUSE 0: LET m$(y1,x)=INKEY$: PRINT m$(y1,x);: IF CODE INKEY$=195 THEN LET m$(y1,x)=CHR$ 3
 1610 IF i$="l" OR i$="L" THEN IF m$(y1,x)=CHR$ PI THEN GO TO 1670: REM 195=NOT
 1620 IF i$="l" OR i$="L" THEN NEXT x: PAUSE 0: LET m$(y1,1000)=CHR$ 3: GO TO 1670
 1630 IF i$="q" OR i$="Q" THEN GO TO 1030
 1640 IF i$="b" OR i$="B" THEN ON ERR RESET : STOP 
 1650 IF i$="c" OR i$="C" THEN GO SUB 2890
 1660 GO TO 1520
 1670 INPUT "Message to:;";z$: LET m$(y1,1 TO 32)=z$(1 TO LEN z$)
 1680 LET m$(y1,32)=CHR$ 13: LET m$(y1,33 TO 63)="From SYSOP": LET m$(y1,64)=CHR$ 13
 1690 CLS : GO TO 1520
 1700 REM init
 1710 REM 20 meesage base
 1720 PAPER NOT PI: BORDER NOT PI: INK 7: CLS 
 1730 CLEAR 64999
 1740 DIM y(4,1): LET y1=0: LET y2=0: LET y3=0: LET y4=0: DIM l$(1000): DIM m$(20,1000): LET m$(1)="No messages found..."+CHR$ 3: PRINT "Do you wish to load a message   base?": INPUT x$: IF x$="y" OR x$="Y" THEN LOAD "@mess1" DATA m$(): LOAD "@msg1" DATA y(): LET y1=y(1,1): LET y2=y(2,1): LET y3=y(3,1): LET y4=y(4,1)
 1750 PRINT '"<NOT> from most modes will exit to SYSOP control mode.": LET mbase=1
 1760 LET y=0
 1770 LET output=65200: LET input=65100: LET statchk=65000
 1780 INPUT "Day";dy
 1790 INPUT "Hour";ht
 1800 INPUT "Minute";mt
 1810 INPUT "Month ";e$: LET e$=e$+" "
 1830 LET aa=(ht*3600+mt*60)*60
 1840 LET bz=INT (aa/65536): POKE 23674,bz
 1850 LET cz=aa-bz*65536
 1860 LET aa=INT (cz/256): POKE 23673,aa
 1870 POKE 23672,cz-aa*256
 1880 GO TO 1030
 1890 REM code
 1900 RESTORE 1910: FOR x=65000 TO 65008: READ x1: POKE x,x1: NEXT x
 1910 DATA 175,219,119,230,3,79,6,0,201
 1920 RESTORE 1930: FOR x=65100 TO 65145: READ x1: POKE x,x1: NEXT x
 1930 DATA 1,255,255,119,230,128,200,175,219,119,230,2,32,10,11,120,177,32,240,6,0,14,1,201,219,115,6,0,79,219,119,230,128,200,175,219,119,230,1,40,244,121,211,115,201
 1940 RESTORE 1950: FOR x=65200 TO 65212: READ x1: POKE x,x1: NEXT x
 1950 DATA 219,119,230,128,200,175,219,119,230,1,40,244,201
 1960 RETURN 
 1970 REM  DATA area for logon   bullitin. All logon messages
 1980 REM must be DATA statementsthusly
 1990 REM xxxx DATA "this is a line that will be sent"
 2000 REM logon area
 2010 REM ditto
 2020 REM ditto
 2030 REM ditto
 2040 REM ditto
 2050 REM ditto
 2060 REM ditto
 2070 REM LOGOFF message area,   FORMAT same as for logon
 2080 REM logoff area
 2090 REM ditto
 2100 REM ditto
 2110 REM ditto
 2120 DIM x$(2,5): GO SUB 100: LET time=INT mt
 2130 LET tz=INT (time-tw)
 2140 IF tz<0 THEN LET tz=INT (time+60-tw)
 2150 LET hr=0
 2160 IF tz>60 THEN LET hr=1: LET tz=tz-60
 2170 LET min=tz
 2180 PRINT : PRINT AT 21,0;"0" AND hr<10;hr;":";"0" AND min<10;min: FOR x=1 TO 5: LET x$(1,x)=SCREEN$ (21,x-1): NEXT x
 2190 GO SUB 100
 2200 PRINT : PRINT AT 21,0;"0" AND ht<10;ht;":";"0" AND mt<10;mt: FOR x=1 TO 5: LET x$(2,x)=SCREEN$ (21,x-1): NEXT x
 2210 RETURN 
 2220 RANDOMIZE USR output: OUT 115,32: LET p$=STR$ dy+",1986"+CHR$ 13: FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): PRINT p$(x);: NEXT x
 2230 LET p$="Time of day "+x$(2)+CHR$ 13: FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): PRINT p$(x): NEXT x: RETURN 
 2240 INPUT "mbase1 or 2";change
 2250 IF change=1 THEN SAVE "@2,mess1" DATA m$(): LET y(1,1)=y1: LET y(2,1)=y2: LET y(3,1)=y3: LET y(4,1)=y4: SAVE "@3,msg1" DATA y(): GO TO 1520
 2260 IF change=2 THEN SAVE "@4,mess2" DATA m$(): LET y(1,1)=y1: LET y(2,1)=y2: LET y(3,1)=y3: LET y(4,1)=y4: SAVE "@5,msg2" DATA y(): GO TO 1520
 2270 REM info files
 2280 RANDOMIZE USR output: OUT 115,13
 2290 RESTORE 2300
 2300 DATA "Information Section","","","1-Info on this system","2-Info on Fat Rat Daddy"
 2310 FOR x=1 TO 5: READ p$: PRINT p$: LET p$=p$+CHR$ 13: FOR z=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(z): NEXT z: NEXT x
 2320 RANDOMIZE USR output: OUT 115,13
 2330 LET p$="Enter choice": PRINT p$: FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): NEXT x
 2340 ON ERR GO TO 1030: LET uv=0
 2350 LET uu=USR input
 2360 GO SUB 20
 2370 IF uv=90 THEN GO TO 1030
 2380 IF uu=0 THEN LET uv=uv+1: GO TO 2350
 2390 IF CHR$ uu="1" OR CHR$ uu="2" THEN LET uv=0: GO TO 2410
 2400 RANDOMIZE USR output: OUT 115,13: LET uv=0: GO TO 2330
 2410 IF CHR$ uu="1" THEN RESTORE 2460
 2420 IF CHR$ uu="2" THEN RESTORE 2580
 2430 PRINT : RANDOMIZE USR output: OUT 115,13
 2440 FOR x=1 TO 10: READ p$: PRINT p$: LET p$=p$+CHR$ 13: FOR z=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(z): NEXT z: NEXT x
 2450 GO TO 340
 2460 REM INFO FILE AREA.. FORMAT ...same as for logon (10 lines
 2470 REM in each info file)
 2480 REM info file 1
 2490 REM ditto
 2500 REM ditto
 2510 REM ditto
 2520 REM ditto
 2530 REM ditto
 2540 REM ditto
 2550 REM ditto
 2560 REM last line must xxxx DATA ""
 2570 DATA ""
 2580 REM info file 2
 2590 REM ditto
 2600 REM ditto
 2610 REM ditto
 2620 REM ditto
 2630 REM ditto
 2640 REM ditto
 2650 REM ditto
 2660 REM ditto
 2670 REM ditto
 2680 DATA " "
 2740 IF y1>20 THEN LET y1=y1-20
 2750 RETURN 
 2754 IF y3>20 THEN LET y2=y2+1: RETURN 
 2760 RANDOMIZE USR output: OUT 115,13: RESTORE 2910: PAUSE 100
 2770 FOR x=1 TO 4: READ p$: PRINT p$: LET p$=p$+CHR$ 13: FOR z=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(z): NEXT z: NEXT x
 2780 LET p$=("General" AND mbase=1)+("Humor" AND mbase=2)+" is active, change? (Y/N)"
 2790 IF mbase=2 THEN LET p$="Humor"
 2800 LET p$=p$+" is active, change? (Y/N)"
 2810 FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): NEXT x: RANDOMIZE USR output: OUT 115,13
 2820 ON ERR GO TO 1030: LET uu=USR input: GO SUB 20: IF uu=0 THEN GO TO 2820
 2830 IF CHR$ uu="n" OR CHR$ uu="N" THEN RETURN 
 2840 IF CHR$ uu="y" OR CHR$ uu="Y" THEN GO TO 2860
 2850 GO TO 2800
 2860 LET p$="That rumbling in the pipes means that we're flushing, STAND BY"
 2870 LET p$=p$+CHR$ 13
 2880 FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): NEXT x
 2890 IF mbase=1 THEN SAVE "@1,mess1" DATA m$(): LET y(1,1)=y1: LET y(2,1)=y2: LET y(3,1)=y3: LET y(4,1)=y4: SAVE "@4,msg1" DATA y(): LOAD "@mess2" DATA m$(): LOAD "@msg2" DATA y(): LET y1=y(1,1): LET y2=y(2,1): LET y3=y(3,1): LET y4=y(4,1): LET mbase=2: CLS : RETURN 
 2900 IF mbase=2 THEN SAVE "@7,mess2" DATA m$(): LET y(1,1)=y1: LET y(2,1)=y2: LET y(3,1)=y3: LET y(4,1)=y4: SAVE "@:,msg2" DATA y(): LOAD "@mess1" DATA m$(): LOAD "@msg1" DATA y(): LET y1=y(1,1): LET y2=y(2,1): LET y3=y(3,1): LET y4=y(4,1): LET mbase=1: CLS : RETURN 
 2910 DATA "There are 2 message bases","1-General messages","2-Humor/Insults"," "
 
 Farmers BBS
 
   10 GO TO 900
   20 OUT 119,34
   30 OUT 119,0
   50 IF INKEY$="NOT " THEN GO TO edit
   60 IF IN 119=5 THEN GO TO 40
   70 PAUSE 400
   90 IF IN 119=5 THEN GO TO 40
  100 PAUSE 400
  120 IF IN 119=5 THEN GO TO 40
  130 OUT 119,2
  140 OUT 119,34
  150 PAUSE 300
  160 OUT 119,64: OUT 119,122: OUT 119,55
  170 PAUSE 120: CLS : GO SUB 620: LET x=IN 115: LET p$="Full name: ": FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): PRINT p$(x);: NEXT x: GO SUB 720: LPRINT u$
  180 LET y=0: REM set message number to read
  190 RESTORE 200
  200 DATA "   Data Transfer MAIN MENU","<R>ead messages","<L>eave message","<I>nfo files","<T>ime on","<G>oodbye"," ","Choice?:"
  210 RANDOMIZE USR output: OUT 115,13: PRINT 
  220 FOR p=1 TO 8: PRINT : RANDOMIZE USR output: OUT 115,13: READ p$: FOR x=1 TO LEN p$: POKE 23692,255: PRINT p$(x);: RANDOMIZE USR output: OUT 115,CODE p$(x): NEXT x
  230 NEXT p
  240 ON ERR GO TO 530: LET c$=CHR$ USR input: PRINT c$: PRINT 
  250 IF c$="r" OR c$="R" THEN FOR x=1 TO 2: RANDOMIZE USR output: OUT 115,13: NEXT x: GO TO 300
  260 IF c$="g" OR c$="G" THEN PAUSE 30: GO TO 530
  270 IF c$="l" OR c$="L" THEN GO TO 430
  280 IF c$="i" OR c$="I" THEN GO TO 1050
  290 GO TO 190
  300 LET y=y+1: IF y>20 THEN LET y=1
  310 LET y=y+1: IF y>20 THEN LET y=1
  320 IF m$(y,1)=" " THEN GO TO 300
  330 PRINT AT 21,0;"                                ": PRINT AT 21,0;y: LET c$=SCREEN$ (21,0): LET c$=c$+SCREEN$ (21,1): LET p$="MESSAGE NUMBER: "+c$: RANDOMIZE USR output: OUT 115,13: FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): PRINT p$(x);: NEXT x: PRINT : RANDOMIZE USR output: OUT 115,13
  340 FOR v=1 TO 1000: POKE 23692,255
  350 IF CODE m$(y,v)=3 THEN LET v=1000: NEXT v: GO TO 190
  360 PRINT m$(y,v);: RANDOMIZE USR output: OUT 115,CODE m$(y,v)
  370 IF v>64 THEN NEXT v
  380 IF (v>32 AND CODE m$(y,v)=13) THEN LET v=64: RANDOMIZE USR output: OUT 115,13
  390 IF (v<32 AND CODE m$(y,v)=13) THEN LET v=32
  400 NEXT v
  410 RANDOMIZE USR output: OUT 115,13: PRINT 
  420 GO TO 190
  430 LET y1=y1+1: IF y1>20 THEN LET y1=1
  440 LET m$(y1)=""
  450 RANDOMIZE USR output: OUT 115,13: LET p$="Who gets message?: ": FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): PRINT p$(x);: NEXT x: ON ERR GO TO 530: LET m$(y1,1 TO 4)="TO: ": FOR x=5 TO 32: LET m$(y1,x)=CHR$ USR input: PRINT m$(y1,x);
  460 IF CODE m$(y1,x)=13 THEN LET x=32
  470 NEXT x
  480 LET m$(y1,33 TO 38)="FROM: ": LET m$(y1,39 TO 64)=u$
  490 RANDOMIZE USR output: OUT 115,13: PRINT : LET p$="Input message (900 chars max)..<CTRL C> to save...": PRINT : RANDOMIZE USR output: OUT 115,13
  500 FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): PRINT p$(x);: NEXT x: FOR x=1 TO 2: RANDOMIZE USR output: OUT 115,13: PRINT : NEXT x
  510 ON ERR GO TO 530: FOR v=65 TO 1000: POKE 23692,255: LET m1=USR input: REM ctrl C=03h=ETX
  520 LET m$(y1,v)=CHR$ m1: PRINT m$(y1,v);: IF m1=3 THEN LET v=1000: NEXT v: GO TO 190
  530 ON ERR RESET 
  540 RANDOMIZE USR output: OUT 115,13
  550 CLS : PAUSE 10
  560 LET p$="Thank you for calling the       DATA TRANSFER....               Hang up now!!!"
  570 PAUSE 30: CLS : RANDOMIZE USR output: OUT 115,28: RANDOMIZE USR output: OUT 115,31
  580 FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): PRINT p$(x);: NEXT x
  590 PAUSE 120
  600 OUT 119,64: OUT 119,0: OUT 119,0
  610 PAUSE 60: CLS : GO TO 20
  620 PAUSE 30: FOR x=1 TO 30: RANDOMIZE USR output: OUT 115,0: NEXT x
  630 IF IN 119<128 THEN GO TO 530
  640 RANDOMIZE USR output: OUT 115,28: RANDOMIZE USR output: OUT 115,31
  650 RANDOMIZE USR output: OUT 115,28
  660 FOR x=1 TO 10: RANDOMIZE USR output: OUT 115,13: PRINT : NEXT x
  670 RESTORE 710
  680 FOR z=1 TO 13: READ t$: LET t$=t$+CHR$ 13: FOR x=1 TO LEN t$: POKE 23692,255: PRINT t$(x);: RANDOMIZE USR output: OUT 115,CODE t$(x): NEXT x: NEXT z
  690 FOR x=1 TO 5: RANDOMIZE USR output: OUT 115,13: PRINT : NEXT x
  700 RETURN 
  710 DATA "+------------------------------+"," ","l         Welcome To:          l"," ","l        DATA TRANSFER         l"," ","l Online Daily 11:30pm-5:00pm  l"," ","l Serving the Kentuckiana Area l"," ","l        (812) 282-4023        l"," ","l        300 Baud 7/E/1        l","+------------------------------+" 
  720 DIM u$(32): LET u=1
  730 RANDOMIZE USR output: OUT 115,5
  740 ON ERR GO TO 530: LET v$=CHR$ USR input: PRINT v$;
  750 LET u$(u)=v$ AND u<32: LET u=u+1
  760 IF CODE v$=13 THEN RETURN 
  770 GO TO 740
  780 PRINT AT 0,0;"SYSOP EDITOR";AT 2,0;"<R>ead messages";AT 4,0;"<D>elete messages";AT 6,0;"<L>eave messages";AT 8,0;"<Q>uit editor";AT 10,0;"<S>ave message base";AT 12,0;"<B>reak to BASIC"
  790 LET i$=INKEY$
  800 IF i$="" THEN GO TO 790
  810 IF i$="s" OR i$="S" THEN GO TO 1450
  820 IF i$="r" OR i$="R" THEN INPUT ;"message #?: ";x: PRINT "Message # ";x: PRINT m$(x): PAUSE 0: GO TO edit
  830 IF i$="d" OR i$="D" THEN INPUT ;"message #?: ";x: PRINT "Message # ";x;" deleted.": LET m$(x)="": PAUSE 0: GO TO edit
  840 IF i$="l" OR i$="L" THEN LET y1=y1+1: PRINT "Message # ";y1: PRINT : FOR x=1 TO 1000: PAUSE 0: LET m$(y1,x)=INKEY$: PRINT m$(y1,x);
  850 IF i$="l" OR i$="L" THEN IF CODE INKEY$=195 THEN LET m$(y1,x)=CHR$ 3: GO TO edit: REM 195=NOT
  860 IF i$="l" OR i$="L" THEN NEXT x: PAUSE 0: GO TO edit
  870 IF i$="q" OR i$="Q" THEN GO TO 530
  880 IF i$="b" OR i$="B" THEN GO TO 1440
  890 CLS : GO TO edit
  900 PAPER 0: BORDER 0: INK 7: CLS 
  910 CLEAR 64999
  920 DIM y(1,1): LET y1=0: DIM m$(20,1000): LET m$(1)="No messages found..."+CHR$ 3: FOR x=1 TO 3: BEEP .1,25: 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(1,1)
  930 PRINT : PRINT "<NOT> from most modes will exit to sysop control mode": PAUSE 180
  940 LET y=0
  950 LET input=65100: LET output=65200: LET quit=530: LET edit=780
  960 PRINT "Now going to AUTOANSWER MODE": FOR x=1 TO 3: BEEP .1,10: NEXT x: PAUSE 180: CLS 
  980 RESTORE 990: FOR x=65000 TO 65008: READ x1: POKE x,x1: NEXT x
  990 DATA 175,219,119,230,3,79,6,0,201
 1000 RESTORE 1010: FOR x=input TO 65132: READ x1: POKE x,x1: NEXT x
 1010 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
 1020 RESTORE 1030: FOR x=output TO 65212: READ x1: POKE x,x1: NEXT x
 1030 DATA 219,119,230,128,200,175,219,119,230,1,40,244,201
 1040 GO TO 530
 1050 RANDOMIZE USR output: OUT 115,13
 1060 RESTORE 1070
 1070 DATA "Information Section","        ","        ","1-Info on this system","2-Address of Data Transfer"
 1080 FOR x=1 TO 5: READ p$: PRINT p$: LET p$=p$+CHR$ 13: FOR z=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(z): NEXT z: NEXT x
 1090 RANDOMIZE USR output: OUT 115,13
 1100 LET p$="Enter choice": PRINT p$: FOR x=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(x): NEXT x
 1110 ON ERR GO TO 530
 1120 LET uu=USR input
 1130 IF uu=0 THEN GO TO 1120
 1140 IF CHR$ uu="1" OR CHR$ uu="2" THEN GO TO 1160
 1150 RANDOMIZE USR output: OUT 115,13: GO TO 1100
 1160 IF CHR$ uu="1" THEN RESTORE 1210
 1170 IF CHR$ uu="2" THEN RESTORE 1320
 1180 PRINT : RANDOMIZE USR output: OUT 115,13
 1190 FOR x=1 TO 10: READ p$: PRINT p$: LET p$=p$+CHR$ 13: FOR z=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(z): NEXT z: NEXT x
 1200 GO TO 190
 1210 DATA "DATA TRANSFER is run with TSTiny"
 1220 DATA "-board on a Timex/Sinclair 2068 "
 1230 DATA "(48k) computer with a Westridge "
 1240 DATA "TS2050 modem (300 baud). TSTiny-"
 1250 DATA "board is a Public Domain program"
 1260 DATA " available on Compuserve or from"
 1270 DATA " DATA TRANSFER. The program is  "
 1280 DATA "in BASIC and easily modified for"
 1290 DATA " customization. Leave a message "
 1300 DATA "or send a tape for a copy......."
 1310 DATA " "
 1320 DATA "--------------------------------"
 1330 DATA "Our address-"
 1340 DATA "   DATA TRANSFER"
 1350 DATA "   C/O M. Farmer"
 1360 DATA "   211 S.State St."
 1370 DATA "   Clarksville, IN"
 1380 DATA "             47130"
 1390 DATA "Please feel free to leave sugges"
 1400 DATA "tions or send for a copy of TSTi"
 1410 DATA "inyboard.  Thanks......"
 1420 DATA " "
 1430 SAVE "tinyboard" LINE 900: REM  T/S Tinyboard/Flashware * 1986 rev. date 01/21/86
 1440 STOP 
 1450 SAVE "messbase" DATA m$(): LET y(1,1)=y1: SAVE "msgcntr" DATA y(): GO TO edit
 
 Ralph BBS
 
    0 REM CODE FLASH w NEW O<>CODE FLASH w NEW   >=CODE FLASH w NEW ( POKE FLASH sO FLASH w NEW   >=CODE FLASH w NEW ( POKE y OPEN #s<>CODE FLASH w NEW   >=CODE FLASH w NEW ( POKE LINE !$!,T]USR ] OR *K\>) GO SUB LEN LPRINT >PEEK  PLOT #>XPEEK  LIST #>PEEK  REM STR$ z GO SUB LEN LPRINT +s( RANDOMIZE <>> OPEN #w>" OPEN #w>@ OPEN #w>{ OPEN #w>7 OPEN #w<> * PEH SOFTWARE 1986
   10 GO TO VAL "1860"
   20 REM send a nl= NEW LINE 
   30 POKE 23692,255: PRINT : RANDOMIZE USR xmt: OUT 115,CODE l$: RETURN 
   40 REM PRINT TO caller
   50 GO SUB nl: PRINT p$;: FOR x=SGN PI TO LEN p$: RANDOMIZE USR xmt: OUT 115,CODE p$(x): NEXT x: RETURN 
   60 REM BEEP 
   70 FOR x=9 TO 2 STEP -SGN PI: BEEP .2,15: NEXT x: RETURN 
   80 REM test FOR sysop access 
   90 IF IN mc<128 THEN GO TO VAL "1260"
  100 IF INKEY$="c" OR INKEY$="C" THEN GO TO 900
  110 IF INKEY$=" STEP " THEN GO TO 1570
  120 GO TO ret
  130 REM CLOSE # modem 
  140 GO SUB VAL "1810"
  150 OUT mc,34: OUT mc,ed
  160 REM test FOR IN call 
  170 GO SUB VAL "1300": PRINT AT 17,27;t$(2): LET ret=VAL "180": GO TO VAL "110"
  180 IF IN mc=5 THEN GO TO 170
  200 REM start/set on LINE time 
  210 RANDOMIZE USR 26826: PAUSE beep: ON ERR GO TO 1260: GO SUB beep: LET temp=hr*60+min
  220 LET l$=CHR$ 13: RANDOMIZE USR 26781: LET p$="Hello"+l$+"Hello is this 2 lines Y/N": GO SUB sm
  230 LET c$=CHR$ USR rcv: GO SUB nl: IF c$="y" OR c$="Y" THEN GO TO VAL "1030"
  240 IF c$="n" OR c$="N" THEN LET l$=CHR$ 10: RANDOMIZE USR 26775: GO TO VAL "1030"
  250 GO TO 230
  260 REM menu 
  270 RESTORE VAL "1360": ON ERR GO TO VAL "1770": GO SUB cls: GO SUB 1170
  280 LET p$="(B,C,G,L,Q,R,T,U)? ": GO SUB sm: LET c$=CHR$ USR rcv: PRINT c$: GO SUB nl
  285 IF c$="b" OR c$="B" THEN GO TO 1040
  290 IF c$="c" OR c$="C" THEN GO TO 900
  300 IF c$="g" OR c$="G" THEN GO TO 1220
  310 IF c$="l" OR c$="L" THEN GO TO 620
  320 IF c$="q" OR c$="Q" THEN LET p$="use CONTROL C to Abort Scan.": GO SUB sm: GO TO VAL "850"
  330 IF c$="r" OR c$="R" THEN GO SUB nl: GO TO 450
  340 IF c$="t" OR c$="T" THEN GO SUB VAL "1300": GO SUB sm: GO TO VAL "280"
  350 IF c$="u" OR c$="U" THEN GO TO VAL "1200"
  360 GO TO VAL "280"
  370 REM CLS SCREEN$ ,12=FF 
  380 CLS : OUT 115,12: RETURN 
  390 REM FORMAT & READ header 
  400 LET p1=32: LET p2=64: LET c$=m$(y, TO p2): FOR x=5 TO p2
  410 IF c$(x)=l$ AND x<=32 THEN LET p1=x: LET x=39
  420 IF c$(x)=l$ AND x<=64 THEN LET p2=x: LET x=64
  430 NEXT x: LET p$="Message :"+STR$ y+"  "+d$(y*14-13 TO y*14)+l$+c$( TO p1)+c$(33 TO p2): RETURN 
  440 REM READ msg 
  450 LET p$="Message 1 TO 40, Menu=0 >? ": GO SUB sm: LET c$="   ": ON ERR GO TO menu
  460 FOR x=SGN x TO PI: LET c$(x)=CHR$ USR rcv: IF c$(2)=l$ OR c$(PI)=l$ THEN GO TO VAL "500"
  480 IF (c$(x)<"0") OR (c$(x)>"9") THEN GO TO VAL "450"
  490 NEXT x: IF LEN c$>2 THEN GO TO VAL "450"
  500 GO SUB nl: LET y=VAL c$: IF NOT y THEN GO TO menu
  510 IF y>=sm OR m$(y,1)=" " THEN GO TO VAL "1800"
  520 GO SUB 390: LET p$=p$+m$(y,65 TO )
  530 GO SUB cls: PRINT ''"Working": FOR x=SGN PI TO LEN p$: LET c=CODE p$(x): IF c=3 THEN GO TO VAL "560"
  540 RANDOMIZE USR xmt: OUT 115,c
  550 NEXT x: LET x=x-SGN PI
  560 GO SUB nl: PRINT p$( TO x): LPRINT "Reas msg. "+STR$ y: GO TO VAL "450"
  570 REM con= CONTINUE 
  580 GO SUB nl: LET p$="Press <ENTER> when ready": GO SUB sm
  590 IF CHR$ USR rcv=l$ THEN GO TO ret
  600 GO TO VAL "590"
  610 REM leave message 
  620 GO SUB cls: LET p$="Is this message for Sysop Y/N>": GO SUB sm: LET c$=CHR$ USR rcv: IF c$="y" OR c$="Y" THEN GO TO VAL "1840"
  630 GO SUB nl: FOR y=SGN PI TO VAL "40"
  640 IF m$(y,1)<>" " THEN NEXT y: GO TO VAL "1780"
  660 LET m$(y,LEN d$)=CHR$ PI: IF ed THEN GO TO VAL "1710"
  670 LPRINT "Left msg. #";y
  680 LET p$="Who gets Mess. "+STR$ y+"?": GO SUB sm: GO SUB nl: LET m$(y)="TO: ": FOR x=5 TO 31
  690 LET m$(y,x)=CHR$ USR rcv: IF m$(y,x)=CHR$ 8 AND x>=SGN PI THEN LET x=x-2: NEXT x
  700 IF m$(y,x)=l$ THEN GO TO VAL "720"
  710 PRINT m$(y,x);: NEXT x: LET m$(y,x)=l$
  720 LET m$(y,33 TO )="From: "+n$: LET p$="Input Message (534 chars max).. <CONTROL C> to save.": GO SUB sm: GO SUB nl
  730 LET ret=VAL "780": FOR x=CODE "A" TO VAL "599"
  740 LET c=USR rcv: IF c=8 AND x>=65 THEN LET x=x-1: GO TO VAL "740"
  760 LET m$(y,x)=CHR$ c: PRINT m$(y,x);: IF c=3 THEN GO TO VAL "800"
  770 GO TO 90
  790 NEXT x
  800 LET p3=x: LET p$="Message"+(" full and" AND x>=599)+" saved.": GO SUB sm: GO SUB VAL "825": IF ed THEN LET ed=p3: GO TO VAL "1850"
  810 GO TO VAL "880"
  820 REM FORMAT date/time 
  825 GO SUB VAL "1300"
  830 LET d$(y*14-13 TO y*14)=p$: RETURN 
  840 REM Quick scan 
  850 LET ret=VAL "860": FOR y=SGN PI TO 40: IF m$(y,1)<>" " THEN GO SUB 390: GO SUB sm: IF NOT ed THEN GO TO 90
  860 IF IN 115=3 THEN GO TO VAL "280"
  870 NEXT y: IF ed THEN GO TO VAL "1750"
  880 LET ret=menu: GO TO con
  890 REM chat 
  900 LET p$="Paging sysop....": GO SUB sm
  910 FOR x=SGN x TO VAL "144": IF INKEY$="" THEN PRINT ".";: RANDOMIZE USR xmt: OUT 115,46: BEEP .1,15: NEXT x: LET p$="Sorry, all we found were cobwebs": GO SUB sm: LPRINT "Tried caht": PAUSE CODE "c": GO TO menu
  920 GO SUB cls: LET p$=n$+"entering chat mode": GO SUB sm: GO SUB nl: POKE VAL "23658",ed: PRINT "SYMBL SHIFT/ STEP TO LEAVE CHAT."
  930 IF INKEY$=" STEP " THEN GO TO 1570
  940 LET rcv1=ed: LET xmt1=ed
  950 LET x=USR 26715: LET xmt1=x AND (x=1 OR x=3): LET rcv1=x AND (x=2 OR x=3)
  960 IF rcv1 THEN LET c=USR rcv: PRINT CHR$ c;: IF c=CODE l$ THEN PRINT '">";
  970 IF xmt1 AND INKEY$<>"" THEN GO TO 990
  980 GO TO 930
  990 IF xmt1 THEN LET c$=INKEY$: PRINT c$;: OUT 115,CODE c$: FOR x=NOT PI TO PI: NEXT x: IF c$=CHR$ 13 THEN RANDOMIZE USR xmt: OUT 115,62
 1000 IF INKEY$<>"" THEN GO TO 1000
 1010 GO TO 930
 1020 REM send logon SCREEN$ 
 1030 RESTORE VAL "1390": GO SUB cls: GO SUB VAL "1170": GO TO VAL "1070"
 1040 REM send bulletin 
 1050 RESTORE VAL "1430": LPRINT " READ bulls": GO SUB cls: GO SUB VAL "1170": LET ret=1055: GO TO con
 1055 GO SUB cls: GO SUB VAL "1170": LET ret=menu: GO TO con
 1060 REM INPUT callers name 
 1070 GO SUB beep: LET p$="Who's calling?"+l$: GO SUB sm: LET n$="                          ": RANDOMIZE USR xmt: OUT 115,5: FOR x=SGN x TO LEN n$
 1080 LET c=USR rcv: IF c=8 AND x>=SGN PI THEN LET x=x-SGN PI: GO TO VAL "1080"
 1105 IF c<>CODE l$ THEN LET n$(x)=CHR$ c: PRINT n$(x);: NEXT x
 1120 LET n$=n$( TO x-SGN PI)+L$: IF LEN n$<5 THEN GO TO VAL "1070"
 1130 LET p$=n$+"Correct (Y/N) >": GO SUB sm: LET c$=CHR$ USR rcv
 1140 IF c$="n" OR c$="N" THEN GO TO VAL "1070"
 1150 GO SUB nl: GO SUB 1300: LPRINT n$'p$( TO 14): GO TO VAL "2000"
 1160 REM send SCREEN$ DATA 
 1170 READ y: LET ret=VAL "1180": FOR y=SGN PI TO y: READ p$: GO SUB sm: GO TO 90
 1180 NEXT y: RETURN 
 1190 REM user LIST 
 1200 RESTORE VAL "1470": LPRINT " READ users LIST ": GO SUB cls: GO SUB VAL "1170": LET ret=menu: GO TO con
 1210 REM quit BBS 
 1230 GO SUB cls: RESTORE VAL "1530": GO SUB VAL "1170"
 1240 LET c$=CHR$ USR rcv: IF c$="n" OR c$="N" THEN GO TO menu
 1250 READ p$: GO SUB sm: GO SUB VAL "1300": GO SUB sm: LPRINT p$'': OUT mc,64: OUT mc,NOT PI
 1260 OUT mc,0: GO TO VAL "140"
 1270 REM timer 
 1280 LET time=VAL "((PEEK 23672+256*PEEK 23673+65536*PEEK 23674)/3600)": LET hr=INT (time/60): LET min=INT (time-hr*60): IF hr>=24 THEN LET hr=NOT PI: LET dy=dy+SGN PI: GO SUB VAL "1950"
 1290 RETURN 
 1300 GO SUB 1280: LET time=INT ((hr*60+min)-temp)
 1310 LET p1=INT (time/60): LET p2=INT (time-(p1*60)): IF p1<0 THEN LET p1=p1+24
 1320 LET c=SGN PI: GO SUB 1340: LET c=2: LET p1=hr: LET p2=min: GO SUB 1340
 1330 LET p$=STR$ mo+"-"+STR$ dy+"-"+STR$ yr+";"+t$(2)+"  Online "+t$(1)+l$: RETURN 
 1340 LET t$(c)=("0" AND LEN STR$ p1=SGN PI)+STR$ p1+":"+("0" AND LEN STR$ p2=SGN PI)+STR$ p2: RETURN 
 1350 REM menu DATA 
 1360 DATA 11,"    North Post Main Menu","","<B>ulletins","<C>hat","<G>oodby","<L>eave a Message"
 1370 DATA "<Q>uick Scan messages","<R>ead message","<T>ime on","<U>sers list",""
 1380 REM logon DATA 
 1390 DATA 14,"    North Post Message Post","-------------------------------","using an unexpanded Timex 2068","","Settings:","Duplex: Full   Word Size: 7","Parity: Even   Stop Bits: 1",""
 1400 DATA "","Let us know what you think","about this BBs","","Open 24hrs a day, 7 days a week",""
 1410 REM DATA ""
 1420 REM bull DATA 
 1430 DATA 13,"Sysop: Ralph McCrum","Mad Programmer: Paul Holmgren","","**** >>>  -Bullentin-   <<< **** "
 1435 DATA "       Other Timex BBS","","ISTUG SISTER BBS Indianapolis,","Ind. 317-898-3903 same settings","24 hrs.","","A SASE to the Sysop gets you a","free sample I.S.T.U.G. news-","letter"
 1440 DATA 14,"Keep May 2nd & 3rd open. The","Second TS Midwest Computer Fest","Will be in Indianapolis. Stay","tuned for future info","","The next I.S.T.U.G. meeting is","in Indianapolis at Paul","Holmgren's home. 1-24-87, 1:30","1-317-291-6002 for directions"
 1445 DATA "","To contact the North Post Sysop","Write to:","P.O. Box 1161","Mishawaka, Ind.  46544"
 1450 REM DATA ""
 1460 REM user DATA 
 1470 DATA 7,"PAUL HOLMGREN","WILLIE JONES","FRANK DAVIS","PHILL MCCRUM"
 1480 DATA "BUDDY KING","DAVE LEBOWITZ","DAVE BREHM"
 1490 DATA ""
 1500 DATA ""
 1510 DATA "argh","Igor","","","","","","","","","","","","","","","","","","","","","","","","","": REM passwords 
 1520 REM quit DATA 
 1530 DATA 8,"","The Indiana Sinclair Timex","","Users Group hopes you enjoyed"
 1540 DATA "","our little Bulletin Board.","","Are you ready to leave Y/N >","Goodby. Hanging up now"
 1550 REM DATA ""
 1560 REM edit 
 1570 ON ERR RESET 
 1580 LET p$="Commander Sysop taking control, Please Stand By": GO SUB sm
 1590 CLS : PRINT "SYSOP EDITOR"''"C heck Time"'"D elete a msg."'"E stablish correct time"'"H ang up"'"L eave a msg."'"M ain Menu"'"Q uick Scan Msg. base"'"R ead Msg."'"S ave messages"''"(C,D,E,H,L,M,Q,R,S)"
 1600 POKE VAL "23658",VAL "8": PAUSE ed: LET c$=INKEY$
 1610 IF c$="C" THEN GO SUB VAL "1300": PRINT p$( TO 14): GO TO VAL "1750"
 1620 IF c$="D" THEN INPUT "DELETE msg. #?: ";x: PRINT "Msg. # ";X;"deleted": LET m$(x)="": LET p$="": GO SUB 830: GO TO VAL "1750"
 1630 IF c$="E" THEN GO SUB VAL "1940"
 1640 IF c$="H" THEN GO TO VAL "1220"
 1650 IF c$="L" THEN LET ed=nl: GO TO VAL "630"
 1660 IF c$="M" THEN GO TO menu
 1670 IF c$="Q" THEN LET ed=nl: GO TO VAL "840"
 1680 IF c$="R" THEN INPUT " READ Msg. #? ";y: CLS : GO SUB 390: PRINT p$'m$(y,CODE "A" TO ): GO TO VAL "1750"
 1690 IF c$="S" THEN LET m$(sm)=d$: SAVE "TSBBSmbase" DATA m$()
 1700 GO TO VAL "1590"
 1710 CLS : LET ed=NOT PI: INPUT " SYMBL SHIFT/ STEP  TO STOP :"'"Msg. TO ? ";p$: LET m$(y)="To :"+p$+l$: LET m$(y,VAL "33" TO )="From : Sysop Willie"+l$: GO SUB VAL "825": GO SUB VAL "390": PRINT p$: LET p$=""
 1720 INPUT LINE c$: IF c$=" STEP " THEN LET p$=p$+CHR$ PI: GO TO VAL "1740"
 1730 LET p$=p$+c$+l$: PRINT c$: IF LEN p$<=VAL "535" THEN GO TO VAL "1720"
 1740 LET m$(y,CODE "A" TO )=p$: PRINT 
 1750 LET ed=NOT PI: PRINT " NEXT ?": PAUSE ed: GO TO VAL "1590"
 1760 REM error trapped messages 
 1770 ON ERR RESET : LET p$="Sorry "+n$+" A bug has Bit you.": GO SUB sm: GO SUB beep: GO TO menu: REM ?=control g=Beep 
 1780 IF ed THEN PRINT "I,m full, delete something first": GO TO VAL "1750"
 1790 LET p$="Message base full right now."+l$+"Please try later": LPRINT '"  I'm full. Do something. SOS"'': GO SUB sm: GO TO con
 1800 LET ret=VAL "450": LET p$="Sorry no message "+STR$ y+". Try again": GO SUB sm: GO TO con
 1810 REM idle SCREEN$ 
 1820 CLS : PRINT AT VAL "7",VAL "7";"The I.S.T.U.G. BBS";AT VAL "10",VAL "6";"Scanning Phone LINE "'''''''"  PEH SOFTWARE: 10-11-86": RETURN 
 1830 REM LPRINT sysop msg 
 1840 GO SUB cls: LET y=sm: LET m$(y)="": LET ed=y: GO TO VAL "720"
 1850 LPRINT n$;m$(sm,65 TO ed): LET ed=NOT PI: GO TO menu
 1860 REM init, 40 msg. base 
 1870 PAPER NOT PI: BORDER NOT PI: INK VAL "9": CLS 
 1880 PRINT '" STEP from most modes will GO TO SYSOP edit menu"
 1890 LET rcv=VAL "26724": LET xmt=VAL "26759": DIM t$(2,5): LET temp=PI: LET mc=VAL "119"
 1900 LET nl=VAL "30": LET sm=VAL "41": LET beep=VAL "70": LET menu=VAL "270": LET cls=VAL "380": LET con=VAL "580": LET l$=CHR$ 13: DIM m$(sm,VAL "600"): LET ed=NOT PI
 1910 INPUT "Add a message base? ";p$: IF p$="y" OR p$="Y" THEN PRINT "Start Message Base Tape.": LOAD "" DATA m$()
 1920 LET d$=m$(sm): GO TO VAL "1590"
 1930 REM FORMAT & POKE clock 
 1940 INPUT "Month  1-12 ";mo,"Day  1-31 ";dy,"Hour  00-23 ";hr,"Minute ";min,"Year  86 ";yr
 1950 LET x=VAL "(hr*3600+min*60)*60": LET y=INT (x/65536): POKE 23674,y
 1960 LET p1=x-y*65536: LET x=INT (p1/256): POKE 23673,x: POKE 23672,p1-x*256: RETURN 
 1970 REM SAVE 
 1980 CLEAR : SAVE "bbs" LINE PI: GO TO VAL "1860"
 1990 REM test USR name 
 2000 LET p$="Checking name": GO SUB sm
 2010 LET C$=N$: FOR X=SGN PI TO LEN C$: IF C$(X)>="a" AND c$(x)<="z" THEN LET c$(x)=CHR$ (CODE (c$(x))-32)
 2020 NEXT X
 2030 RESTORE VAL "1470": READ y: FOR x=SGN PI TO y: READ p$: IF c$( TO LEN P$)=p$ THEN LET p1=x: GO TO VAL "2190"
 2040 NEXT x
 2050 REM get callers info 
 2060 RESTORE VAL "2070": GO SUB cls: GO SUB VAL "1170"
 2070 DATA 14,"Answer the following questions.","","Access will be allowed after","we check on your information.","","The NORTH POST BBS is here to","serve the computer Hobbyist.","Leave messages, sale/want adds","etc.  ** HOWEVER ** improper","behavior Will not be tolerated","","So feel free to call again, BUT","please keep it clean.","           Thank You"
 2080 DATA "Your Real Name","street address","city, state, zip","Phone # XXX-YYY-ZZZZ","Type/model of computer","Password ? 5 letters max"
 2090 LET ret=VAL "2140": FOR c=SGN PI TO CODE "USR " STEP CODE " ": READ p$
 2100 GO SUB sm: GO SUB nl: FOR y=c TO c+VAL "31": LET c$=CHR$ USR rcv: IF CODE c$=8 AND y>=c THEN LET y=y-2: NEXT y
 2110 IF c$=l$ THEN GO TO VAL "2150"
 2120 LET m$(sm,y)=c$: PRINT c$;
 2130 GO TO 90
 2140 NEXT y
 2150 NEXT c
 2160 LET p$=m$(sm, TO CODE "RND")+"  Correct Y/N? >": GO SUB sm: LET c=USR rcv: IF c=CODE "n" OR c=CODE "N" THEN RESTORE VAL "2080": GO TO VAL "2090"
 2170 LPRINT m$(sm, TO CODE "RND")
 2180 RESTORE VAL "1530": READ y: FOR x=SGN PI TO y: GO TO VAL "1250"
 2190 LET p$="Password? ": GO SUB sm: LET c$="     ": FOR x=SGN PI TO LEN c$: LET c=USR rcv: IF c=8 AND x>=SGN PI THEN LET x=x-2: NEXT x
 2210 IF c<>CODE l$ THEN LET c$(x)=CHR$ c: NEXT x
 2220 RESTORE VAL "1510": FOR x=SGN PI TO p1: READ p$: NEXT x: IF c$( TO LEN p$)=p$ THEN GO TO menu
 2230 GO TO VAL "2180"
 
 TS-BBS
 
   10 CLS 
   20 PRINT AT 5,0;"Load BBSMC tape and press ""PLAY"""
   30 LOAD "bbsmc"CODE 
   35 PRINT "Loaded...Enter Date"
   37 INPUT "DATE: DD/MM ";d$
   40 PRINT ,,"PRESS ANY KEY TO GO ONLINE..."
   50 PAUSE 0
 1000 REM ANSWER PHONE
 1001 CLS 
 1002 OUT 119,34
 1004 OUT 119,0
 1006 PRINT AT 5,4;"SCANNING PHONE LINE..."
 1010 PRINT AT 10,6;"PRESS ""S"" to update cassette"
 1012 PRINT TAB 6;"PRESS ""C"" ANYTIME TO FORCE    CALLER INTO CHAT MODE"
 1020 LET a=IN 119
 1025 IF INKEY$="S" OR INKEY$="s" THEN PRINT "Saving BASIC...": SAVE "tsbbs" LINE 10: PRINT "Saving MC...": SAVE "bbsmc"CODE 65000,2200
 1030 IF a=5 THEN GO TO 1020
 1080 REM RING IN
 1090 OUT 119,2: OUT 119,34
 2000 REM WARM START
 2001 OUT 119,64: OUT 119,123: OUT 119,55
 2002 REM SET ONLINE TIMER
 2003 POKE 23672,0: POKE 23673,0: POKE 23674,0
 2004 GO SUB logonbull: GO SUB inname
 2005 REM MAIN MENU
 2006 GO SUB cls
 2007 DATA "      Willie's TS-BBS"," ","<R>ead your messages","<L>eave a message","<C>hat with SYSOP","<U>tilities Menu","<T>ime on since logon","<H>ang Up"," ","Choice?:"
 2010 RESTORE 2007
 2020 FOR p=1 TO 10: READ p$: GO SUB nl: GO SUB sm: NEXT p
 2036 ON ERR GO TO quit: GO SUB getkey: LET c$=r$
 2037 IF c$="U" OR c$="u" THEN GO TO 6100
 2040 IF c$="r" OR c$="R" THEN FOR x=1 TO 2: GO SUB nl: NEXT x: GO TO read
 2041 IF c$="t" OR c$="T" THEN GO SUB timer: LET p$="Connect time  HH/MM: ": LET p$=p$+x$: GO SUB nl: GO SUB sm: PAUSE 100: GO TO inputcom
 2045 IF c$="c" OR c$="C" THEN GO TO chat
 2047 IF c$="H" OR c$="h" THEN GO TO quit
 2050 IF c$="l" OR c$="L" THEN GO TO leave
 2070 GO TO inputcom
 3000 REM read messages
 3007 LET w(un)=0
 3010 LET p$="Message # to read (1-50,0=EXIT):": GO SUB sm
 3015 GO SUB getkey
 3020 LET m=VAL r$
 3022 IF m=0 THEN GO TO 3040
 3025 IF m<1 OR m>50 THEN GO TO 3010
 3030 GO TO 3060
 3040 REM DONE SCANNING MESSAGES
 3045 GO SUB nl: GO SUB nl
 3050 LET p$="message scan completed...": GO SUB sm: PAUSE 100: GO TO inputcom
 3060 REM MESSAGE #X FOUND
 3070 GO SUB cls: LET p$="Message #"+STR$ u: GO SUB sm: GO SUB nl
 3080 LET p$=m$(m): GO SUB sm
 3085 GO SUB nl: GO SUB nl: LET p$="A=Another  Q=Quit: ": GO SUB sm
 3090 GO SUB getkey: LET c$=r$
 3095 IF c$="A" OR c$="a" THEN GO SUB cls: GO TO 3030
 3105 IF c$="Q" OR c$="q" THEN GO TO inputcom
 3110 GO TO 3085
 4000 REM leave message
 4010 LET y=1
 4015 IF m(y)=0 THEN GO TO 4025
 4020 LET y=y+1: GO TO 4015
 4025 GO SUB cls
 4030 LET p$="Message #"+STR$ y: GO SUB sm
 4032 GO SUB nl: GO SUB nl
 4035 LET p$="Who gets the message? ": GO SUB sm
 4040 GO SUB getkey: LET a$=r$
 4042 LET i$="": LET k$=""
 4045 FOR x=1 TO LEN a$
 4050 IF a$(x)<>" " THEN LET i$=i$+a$(x)
 4055 IF a$(x)=" " THEN GO TO 4065
 4060 NEXT x
 4065 LET k$=a$(x+1 TO )
 4066 FOR x=1 TO tu: IF f$(x,1 TO LEN i$)=i$ AND l$(x,1 TO LEN k$)=k$ THEN GO TO 4070
 4067 NEXT x
 4070 LET w(x)=w(x)+1
 4072 LET m$(y,1 TO 32)="To: "+a$
 4075 LET p$="From: "+u$: GO SUB sm: LET m$(y,33 TO 64)=p$
 4080 GO SUB nl
 4085 LET p$="Input message (400 chars max)...<CTRL C> to save...": GO SUB sm: GO SUB nl
 4090 LET wm=1: GO SUB getkey: LET wm=0: LET p$="*DONE*": GO SUB sm: LET m$(y,65 TO )=r$
 4095 LET m$(y,LEN r$+65)=CHR$ 3
 4110 GO SUB nl: GO SUB nl
 4120 LET p$="R=Redo S=Save A=Abort: (R,S,A)": GO SUB sm
 4125 GO SUB getkey: LET c$=r$
 4130 IF c$="R" OR c$="r" THEN GO TO 4025
 4135 IF c$="S" OR c$="s" THEN LET m(y)=1: LET p$="*STORED*": GO SUB sm: PAUSE 100: GO TO inputcom
 4140 IF c$="A" OR c$="a" THEN GO TO inputcom
 4145 GO TO 4125
 5000 REM quit message base
 5001 ON ERR RESET 
 5100 GO SUB nl
 5110 LET p$="Thank you for calling!"
 5115 GO SUB cls
 5120 GO SUB sm
 5125 OUT 119,64: OUT 119,0: OUT 119,0
 5130 PAUSE 100: GO TO autoans
 6000 REM LOGON MESSAGE
 6001 PAUSE 30: FOR x=1 TO 30: RANDOMIZE USR output: OUT 115,0: NEXT x
 6002 IF IN 119<128 THEN GO TO quit
 6008 RANDOMIZE USR output: OUT 115,28
 6010 GO SUB cls
 6020 LET P$="      Willie's TS2068 BBS       c/o Indiana Sinclair-Timex               User Group": GO SUB sm
 6030 FOR x=1 TO 5: GO SUB nl: NEXT x
 6040 RETURN 
 6100 REM Utilities Sub-Menu
 6102 GO SUB cls
 6105 DATA "       Utility Sub-Menu","<C>hange Personal UserFile","<L>ist of users","<R>eturn to Main Menu"
 6110 RESTORE 6105
 6115 FOR p=1 TO 4: READ p$: GO SUB sm: GO SUB nl: NEXT p
 6117 GO SUB nl: GO SUB nl: LET p$="Choice? (C,L, or R): ": GO SUB sm
 6120 GO SUB getkey
 6125 IF r$="C" OR r$="c" THEN GO TO 6200
 6130 IF r$="L" OR r$="l" THEN GO TO 6300
 6135 IF r$="R" OR r$="r" THEN GO TO inputcom
 6140 GO TO 6120
 6199 REM CHANGE user file
 6200 GO SUB cls
 6205 LET p$="First Name: "+f$(un): GO SUB sm
 6207 IF LEN f$(un)<20 THEN GO SUB nl
 6210 LET p$="Last Name : "+l$(un): GO SUB sm
 6213 IF LEN l$(un)<20 THEN GO SUB nl
 6215 LET p$="PASSWORD  : "+w$(un): GO SUB sm
 6220 GO SUB nl
 6225 LET p$="Change line? (1-3, 0=Exit): ": GO SUB sm: GO SUB getkey
 6227 LET c$=r$
 6230 IF c$="0" THEN GO TO 6100
 6235 IF c$="3" THEN LET p$="New Password: ": GO SUB sm: GO SUB getkey: IF LEN r$>8 THEN LET p$="Must be 1-8 characters!": GO SUB sm: GO TO 6235
 6237 IF c$="3" THEN LET w$(un)=r$
 6240 IF c$="2" THEN LET p$="New Last Name: ": GO SUB sm: GO SUB getkey: LET l$(un)=r$
 6245 IF c$="1" THEN LET p$="New First Name: ": GO SUB sm: GO SUB getkey: LET f$(un)=r$
 6250 GO TO 6200
 6300 REM transmit userfile list
 6305 GO SUB cls
 6310 LET p$="Press ENTER when ready:": GO SUB sm
 6315 LET c=USR input
 6316 IF c<>13 THEN GO TO 6315
 6317 GO SUB nl
 6320 FOR x=1 TO tu
 6322 LET p$="User File #"+STR$ x
 6323 GO SUB sm: GO SUB nl
 6325 LET p$="Last  name: "+l$(x): GO SUB sm
 6327 IF LEN l$(x)<20 THEN GO SUB nl
 6330 LET p$="First name: "+f$(x): GO SUB sm
 6335 GO SUB nl: NEXT x
 6340 GO SUB nl: LET p$="Press any key to go to main menu": GO SUB sm: LET c=USR input: GO TO inputcom
 7000 REM chat
 7001 ON ERR GO TO quit
 7005 GO SUB nl: LET p$="Paging sysop...................": FOR x=1 TO 10: BEEP .1,1: NEXT x: GO SUB sm: GO SUB nl
 7006 FOR x=1 TO 128: IF INKEY$="" THEN LET p$=".": GO SUB sm: BEEP .1,10: NEXT x: LET p$="The sysop is not available.....": GO TO inputcom
 7008 GO SUB nl: LET p$="You are now in chat mode:": GO SUB sm: GO SUB nl
 7009 CLS : PRINT "You are in chat mode with       ";u$: PRINT : PRINT "SYMBL SHIFT/NOT to escape..."
 7015 POKE 23692,255
 7020 LET RxRDY=0: LET TxRDY=0
 7100 LET a=USR statchk: LET TxRDY=1 AND (a=1 OR a=3): LET RxRDY=1 AND (a=2 OR a=3)
 7130 IF RxRDY THEN LET k=USR input: PRINT CHR$ k;: IF k=13 THEN PRINT ">";
 7135 IF RxRDY THEN IF k=3 THEN GO TO inputcom
 7140 IF TxRDY AND INKEY$<>"" THEN GO SUB 7160
 7150 GO TO 7010
 7160 IF TxRDY THEN LET i$=INKEY$: PRINT i$;: IF CODE i$<>12 THEN OUT 115,CODE i$: IF CODE i$=13 THEN PRINT ">";
 7161 IF CODE i$=195 THEN GO TO inputcom
 7162 IF INKEY$<>"" THEN GO TO 7162
 7163 RETURN 
 7200 FOR d=1 TO LEN p$: RANDOMIZE USR output: OUT 115,CODE p$(d): PRINT p$(d);
 7202 IF CODE p$(d)=3 THEN GO TO 7210
 7203 IF INKEY$="c" THEN GO TO 7015
 7205 NEXT d
 7210 RETURN 
 7220 REM Send a CHR$ 13
 7230 POKE 23692,255: PRINT : RANDOMIZE USR output: OUT 115,13: RETURN 
 7235 REM input subroutine
 7237 LET r$=""
 7240 LET c=USR input
 7241 IF c=3 AND wm=1 THEN RETURN 
 7242 IF c=13 AND wm=1 THEN LET r$=r$+CHR$ 13: GO TO 7240
 7245 IF c=13 THEN LET wm=0: RETURN 
 7250 IF c=8 THEN LET r$=r$( TO (LEN r$-(LEN r$>0))): GO TO 7240
 7255 IF c<>13 AND c<>8 AND (c<32 OR c>122) THEN GO TO 7240
 7260 LET r$=r$+CHR$ c: PRINT CHR$ c;
 7265 GO TO 7240
 7400 CLS : RANDOMIZE USR output: OUT 115,28: RANDOMIZE USR output: OUT 115,31: RETURN 
 8000 REM user input subroutine
 8010 LET p$="First Name: ": GO SUB sm
 8020 GO SUB getkey: LET a$=r$
 8050 LET p$="Last Name : ": GO SUB sm
 8060 GO SUB getkey: LET b$=r$
 8065 GO SUB nl: LET p$="Above correct? (Y/N): ": GO SUB sm: GO SUB getkey: IF r$="n" OR r$="N" THEN GO TO 8000
 8075 LET u$=a$+" "+b$
 8080 FOR x=1 TO tu
 8085 IF l$(x,1 TO LEN b$)=b$ AND f$(x,1 TO LEN a$)=a$ THEN GO TO 8300
 8090 NEXT x
 8120 LET p$="You are a new user....": GO SUB sm
 8125 REM new user
 8127 LET tu=tu+1: IF tu>50 THEN LET tu=tu-1: LET p$="Sorry! Total number of users    allowed access to this system   has been reached. Please call   back in a few days, by then a   new spot should be open: THANKS!"
 8128 IF tu>50 THEN GO SUB sm: PAUSE 300: GO TO quit
 8130 GO SUB cls
 8132 LET un=x
 8135 LET p$="          WELCOME!": GO SUB sm: GO SUB nl: GO SUB nl
 8140 GO SUB nl: GO SUB nl
 8145 LET p$="I do hope you enjoy your visit  with my BBS and please feel freeto leave any comments you wish  addressed to SYSOP": GO SUB sm
 8150 GO SUB nl: GO SUB nl
 8155 LET p$="Please enter a 1-8 character    password for further protection of your private mail-": GO SUB sm
 8160 GO SUB nl
 8165 GO SUB nl: LET p$="PASSWORD: ": GO SUB sm
 8170 GO SUB getkey: LET c$=r$: IF LEN c$>8 THEN LET p$="Must be 1-8 characters ONLY!": GO SUB sm: GO TO 8165
 8175 LET p$="Your password is "+c$: GO SUB sm: LET w$(un)=c$
 8180 GO SUB nl: LET p$="Change password? (Y/N):": GO SUB sm
 8185 GO SUB getkey
 8190 IF r$="Y" OR r$="y" THEN GO TO 8160
 8195 LET l$(un)=b$: LET f$(un)=a$
 8200 LET z$(un)=d$
 8205 LET t(un)=1
 8250 PAUSE 150: GO TO inputcom
 8300 REM old user
 8305 GO SUB nl
 8310 LET un=x
 8315 LET p$="PASSWORD  : ": GO SUB sm
 8320 GO SUB getkey
 8407 GO SUB nl
 8410 IF r$<>w$(un,1 TO LEN r$) THEN LET p$="Incorrect password -- Try again": GO SUB sm: GO TO 8300
 8415 LET p$="You have called this system "+STR$ t(un): GO SUB sm: GO SUB nl: LET p$="times before.": GO SUB sm
 8417 GO SUB nl
 8420 LET p$="Last time called was on "+z$(un): GO SUB sm
 8425 IF w(un)>0 THEN LET p$="You have "+STR$ w(un)+" messages waiting.": GO SUB sm
 8430 LET z$(un)=d$
 8435 LET t(un)=t(un)+1
 8440 PAUSE 200: GO TO inputcom
 9990 REM timer
 9992 DIM x$(5): LET time=INT ((PEEK 23672+256*PEEK 23673+256*256*PEEK 23674)/60): LET hr=INT (time/60/60): LET min=INT ((time-(hr*60*60))/60): PRINT AT 20,0;"0" AND hr<10;hr;":";"0" AND min<10;min: FOR x=1 TO 5: LET x$(x)=SCREEN$ (20,x-1): NEXT x
 9993 RETURN 

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.

People

No people associated with this content.

Scroll to Top