--- title: "BBSes" id: 64705 type: "computer_media" slug: "bbses" url: "http://localhost/computer_media/bbses/" markdown_url: "http://localhost/computer_media/bbses.md" published_at: "2026-03-06T23:40:29+00:00" modified_at: "2026-04-03T07:57:53+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2026/03/1stUG_BBS.png" excerpt: "Four complete bulletin board systems in BASIC reveal how hobbyists built working dial-up BBSes with serial machine code routines, message arrays, and sysop editors." category: - name: "Archived Media" slug: "archived-media" taxonomy: "category" url: "http://localhost/category/archived-media/" post_tag: - name: "TS 2068" slug: "ts2068" taxonomy: "post_tag" url: "http://localhost/tag/ts2068/" - name: "Type-in program" slug: "type-in-program" taxonomy: "post_tag" url: "http://localhost/tag/type-in-program/" model: - name: "Timex/Sinclair 2068" slug: "ts-2068" taxonomy: "model" url: "http://localhost/model/ts-2068/" genre: - name: "BBS" slug: "bbs" taxonomy: "genre" url: "http://localhost/type/bbs/" media_type: "Program" download_url: "https://archive.org/download/timex-sinclair-software-archive/BBSs%28198x%29%28Variuos%29%28TS2068%29%28US%29%28Programs%29.zip" mediadate: "198x" images: - url: "http://localhost/wp-content/uploads/2026/03/1stUG_BBS.png" - url: "http://localhost/wp-content/uploads/2026/03/AJBBS.png" - url: "http://localhost/wp-content/uploads/2026/03/FarmersBBS.png" - url: "http://localhost/wp-content/uploads/2026/03/RalphBBS.png" - url: "http://localhost/wp-content/uploads/2026/03/tbbs.png" - url: "http://localhost/wp-content/uploads/2026/03/1stUG_BBS-scaled.jpg" media_type_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 `65000`–`65212`; 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: | Columns | Content | | --- | --- | | 1–32 | “TO: ” + recipient name | | 33–64 | “FROM: ” / “From: ” + sender name | | 65–end | Message 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 `y1`–`y4` 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.” ## 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 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).. 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": 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 p1hat","oodby","eave a Message" 1360 DATA "uick Scan messages","ead message","ime on","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","ead messages","eave message","hat with Fat Rat Daddy","ime on","oodbye","nfo files","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 y5y3 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).. 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"''"ead messages"''"elete messages"''"eave messages"''"uit editor"''"ave message base" 1540 PRINT '"reak program"''"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 '" 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","ead messages","eave message","nfo files","ime on","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).. 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;"ead messages";AT 4,0;"elete messages";AT 6,0;"eave messages";AT 8,0;"uit editor";AT 10,0;"ave message base";AT 12,0;"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 " 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 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).. 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","","ulletins","hat","oodby","eave a Message" 1370 DATA "uick Scan messages","ead message","ime on","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"," ","ead your messages","eave a message","hat with SYSOP","tilities Menu","ime on since logon","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)... 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","hange Personal UserFile","ist of users","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 ```