   10REM > telstar
   20:
   30REM This is a basic Viewdata/Videotex client written in BBC BASIC. but
   40REM using some Matrix Brandy extensions. For instance, the networking
   50REM interface is a local extension, as is the screen memory access and
   60REM the *WinTitle command.
   70:
   80VER$="Viewdata client version 20220117"
   90:
  100IF INKEY(-256) <> &4D THEN PRINT "This program works on Matrix Brandy for RISC OS or SDL only.":END
  110SYS"Brandy_Platform" TO ,,,sdl%,,leg%
  120IF sdl% = 0 AND ((leg% AND &F0) <> &A0) THEN PRINT "This program works on Matrix Brandy for RISC OS or SDL only.":END
  140:
  150SYS"OS_Byte",229,1: SYS "OS_Byte",4,1
  160OSCLI"Key1|_":OSCLI"KEY2"+CHR$(130)
  170ON ERROR GOTO 560
  180MODE 7:OFF: VDU23,16,1|23,18,1|
  190reveal%=0:scan%=0:width%=1:black%=0:ost%=0
  200dh%=0:dhline%=0:borked%=0:telnet%=1:extended%=0
  210allowfs%=1:DIM scr%% 1000
  220REM Variables for downloading
  230screen%=0
  240download%=0
  250X%=OPENUP(FNwelcome):VDU28,0,23,39,0,31
  260S$=MID$(S$,1+INSTR(S$,":"))
  270PROCstatusbar(CHR$132+"* "+S$)
  280IF sdl% THEN OSCLI"WinTitle Matrix Network Viewdata/Teletext Client: Connected"
  290REM Send Telnet init data if required
  300IF telnet%=1 THEN BPUT#X%,&FF,&FD,&03 ELSE VDU23,18,1,2|:BPUT#X%,13
  310REPEAT
  320M%=BGET#X%: IF M%=-2 THEN GOTO 550
  330IF M% = -1 AND TIME > ost%+5 THEN PROCstatusxfer(0)
  340IF M% >= 0 THEN PROCvdu(M%):PROCstatusxfer(1): GOTO550
  350SYS "OS_Byte",21,0:I%=INKEY(20):IF I%=-1 THEN PROCdhscan: GOTO 550
  360PROCstatusxfer(2)
  370IF I%=35 OR I%=13 THEN I%=95:GOTO540
  380IF I%>=32 AND I%<=126THENGOTO540
  390IF I%=127 THEN I%=8:GOTO450
  400IF I%=4 THEN GOTO 560
  410IF I%=6 THEN PROCtogglescreen: GOTO 320
  420IF I%=18 THEN PROCreveal: GOTO 320
  430IF I%=2 THEN PROCtoggleblack: GOTO 320
  440IF I%=24 THEN GOTO 590
  450IF I%=8 AND borked%=1 THEN VDU8,32:GOTO540
  460IF I%>=136 AND I%<=139 THEN I%-=128
  470IF I%=31THENPROChelp:GOTO320
  480IF I%=130THENI%=FNcontrolcode:GOTO540
  490IF I%=159ORI%=203THENBPUT#X%,42:BPUT#X%,48:I%=48:GOTO540
  500IF I%=158ORI%=202THENBPUT#X%,42:BPUT#X%,48:I%=57:GOTO540
  510IF I%=172ORI%=236THENBPUT#X%,42:I%=95:GOTO540
  520IF I%=175ORI%=239THENBPUT#X%,42:BPUT#X%,48:I%=95:GOTO540
  530IF I%=171ORI%=233THENBPUT#X%,42:BPUT#X%,57:BPUT#X%,48:I%=95
  540IF I% > 0 THEN BPUT#X%,I%
  550UNTIL M%=-2
  560CLOSE#X%
  570IF sdl% THEN PROCstatusbar(CHR$129+"Disconnected  "+CHR$156): *WinTitle Matrix Network Viewdata/Teletext Client: Disconnected
  580VDU26:PRINTTAB(18,24)CHR$(128+RND(7));"Press any key...";: A=GET:RUN
  590CLOSE#X%:PRINT TAB(0,24);: ON: OSCLI"FX229":END
  600:
  610DEFPROCvdu(M%)
  620IF M% >= 32 THEN PROCactvdu: ENDPROC
  630CASE M% OF
  640WHEN 27: REPEAT N%=BGET#X%: UNTIL N%<>-1: N%=(N% MOD 32)+128: VDU N%: PROCcheckdh: ENDPROC
  650WHEN 8: IF POS=0 AND VPOS=0 THEN VDU31,39,23 ELSE VDU 8
  660WHEN 9: IF POS=39 AND VPOS=23 THEN VDU30 ELSE VDU9
  670WHEN 10: PROCcheckline: dh%=0: IF VPOS<23 THEN VDU10 ELSE VDU 31,POS,0
  680WHEN 11: IF VPOS > 0 THEN VDU11 ELSE VDU31,POS,23
  690WHEN 12, 13, 30: VDU M%
  700WHEN 17: ON
  710WHEN 20: OFF
  720ENDCASE
  730IF VPOS=24 THEN VDU31,POS,0
  740ENDPROC
  750:
  760DEFPROCcheckdh
  770IFN%=141THEN dh%=1:dhline%=VPOS:scan%=1
  780ENDPROC
  790:
  800DEFPROCactvdu
  810IFdhline%<>VPOS THEN dh%=0
  820VDU (M% OR 128):IF VPOS=24 OR (VPOS=23 AND POS=40) THEN VDU30
  830ENDPROC
  840:
  850DEFPROCcheckline
  860IF dh%=0 THEN ENDPROC
  870N%=VPOS:PROCcopyline
  880ct%=0:REPEAT:dm%=BGET#X%:IFdm%<>27THENct%+=1
  890UNTIL ct%=40 OR dm%=10 OR dm%=11
  900IF dm%=11 THEN VDU11 ELSE VDU10
  910ENDPROC
  920:
  930DEFPROCdhscan
  940IFscan%=0ENDPROC
  950FOR N%=0 TO 22: FOR P%=0 TO 39
  960IF GET(P%,N%) = 141 THEN PROCcopyline: N%+=1
  970NEXT P%, N%
  980scan%=0
  990ENDPROC
 1000:
 1010DEFPROCcopyline
 1020IF N% > 22 THEN ENDPROC
 1030x%=POS:y%=VPOS
 1040VDU31,0,N%+1
 1050FOR P%=0 TO 39: VDU GET(P%,N%): NEXT
 1060VDU31,x%,y%
 1070ENDPROC
 1080:
 1090DEFPROCreveal
 1100reveal% EOR=1
 1110VDU23,18,2,reveal%|
 1120ENDPROC
 1130:
 1140DEFPROCtoggleblack
 1150black% EOR=1
 1160VDU23,18,3,black%|
 1170ENDPROC
 1180:
 1190DEFPROCtogglescreen
 1200IF allowfs%=0THENENDPROC
 1210OSCLI"Fullscreen"
 1220SYS"OS_Byte",42 TO ,fs%
 1230IF fs% AND 8 THEN MOUSE OFF ELSE MOUSE ON
 1240ENDPROC
 1250:
 1260DEFPROCstatusbar(status$)
 1270IFsdl%=0 THEN ENDPROC
 1280$&7FC0=STRING$(40," ")
 1290status$=CHR$157+LEFT$(status$, 37)
 1300$&7FC0=status$: ?(&7FC0+LENstatus$)=32
 1310ENDPROC
 1320:
 1330DEFPROCstatusxfer(st%)
 1340IFsdl%=0 THEN ENDPROC
 1350CASE st% OF
 1360WHEN 1:?&7FC2=ASC"["
 1370WHEN 2:?&7FC2=ASC"]"
 1380OTHERWISE: ?&7FC2=32
 1390ENDCASE
 1400ost%=TIME
 1410ENDPROC
 1420:
 1430DEFFNwelcome
 1440PROCwelcomescreen
 1450REPEAT A%=GET: UNTIL (A% >= 48 AND A% <= 55) OR A%=6 OR A%=24 OR A%=84 OR A%=116
 1460IF A% = 24 OR A% = 48 THEN PRINT:ON:OSCLI"FX229":END
 1470IF A% = 6 THEN PROCtogglescreen: GOTO 1450
 1480IF A% = 49 THEN borked%=1: S$ = "ip0:glasstty.com:6502"
 1490IF A% = 50 THEN borked%=1: S$ = "ip0:glasstty.com:6503"
 1500IF A% = 51 THEN borked%=1: S$ = "ip0:glasstty.com:6504"
 1510IF A% = 52 THEN borked%=0: S$ = "ip0:fish.ccl4.org:23"
 1520IF A% = 53 THEN borked%=0: S$ = "ip0:nx.nxtel.org:23280"
 1530IF A% = 54 THEN borked%=0: S$ = "ip0:pegasus.matrixnetwork.co.uk:6502"
 1540IF A% = 55 THEN borked%=0: S$ = "ip0:endofthelinebbs.com:6502"
 1550IF A% = 84 OR A% = 116 THEN telnet%=telnet% EOR 1: GOTO 1440
 1560CLS
 1570=S$
 1580:
 1590DEFPROCwelcomescreen:CLS:VDU26
 1600IF sdl% THEN *WinTitle Matrix Network Viewdata/Teletext Client
 1610PRINT "  ";CHR$(132);CHR$(157);CHR$(135);CHR$(141);"Matrix Network Viewdata Client ";CHR$(156)
 1620PRINT "  ";CHR$(132);CHR$(157);CHR$(135);CHR$(141);"Matrix Network Viewdata Client ";CHR$(156)
 1630PRINT
 1640PRINT CHR$(131);"1 - Telstar";CHR$(133);"(CURRER)"
 1650PRINT CHR$(131);"2 - Telstar";CHR$(133);"(ELLIS)"
 1660PRINT CHR$(131);"3 - Telstar";CHR$(133);"(ACTON)"
 1670PRINT CHR$(131);"4 - Tetrachloromethane";CHR$(133);"(CCl4)"
 1680PRINT CHR$(131);"5 - NXtel"
 1690PRINT CHR$(131);"6 - TEEFAX";CHR$(133);"and Matrix Teletext"
 1700PRINT CHR$(131);"7 - End Of The Line BBS"
 1710
 1720PRINT
 1730PRINT CHR$(131);"T - Toggle Telnet codes -";
 1740IF telnet%=1 THEN PRINT CHR$(130);"ON" ELSE PRINT CHR$(129);"OFF"
 1750PRINT
 1760PRINT CHR$(129);"0 - Exit"
 1770PRINT TAB(0,15)CHR$(134);"While the session is running:"
 1780IF allowfs%=1 THEN PRINT CHR$(134);" Press CTRL-F to toggle Full Screen":
 1790PRINT CHR$(134);" Press CTRL-R to toggle Reveal"
 1800PRINT CHR$(134);" Press CTRL-B to toggle Black"
 1810PRINT CHR$(134);" Press CTRL-X to exit immediately"
 1820PRINT CHR$(134);" Press CTRL-D to disconnect":PRINT
 1830PRINT CHR$(130);" F1 or CTRL-/ for help & other keys"
 1840PRINT TAB(4,23)CHR$(129);"Please make your selection..."
 1850PRINT CHR$(132);CHR$(157);CHR$(135);VER$;
 1860ENDPROC
 1870:
 1880DEFPROChelp
 1890x%=POS:y%=VPOS:VDU26:PROCstorescreen:CLS
 1900PRINT "  ";CHR$(132);CHR$(157);CHR$(135);CHR$(141);"Matrix Network Viewdata Client ";CHR$(156)
 1910PRINT "  ";CHR$(132);CHR$(157);CHR$(135);CHR$(141);"Matrix Network Viewdata Client ";CHR$(156)
 1920PRINT
 1930PRINT CHR$(134);"Special keys available:":PRINT
 1940IF allowfs%=1 THEN PRINT CHR$(134);" Press";CHR$(131);"CTRL-F";CHR$(134);"to toggle Full Screen":
 1950PRINT CHR$(134);" Press";CHR$(131);"CTRL-R";CHR$(134);"to toggle Reveal":
 1960PRINT CHR$(134);" Press";CHR$(131);"CTRL-B";CHR$(134);"to toggle Black";CHR$(133);"*"
 1970PRINT CHR$(134);" Press";CHR$(131);"CTRL-X";CHR$(134);"to exit immediately"
 1980PRINT CHR$(134);" Press";CHR$(131);"CTRL-D";CHR$(134);"to disconnect": PRINT
 1990PRINT
 2000PRINT CHR$(131);" CTRL-[";CHR$(134);"Select previous frame";CHR$(129);"(*#)"
 2010PRINT CHR$(131);" CTRL-^";CHR$(134);"Select main index frame";CHR$(129);"(*0#)"
 2020PRINT CHR$(131);" PgUp";CHR$(134);" redraw current frame";CHR$(129);"(*00)"
 2030PRINT CHR$(131);" PgDn";CHR$(134);" Request updated frame";CHR$(129);"(*09)"
 2040PRINT CHR$(131);" CTRL-END";CHR$(134);"Request disconnect";CHR$(129);"(*90#)"
 2050PRINT
 2060PRINT CHR$(130);" F2: Send teletext control code":PRINT
 2070PRINT CHR$(133);"*";CHR$(134);"This also switches the Hold Character"
 2080PRINT CHR$(134);"behaviour between that of the";CHR$(131);"SAA5050";CHR$(134);"/"
 2090PRINT CHR$(131);"BBC Micro";CHR$(134);"and later Teletext/Videotex"
 2100PRINT CHR$(134);"specifications."
 2110IFGET
 2120PROCrestorescreen
 2130VDU28,0,23,39,0,31,x%,y%
 2140ENDPROC
 2150:
 2160DEFFNcontrolcode
 2170x%=POS:y%=VPOS:VDU26:PROCstorescreen:CLS
 2180VDU23,18,3,1|
 2190PRINT "  ";CHR$(132);CHR$(157);CHR$(135);CHR$(141);"Matrix Network Viewdata Client ";CHR$(156)
 2200PRINT "  ";CHR$(132);CHR$(157);CHR$(135);CHR$(141);"Matrix Network Viewdata Client ";CHR$(156)
 2210PRINT
 2220PRINT CHR$(141);CHR$(134);SPC(10);"Control codes:"
 2230PRINT CHR$(141);CHR$(134);SPC(10);"Control codes:"
 2240PRINT " @:(text black)     P:(graphics black)"
 2250PRINT CHR$(129);"A: text red        Q: graphics red"
 2260PRINT CHR$(130);"B: text green      R: graphics green"
 2270PRINT CHR$(131);"C: text yellow     S: graphics yellow"
 2280PRINT CHR$(132);"D: text blue       T: graphics blue"
 2290PRINT CHR$(133);"E: text magenta    U: graphics magenta"
 2300PRINT CHR$(134);"F: text cyan       V: graphics cyan"
 2310PRINT CHR$(135);"G: text white      W: graphics white"
 2320PRINT CHR$(136);"H: Flash On";CHR$(137);"       X: Conceal"
 2330PRINT CHR$(137);"I: Flash Off       Y: Contiguous gfx"
 2340PRINT " J: &8A (End Box)   Z: Separated gfx"
 2350PRINT " K: &8B (Start Box)";CHR$&9B;"[: &9B (Esc/Switch)"
 2360PRINT " L: Dbl Height Off ";CHR$&9B;"|: Black background"
 2370PRINT " M: Dbl Height On  ";CHR$&9B;"]: Set bg colour"
 2380PRINT " N: &8E (dbl width)";CHR$&9B;"^: Hold graphics"
 2390PRINT " O: &8F (dbl size) ";CHR$&9B;"#: Release graphics"
 2400PRINT
 2410PRINT CHR$(134);"Note: Codes &8A, &8B, &8E, &8F and &9B"
 2420PRINT CHR$(134);"have no effect in this client."
 2430t%=GET
 2440SYS6,25,16
 2450PROCrestorescreen
 2460VDU28,0,23,39,0,31,x%,y%,23,18,3,0|
 2470=(t% AND 31)+128
 2480:
 2490DEFPROCstorescreen
 2500FOR p%=0 TO 999
 2510p%?scr%%=GET(p% MOD 40,p% DIV 40)
 2520NEXT
 2530ENDPROC
 2540:
 2550DEFPROCrestorescreen
 2560VDU30: FOR p%=0 TO 999: VDU (p%?scr%%) OR &80: NEXT
 2570ENDPROC
