5TEXT
10REM public domain...please share any modifications you     make!
11REM VERSION, NAME and Changes
12REM 1.0/G.Meyer
13REM 1.1/Jim McQuillan
14REM 2.0/Alan Neeley 
15REM 3.0/Alan Neeley
16REM if you change the program add name to list and up the version number
17REM Experimental XMODEM version by Alan Neeley
20REM Internal SydMODEM version by Alan Neeley
21POKE 16149, 255:POKE 16150, 255:REM removes Coleco's   poke limitations so we can reset key buffer later.
30? " ADAM CHAT"
32? " to use this program, the":? " internal 300/1200 baud"
33? " SydMODEM should be connected."
34? " push any key or [ESCAPE/WP]    to exit program"
36POKE 64885, 0
38 p=PEEK(64885):IF p=0 THEN 38
39IF p=27 THEN END
45LOMEM :29000:REM reserve space for machine code
50 location=28000: length=81
51REM 28000=begin of Machine Code. 75=length of machine     code...change these if modified
60FOR i=location TO location+length
65READ d
70POKE i, d
80NEXT i
90 location=28100: length=15
91FOR i=location TO location+length
92READ d:POKE i, d:NEXT i
100REM give ML routine locations a variable name
110 init=28024: cin=28061: cntrl=28029: dump=28062: chrout=28075: baud=28000: frmt=28019
111 ustat=28049: cdstat=28037: carrier=28048
130CALL baud:CALL frmt:CALL init:CALL cntrl
140GOSUB 1000
150GOSUB 1500
220REM sets up terminal screen design
230POKE 16995, 1:HOME
231IF PEEK(carrier)=0 THEN HTAB 8:VTAB 1:INVERSE:? "AT COMMAND MODE"; :NORMAL
232IF PEEK(carrier)=255 THEN HTAB 8:VTAB 1:INVERSE:? " TERMINAL MODE "; :NORMAL
233HTAB 10:VTAB 24:? "A-CHAT 3.0":HTAB 1:VTAB 2
240POKE 16953, 128:GOTO 430
430REM TERMINAL EMULATOR MAIN LOOP START
440POKE 64885, 0:REM clear keypress register
450REM no carrier detect needed here (Press SmartKEY I to see if ON-LINE)
460IF PEEK(64885)=0 THEN 500:REM no key pressed see if   something is coming in
465IF PEEK(64885)=27 THEN POKE 16995, 0:POKE 16953, 95:HOME:END
466IF PEEK(64885)=144 THEN 140
467IF PEEK(64885)=129 THEN GOTO 570
468IF PEEK(64885)=130 THEN CALL 28076:POKE 64885, 0:GOTO 1900
469IF PEEK(64885)=131 THEN CALL 28100:POKE (64885), 0:GOTO 1800
470 y=PEEK(64885):POKE chrout, y:REM the keypress is now  ready to be sent out to modem
480CALL dump:REM send it out!
490POKE 64885, 0:REM reset keypress register so next one  will be detected even if same key again
500CALL ustat:REM check for incoming data from modem
510IF PEEK(cin)=0 THEN 450:REM no new incoming data so   back to start of loop.
520 q=PEEK(cin):REM put data value so it can be printed   easy
530IF q=16 THEN  q=64:REM print '@' instead of ^P. Other  filters can go here too!
531REM needs to filter out line feeds
532IF q=10 THEN 550
533IF q=26 THEN  q=3:REM pressing CONTROL Z sends out a CONTROL C
540? CHR$(q); :REM show what it is
550POKE cin, 0:REM re-set incoming flag so next pass will be okay
560GOTO 450:REM more torture!
570REM CARRIER TEST ROUTINE
580POKE carrier, 0:REM reset flag
590CALL cdstat
600IF PEEK(carrier)=0 THEN GOSUB 800:GOTO 650
601IF PEEK(carrier)=255 THEN GOSUB 800:GOTO 700
605GOTO 570
650HTAB 8:VTAB 1:INVERSE:? "AT COMMAND MODE"; :NORMAL:GOSUB 850:GOTO 450
700HTAB 8:VTAB 1:INVERSE:? " TERMINAL MODE "; :NORMAL:GOSUB 850:GOTO 450
800REM CURSOR CONTROL
805 h=POS(0): v=VPOS(0):POKE 16953, 32
810RETURN
850IF v<=0 THEN  v=1
852IF v>=23 THEN  v=22
854IF h<=0 THEN  h=1
856IF h>=31 THEN  h=30
858IF h=1 THEN HTAB 1:VTAB v+1:GOTO 862
860VTAB v+1:HTAB h+1
862POKE 16953, 128:RETURN
999END
1000HOME:POKE 16953, 32:REM COMMAND SCREEN
1005HTAB 8:VTAB 1:INVERSE:? "COMMAND SCREEN":NORMAL
1010HTAB 2:VTAB 5:INVERSE:? "BAUD RATE:"; :NORMAL
1012IF PEEK(28011)=1 THEN  br$="300 BAUD"
1014IF PEEK(28011)=0 THEN  br$="1200 BAUD"
1018? " "; br$
1020HTAB 2:VTAB 7:INVERSE:? "CHARACTER FORMAT:"; :NORMAL
1022IF PEEK(28020)=3 THEN  cf$="8-N-1"
1024IF PEEK(28020)=26 THEN  cf$="7-E-1"
1026? " "; cf$
1030RETURN
1500REM OPTIONS
1505HTAB 12:VTAB 10:INVERSE:? " PRESS ":NORMAL
1510HTAB 2:VTAB 12:? "SmartKEY I -> BAUD RATE"
1515HTAB 2:VTAB 14:? "SmartKEY II -> FORMAT"
1516HTAB 2:VTAB 16:? "SmartKEY III -> XMODEM Upload"
1520HTAB 2:VTAB 18:? "WILDCARD -> TERMINAL MODE"
1525HTAB 2:VTAB 20:? "ESCAPE/WP -> END PROGRAM"
1550GET a$
1551IF ASC(a$)=129 THEN 1600
1552IF ASC(a$)=130 THEN 1700
1553IF ASC(a$)=131 THEN 2000
1555IF ASC(a$)=144 THEN RETURN
1556IF ASC(a$)=27 THEN POKE 16995, 0:POKE 16953, 95:HOME:END
1560GOTO 1550
1600REM CHANGE BAUD RATE
1605IF PEEK(28011)=1 THEN POKE 28011, 0:POKE 28007, 1:CALL baud:GOSUB 1005:GOTO 1550
1610IF PEEK(28011)=0 THEN POKE 28011, 1:POKE 28007, 0:CALL baud:GOSUB 1005:GOTO 1550
1700REM CHANGE FORMAT
1705IF PEEK(28020)=3 THEN POKE 28020, 26:CALL frmt:GOSUB 1005:GOTO 1550
1710IF PEEK(28020)=26 THEN POKE 28020, 3:CALL frmt:GOSUB 1005:GOTO 1550
1800REM RING DETECTOR
1805IF PEEK(28116)=0 THEN ?:? "NO RING"
1810IF PEEK(28116)=1 THEN ?:? "RING!"
1815GOTO 430
1900REM BAUD CONNECTED
1905IF PEEK(cin)=254 THEN ?:? "1200 BAUD"
1910IF PEEK(cin)=255 THEN ?:? "300 BAUD"
1915POKE 28061, 0:GOTO 430
2000REM XMODEM UPLOAD
2005HOME:POKE 16953, 95: d$=CHR$(4)
2010INPUT "Enter Filename: "; fi$
2050ONERR  GOTO 2090
2055HTAB 1:? d$; "OPEN "; fi$
2060HTAB 1:? d$; "READ "; fi$
2062GOSUB 2115
2065 bl=0
2066 cs=0: xm$=""
2067 bl=bl+1
2070GET a$: cs=cs+ASC(a$)
2072 xm$=xm$+a$:IF LEN(xm$)<>128 THEN 2070
2075GOSUB 2100
2076GOSUB 2125
2080GOTO 2066
2090HTAB 1:? d$; "CLOSE "; fi$:CLRERR
2092FOR x=1 TO (128-LEN(xm$)): xm$=xm$+CHR$(0):NEXT x
2094GOSUB 2100
2095GOSUB 2125
2096POKE chrout, 4:CALL dump
2097GOSUB 2115:IF PEEK(cin)<>6 THEN 2096
2098? "TRANSFER COMPLETE":FOR x=1 TO 1000:NEXT x:GOTO 140
2100 hb=INT(cs/256)
2105 lb=cs-(hb*256)
2110 cs=lb:RETURN
2115CALL ustat:IF PEEK(cin)=0 THEN 2115
2116IF PEEK(cin)=21 THEN RETURN
2117IF PEEK(cin)=24 THEN ? "CANCELLED":HTAB 1:? d$; "CLOSE "; fi$:GOTO 140
2118IF PEEK(cin)=6 THEN RETURN
2119POKE cin, 0:GOTO 2115
2125POKE chrout, 1:CALL dump
2126POKE chrout, bl:CALL dump
2127POKE chrout, (255-bl):CALL dump
2128FOR x=1 TO 128:POKE chrout, ASC(MID$(xm$, x, 1)):CALL dump:NEXT x
2129POKE chrout, cs:CALL dump
2130GOSUB 2115
2135IF PEEK(cin)=6 THEN ? "# "; bl; " sent":RETURN
2136IF PEEK(cin)=21 THEN ? "TRYING AGAIN":GOTO 2125
2999END
10000REM ** start of Machine Code **
10001DATA 62,128,211,91,211,91,62,0,211,88,62,1,211,89,62,0,211,91,201
10002DATA 62,3,211,91,201
10003DATA 62,3,211,92,201,62,3,211,89,201
10004DATA 0,0,0,219,94,203
10005DATA 127,200,62,255,50,144,109,201,0,219
10006DATA 93,183,203,71,200,219,88,50,157,109
10007DATA 201,0,219,93,203,111,40,250,58,171
10008DATA 109,211,88,201,0,0
10010DATA 219,95,50,157,109,201
10015DATA 62,0,50,212,109,219,94,203,119,200,62,1,50,212,109,201
                                                                                