   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 20220605"
   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
  130:
  140SYS"OS_Byte",229,1: SYS "OS_Byte",4,1
  150OSCLI"Key1|_":OSCLI"KEY2"+CHR$(130)
  160ON ERROR GOTO 560
  170MODE 7:OFF: VDU23,16,1|23,18,1|
  180reveal%=0:scan%=0:width%=1:black%=0:ost%=0
  190borked%=0:telnet%=1:extended%=0:cur%=0
  200allowfs%=1:DIM scr%% 1000
  210REM Variables for downloading
  220screen%=0
  230download%=0
  240X%=OPENUP(FNwelcome):VDU28,0,23,39,0,31
  250S$=MID$(S$,1+INSTR(S$,":"))
  260PROCstatusbar(CHR$132+"* "+S$)
  270IF sdl% THEN OSCLI"WinTitle Matrix Network Viewdata/Teletext Client: Connected"
  280REM Send Telnet init data if required
  290IF telnet%=1 THEN BPUT#X%,&FF,&FD,&03 ELSE VDU23,18,1,2|:BPUT#X%,13
  300REPEAT
  310M%=BGET#X%: IF M%=-2 THEN GOTO 550
  320IF M% = -1 AND TIME > ost%+5 THEN PROCstatusxfer(0)
  330IF M% = -1 THEN PROCdhscan
  340IF M% >= 0 THEN PROCvdu(M%):PROCstatusxfer(1): GOTO550
  350SYS "OS_Byte",21,0:I%=INKEY(20):IF I%=-1 THEN scan%=1: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 310
  420IF I%=18 THEN PROCreveal: GOTO 310
  430IF I%=2 THEN PROCtoggleblack: GOTO 310
  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:GOTO310
  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: 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:cur%=1
  710WHEN 20: OFF:cur%=0
  720ENDCASE
  730IF VPOS=24 THEN VDU31,POS,0
  740ENDPROC
  750:
  760DEFPROCcheckdh
  770IFN%=141THENscan%=1
  780ENDPROC
  790:
  800DEFPROCactvdu
  810VDU (M% OR 128):IF VPOS=24 OR (VPOS=23 AND POS=40) THEN VDU30
  820ENDPROC
  830:
  840DEFPROCdhscan
  850OFF:IFscan%=0ENDPROC
  860FOR N%=0 TO 22: FOR P%=0 TO 39
  870IF GET(P%,N%) = 141 THEN PROCcopyline: N%+=1
  880NEXT P%, N%
  890scan%=0:IF cur%=1 THEN ON
  900ENDPROC
  910:
  920DEFPROCcopyline
  930IF N% > 22 THEN ENDPROC
  940x%=POS:y%=VPOS
  950VDU31,0,N%+1
  960FOR P%=0 TO 39: VDU GET(P%,N%): NEXT
  970VDU31,x%,y%
  980ENDPROC
  990:
 1000DEFPROCreveal
 1010reveal% EOR=1
 1020VDU23,18,2,reveal%|
 1030ENDPROC
 1040:
 1050DEFPROCtoggleblack
 1060black% EOR=1
 1070VDU23,18,3,black%|
 1080ENDPROC
 1090:
 1100DEFPROCtogglescreen
 1110IF allowfs%=0THENENDPROC
 1120OSCLI"Fullscreen"
 1130SYS"OS_Byte",42 TO ,fs%
 1140IF fs% AND 8 THEN MOUSE OFF ELSE MOUSE ON
 1150ENDPROC
 1160:
 1170DEFPROCstatusbar(status$)
 1180IFsdl%=0 THEN ENDPROC
 1190$&7FC0=STRING$(40," ")
 1200status$=CHR$157+LEFT$(status$, 37)
 1210$&7FC0=status$: ?(&7FC0+LENstatus$)=32
 1220ENDPROC
 1230:
 1240DEFPROCstatusxfer(st%)
 1250IFsdl%=0 THEN ENDPROC
 1260CASE st% OF
 1270WHEN 1:?&7FC2=ASC"["
 1280WHEN 2:?&7FC2=ASC"]"
 1290OTHERWISE: ?&7FC2=32
 1300ENDCASE
 1310ost%=TIME
 1320ENDPROC
 1330:
 1340DEFFNcustom
 1350CLS
 1360PRINT "  ";CHR$(132);CHR$(157);CHR$(135);CHR$(141);"Matrix Network Viewdata Client ";CHR$(156)
 1370PRINT "  ";CHR$(132);CHR$(157);CHR$(135);CHR$(141);"Matrix Network Viewdata Client ";CHR$(156)
 1380PRINT:PRINT CHR$(130);"Please enter the Viewdata server"
 1390PRINT CHR$(130);"in the form";CHR$(134);"server:port";CHR$(130);"or";CHR$(134)"ipaddr:port"
 1400PRINT CHR$(130);"or press";CHR$(134);"Enter";CHR$(130);"to return":PRINT
 1410ON:PRINT CHR$(131);:INPUT">"server$:OFF
 1420="ip0:"+server$
 1430
 1440DEFFNwelcome
 1450PROCwelcomescreen
 1460borked%=0: REPEAT A%=GET: UNTIL (A% >= 48 AND A% <= 57) OR A%=6 OR A%=24 OR A%=84 OR A%=116
 1470IF A% = 24 OR A% = 48 THEN PRINT:ON:OSCLI"FX229":END
 1480IF A% = 6 THEN PROCtogglescreen: GOTO 1460
 1490IF A% = 49 THEN borked%=1: S$ = "ip0:glasstty.com:6502"
 1500IF A% = 50 THEN borked%=1: S$ = "ip0:glasstty.com:6503"
 1510IF A% = 51 THEN borked%=1: S$ = "ip0:glasstty.com:6504"
 1520IF A% = 52 THEN S$ = "ip0:fish.ccl4.org:23"
 1530IF A% = 53 THEN S$ = "ip0:nx.nxtel.org:23280"
 1540IF A% = 54 THEN S$ = "ip0:teletext.matrixnetwork.co.uk:6502"
 1550IF A% = 55 THEN S$ = "ip0:teletext.matrixnetwork.co.uk:48065"
 1560IF A% = 56 THEN GOTO 1460
 1570IF A% = 57 THEN S$ = FNcustom: IF S$="ip0:" THEN GOTO 1450
 1580IF A% = 84 OR A% = 116 THEN telnet%=telnet% EOR 1: GOTO 1450
 1590CLS
 1600=S$
 1610:
 1620DEFPROCwelcomescreen:CLS:VDU26
 1630IF sdl% THEN *WinTitle Matrix Network Viewdata/Teletext Client
 1640PRINT "  ";CHR$(132);CHR$(157);CHR$(135);CHR$(141);"Matrix Network Viewdata Client ";CHR$(156)
 1650PRINT "  ";CHR$(132);CHR$(157);CHR$(135);CHR$(141);"Matrix Network Viewdata Client ";CHR$(156)
 1660PRINT
 1670PRINT CHR$(131);"1 - Telstar";CHR$(133);"(CURRER)"
 1680PRINT CHR$(131);"2 - Telstar";CHR$(133);"(ELLIS)"
 1690PRINT CHR$(131);"3 - Telstar";CHR$(133);"(ACTON)"
 1700PRINT CHR$(131);"4 - Tetrachloromethane";CHR$(133);"(CCl4)"
 1710PRINT CHR$(131);"5 - NXtel"
 1720PRINT CHR$(131);"6 - TEEFAX";CHR$(133);"and Matrix Teletext"
 1730PRINT CHR$(131);"7 - CEEFAX";CHR$(133);"(NMS - teletext)"
 1740PRINT
 1750PRINT CHR$(131);"9 -";CHR$(130);"Custom address"
 1760PRINT CHR$(129);"0 - Exit"
 1770
 1780PRINT CHR$(131);"T - Toggle Telnet codes -";
 1790IF telnet%=1 THEN PRINT CHR$(130);"ON" ELSE PRINT CHR$(129);"OFF"
 1800PRINT TAB(0,15)CHR$(134);"While the session is running:"
 1810IF allowfs%=1 THEN PRINT CHR$(134);" Press CTRL-F to toggle Full Screen":
 1820PRINT CHR$(134);" Press CTRL-R to toggle Reveal"
 1830PRINT CHR$(134);" Press CTRL-B to toggle Black"
 1840PRINT CHR$(134);" Press CTRL-X to exit immediately"
 1850PRINT CHR$(134);" Press CTRL-D to disconnect":PRINT
 1860PRINT CHR$(130);" F1 or CTRL-/ for help & other keys"
 1870PRINT TAB(4,23)CHR$(129);"Please make your selection..."
 1880PRINT CHR$(132);CHR$(157);CHR$(135);VER$;
 1890ENDPROC
 1900:
 1910DEFPROChelp
 1920x%=POS:y%=VPOS:VDU26:PROCstorescreen:CLS
 1930PRINT "  ";CHR$(132);CHR$(157);CHR$(135);CHR$(141);"Matrix Network Viewdata Client ";CHR$(156)
 1940PRINT "  ";CHR$(132);CHR$(157);CHR$(135);CHR$(141);"Matrix Network Viewdata Client ";CHR$(156)
 1950PRINT
 1960PRINT CHR$(134);"Special keys available:":PRINT
 1970IF allowfs%=1 THEN PRINT CHR$(134);" Press";CHR$(131);"CTRL-F";CHR$(134);"to toggle Full Screen":
 1980PRINT CHR$(134);" Press";CHR$(131);"CTRL-R";CHR$(134);"to toggle Reveal":
 1990PRINT CHR$(134);" Press";CHR$(131);"CTRL-B";CHR$(134);"to toggle Black";CHR$(133);"*"
 2000PRINT CHR$(134);" Press";CHR$(131);"CTRL-X";CHR$(134);"to exit immediately"
 2010PRINT CHR$(134);" Press";CHR$(131);"CTRL-D";CHR$(134);"to disconnect": PRINT
 2020PRINT
 2030PRINT CHR$(131);" CTRL-[";CHR$(134);"Select previous frame";CHR$(129);"(*#)"
 2040PRINT CHR$(131);" CTRL-^";CHR$(134);"Select main index frame";CHR$(129);"(*0#)"
 2050PRINT CHR$(131);" PgUp";CHR$(134);" redraw current frame";CHR$(129);"(*00)"
 2060PRINT CHR$(131);" PgDn";CHR$(134);" Request updated frame";CHR$(129);"(*09)"
 2070PRINT CHR$(131);" CTRL-END";CHR$(134);"Request disconnect";CHR$(129);"(*90#)"
 2080PRINT
 2090PRINT CHR$(130);" F2: Send teletext control code":PRINT
 2100PRINT CHR$(133);"*";CHR$(134);"This also switches the Hold Character"
 2110PRINT CHR$(134);"behaviour between that of the";CHR$(131);"SAA5050";CHR$(134);"/"
 2120PRINT CHR$(131);"BBC Micro";CHR$(134);"and later Teletext/Videotex"
 2130PRINT CHR$(134);"specifications."
 2140IFGET
 2150PROCrestorescreen
 2160VDU28,0,23,39,0,31,x%,y%
 2170ENDPROC
 2180:
 2190DEFFNcontrolcode
 2200x%=POS:y%=VPOS:VDU26:PROCstorescreen:CLS
 2210VDU23,18,3,1|
 2220PRINT "  ";CHR$(132);CHR$(157);CHR$(135);CHR$(141);"Matrix Network Viewdata Client ";CHR$(156)
 2230PRINT "  ";CHR$(132);CHR$(157);CHR$(135);CHR$(141);"Matrix Network Viewdata Client ";CHR$(156)
 2240PRINT
 2250PRINT CHR$(141);CHR$(134);SPC(10);"Control codes:"
 2260PRINT CHR$(141);CHR$(134);SPC(10);"Control codes:"
 2270PRINT " @:(text black)     P:(graphics black)"
 2280PRINT CHR$(129);"A: text red        Q: graphics red"
 2290PRINT CHR$(130);"B: text green      R: graphics green"
 2300PRINT CHR$(131);"C: text yellow     S: graphics yellow"
 2310PRINT CHR$(132);"D: text blue       T: graphics blue"
 2320PRINT CHR$(133);"E: text magenta    U: graphics magenta"
 2330PRINT CHR$(134);"F: text cyan       V: graphics cyan"
 2340PRINT CHR$(135);"G: text white      W: graphics white"
 2350PRINT CHR$(136);"H: Flash On";CHR$(137);"       X: Conceal"
 2360PRINT CHR$(137);"I: Flash Off       Y: Contiguous gfx"
 2370PRINT " J: &8A (End Box)   Z: Separated gfx"
 2380PRINT " K: &8B (Start Box)";CHR$&9B;"[: &9B (Esc/Switch)"
 2390PRINT " L: Dbl Height Off ";CHR$&9B;"|: Black background"
 2400PRINT " M: Dbl Height On  ";CHR$&9B;"]: Set bg colour"
 2410PRINT " N: &8E (dbl width)";CHR$&9B;"^: Hold graphics"
 2420PRINT " O: &8F (dbl size) ";CHR$&9B;"#: Release graphics"
 2430PRINT
 2440PRINT CHR$(134);"Note: Codes &8A, &8B, &8E, &8F and &9B"
 2450PRINT CHR$(134);"have no effect in this client."
 2460t%=GET
 2470SYS6,25,16
 2480PROCrestorescreen
 2490VDU28,0,23,39,0,31,x%,y%,23,18,3,0|
 2500=(t% AND 31)+128
 2510:
 2520DEFPROCstorescreen
 2530FOR p%=0 TO 999
 2540p%?scr%%=GET(p% MOD 40,p% DIV 40)
 2550NEXT
 2560ENDPROC
 2570:
 2580DEFPROCrestorescreen
 2590VDU30: FOR p%=0 TO 999: VDU (p%?scr%%) OR &80: NEXT
 2600ENDPROC
