10REM Teletext server version 1.1 20REM (C) A.R.B. Shimmin 30J$="1.1":ONERRORRUN 50*FX 200,1 60y0%=HIMEM-TOP-&1B00:n%=y0%/&500:*LOAD code 90MODE7:VDU28,0,24,39,2:DIMG&400:DIMk%&20:DIMb%(4):DIMc0%(4):DIMd%(4,20):DIMi%(4,20):DIMa%&50:DIMs%(20):DIMj%(20):DIMz%(20):DIMd0%(20):DIMo%(20):DIM_0%(4,20):DIM`0%(4,20):DIMq0%(20):DIMp%(4,20):DIM_%&30:e0%=&0FFFFFFF:READK:z0%=TRUE:a0%=0:FORI%=1TO4:READc0%(I%):p%(I%,1)=e0%:NEXT:VDU23,1,0;0;0;0; 370DIMf0%&500*(n%+1):PROC8:?_%=5:_%?1=255:X%=_%:Y%=X%DIV256:A%=&13:CALLH:t%=0:*TTXON 450*HON 460*CH1 470TIME=0:PROC4:PROC9(30):CALLI:B%=FN1(&B2,0,a%,&50):`%=1:REPEAT:`%=FN2:PROCA:REPEAT:PROCB:PROCC:IFTIME>q0%(j%(1))+c0%(`%)PROCD 600UNTIL(FN2<>`%)OR((TIME-g0%>60*60*100)ANDt%=0):IFTIME-g0%>60*60*100PROC4 620UNTILFALSE:END 650DEFPROCA:PROCE("CH"+STR$(`%)):PROCF:FORI%=0TO20:o%(I%)=0:z%(I%)=0:d0%(I%)=0:NEXT:IFb%(`%)>0PROCG 740ENDPROC 760DEFFN3(_1%):h0%=FALSE:f%=-1:REPEAT:f%=f%+1:IFz%(f%)=_1%h0%=TRUE:`1%=f% 820UNTILh0%=TRUEORf%=n%:IFh0%=TRUETHEN=`1% 840f%=-1:REPEAT:f%=f%+1:UNTILd0%(f%)=0ORf%=n%:IFf%0PROCI 1450ENDPROC 1470DEFPROCI:R%=0:REPEAT:R%=R%+1:a1%=FN5(j%(R%)):IF(a1%AND2)=2PROCJ 1530UNTILR%>=b%(`%):ENDPROC 1560DEFPROCJ:IF((TIME-`0%(`%,R%))/c0%(`%)b1%+50:PROCK(j%(R%),s%(R%),i%(`%,R%)):PRINTFN6(d%(`%,R%));TAB(8)" receiving page ";i%(`%,R%);" on ";`%;:G?&3FE=?(s%(R%)+3):G?&3FF=?(s%(R%)+4):PROC@(&B3,&80,d%(`%,R%),G,&400):PRINT:VDU23,1,0;0;0;0;:PROC3(R%,`%):R%=R%-1:*HON 1710IFz0%=TRUECALLI 1720ENDPROC 1740DEFPROC8:H=&FFF1:J=&FFF4:R=&FFEE:S=&993:L=&9B3:I=&978:ENDPROC 1830DEFPROC0(c1%):?_%=c1%:X%=_%:Y%=X%DIV256:A%=&7A:CALLH:ENDPROC 1890DEFPROCF:PROC0(14):ENDPROC 1930DEFPROC9(h%):_%?1=h%:PROC0(7):ENDPROC 1980DEFFN5(g%):_%?1=g%:PROC0(2):=_%?2 2030DEFPROCH(g%,h%,q%):IFh%=n%ENDPROC 2050IFz%(h%)=g%ENDPROC 2060PROC0(16):_%?1=h%:_%?2=g%DIV100:d1%=g%MOD10:e1%=(g%MOD100)DIV10:_%?3=&10*e1%+d1%:_%?4=g%MOD10:_%?4=&3F:_%?5=&7F:_%!6=q%:PROC0(5):PROCL(h%,0):z%(h%)=g%:d0%(h%)=1:ENDPROC 2220DEFPROCL(g%,f1%):_%?1=g%:_%?2=f1%:PROC0(3):ENDPROC 2280DEFPROCK(h%,u0%,g%):!&70=u0%:!&76=G:!&78=G+40:CALLL:H$=FN9(u0%):M=LEN(H$):$(G+24*40)=STRING$(39-M," ")+H$:ENDPROC 2380DEFPROC3(k0%,e%):LOCALI%:IFb%(e%)=0ENDPROC 2410IF`%=e%o%(j%(k0%))=o%(j%(k0%))-1 2420FORI%=k0%TOb%(e%)-1:i%(e%,I%)=i%(e%,I%+1):d%(e%,I%)=d%(e%,I%+1):IFe%=`%s%(I%)=s%(I%+1) 2460IFe%=`%j%(I%)=j%(I%+1) 2470p%(e%,I%)=p%(e%,I%+1):_0%(e%,I%)=_0%(e%,I%+1):`0%(e%,I%)=`0%(e%,I%+1):NEXT:t%=t%-1:b%(e%)=b%(e%)-1:IFb%(e%)=0p%(e%,1)=e0% 2540ENDPROC 2560DEFPROCM(N):T%=TIME:REPEATUNTILTIME>T%+N:ENDPROC 2610DEFFN9(q%):_%?1=q%MOD256:_%?2=q%DIV256:PROC0(23):IF_%?3=0THEN="No check" 2660IF_%?3=1THEN="" 2670IF_%?3=&FFTHEN="Bad data" 2680="Bad check" 2700DEFPROCE(K$):$_%=K$:X%=_%:Y%=X%DIV256:CALL&FFF7:ENDPROC 2750DEFPROC@(g%,g1%,l0%,x%,q%):m0%=0:REPEAT:m0%=m0%+1:?_%=g1%:_%?1=g%:_%!2=l0%:_%!4=x%:_%!8=x%+q%:X%=_%:Y%=X%DIV256:A%=&10:CALLH:UNTILm0%>5ORFN7=0:IFFN7<>0PRINT'"Not listening"; 2880ENDPROC 2900DEFFN7:REPEAT:A%=&32:h%=(USR(J)AND&FF00)DIV&100:UNTILh%<128:=h% 2970DEFFN1(g%,l0%,x%,q%):?_%=0:_%?1=&7F:_%?2=g%:_%!3=l0%:_%!5=x%:_%!9=x%+q%:X%=_%:Y%=X%DIV256:A%=&11:CALLH:=?_% 3080DEFFNA(h%):A%=&33:X%=h%:=USR(J)AND&8000 3120DEFPROCN(h%):?_%=h%:X%=_%:Y%=X%DIV256:A%=&11:CALLH:ENDPROC 3180DEFPROCB:IFFNA(B%)>0PROCO 3200ENDPROC 3220DEFPROCO:PROCN(B%):d%=_%!3AND&FFFF:l%=_%?1:!k%=!a%:PRINTFN6(d%);TAB(8);"CODE :";~l%;" ";:IFl%=&81PROC7(FALSE,&81) 3290IFl%=&80PROCQ 3300IFl%=&82PROCR 3310IFl%=&83PROCS 3320IFl%=&84PROCT 3330IFl%=&85PROCU 3340IFl%=&86PROC7(TRUE,&86) 3350IFl%=&87PROCV 3360B%=FN1(&B2,0,a%,&50):PRINT:ENDPROC 3400DEFFN6(v0%):L$=FN@(3,v0%DIV256)+".":=L$+FN@(3,v0%MOD256) 3440DEFFN@(h1%,i1%):I$=STR$(i1%):=STRING$(h1%-LEN(I$),"0")+I$ 3490DEFPROCS:PRINT"Max users";:?a%=0:a%?1=n%:PROC@(&B0,&83,d%,a%,2):ENDPROC 3560DEFPROCV:b0%=?k%:PRINT"Request port ";b0%;:IFb0%<0ORb0%>3PROC2(&87,5,"Bad port"):ENDPROC 3600?a%=0:a%!1=ADVAL(b0%):PROC@(&B0,&87,d%,a%,3):ENDPROC 3650DEFPROCW:v%=FN4(b%(`%)-1,i%(`%,b%(`%))):IFv%=-1PROC5(b%(c%))ELSEPROC6(b%(c%),v%) 3680ENDPROC 3700DEFPROCQ:PRINT"Version number";:?a%=0:$(a%+1)=J$:PROC@(&B0,&80,d%,a%,&20):ENDPROC 3770DEFPROCX:n0%=TIME-g0%:M$=FN@(2,(j1%+((n0%+100*o0%+6000*w0%)DIV360000))MOD24):N$=FN@(2,(w0%+((n0%+100*o0%)DIV6000))MOD60):O$=FN@(2,(o0%+(n0%DIV100))MOD60):Q$=M$+":"+N$+":"+O$+R$:?a%=0:$(a%+1)=Q$:PROC@(&B0,&84,d%,a%,22):ENDPROC 3880DEFPROC4:*CH1 3900IFt%=0TIME=0 3910x0%=FALSE:PROCM(150):PROC0(15):PROC0(21):g0%=TIME:IF_%?10=&FFx0%=TRUE:ENDPROC 3970_%?3=13:_%?6=13:_%?9=13:j1%=VAL($(_%+1)):w0%=VAL($(_%+4)):o0%=VAL($(_%+7)):PROC0(22):_%?11=13:R$=$(_%+1):ENDPROC 4060DEFPROCY:?a%=4:$(a%+1)="Time unavailable":PROC@(&B0,&84,d%,a%,22):ENDPROC 4120DEFPROCT:PRINT"Request time";:IFx0%=TRUEPROCYELSEPROCX 4150ENDPROC 4170DEFFN8:PROC0(0):=(_%?1)+1 4210DEFFN0(p0%):IFp0%<32p0%=255 4230=p0% 4250DEFPROC7(k1%,y%):G$=CHR$(FN0(k%?1))+CHR$(FN0(k%?2))+CHR$(FN0(k%?3)):i%=VAL(G$):c%=?k%-48:PRINT"Request page ";G$;" on ";c%;:G$=CHR$(k%?1)+CHR$(k%?2)+CHR$(k%?3):IFc%<1ORc%>4PROC2(y%,2,"Bad channel"):PROC1(TRUE,0):ENDPROC 4320IFi%<100PROC2(y%,1,"Bad page number"):PROC1(TRUE,0):ENDPROC 4330b%(c%)=b%(c%)+1:t%=t%+1:a0%=a0%+1:d%(c%,b%(c%))=d%:i%(c%,b%(c%))=i%:p%(c%,b%(c%))=a0%:`0%(c%,b%(c%))=TIME:_0%(c%,b%(c%))=k1%:l1%=a0%:PROC1(FALSE,l1%):IF`%=c%PROCW 4440IF(`%=c%)AND(FN3(i%)>n%)PROC2(y%,3,"Channel busy"):PROC1(TRUE,0):ENDPROC 4450IF(`%<>c%)AND(b%(c%)>n%)PROC2(y%,3,"Channel busy"):PROC1(TRUE,0):ENDPROC 4460?a%=0:a%?1=t%:PROC@(&B0,y%,d%(c%,b%(c%)),a%,&20):ENDPROC 4510DEFPROCR:PRINT"Cancel pages";:PROC@(&B0,&82,d%,a%,1):PROC1(TRUE,0):ENDPROC 4570DEFPROCU:PRINT"Logoff";:PROC@(&B0,&85,d%,a%,1):PROC1(TRUE,0):ENDPROC 4630DEFPROC1(O,M%):r%=0:REPEAT:r%=r%+1:m%=0:REPEAT:m%=m%+1:IFFNB(O,M%)PROC3(m%,r%):m%=m%-1 4710UNTILm%>=b%(r%):UNTILr%=4:ENDPROC 4750DEFFNB(Q,o1%):IFQAND(d%(r%,m%)=d%)THEN=TRUE 4770IF(d%(r%,m%)=d%)AND(p%(r%,m%)<>M%)THEN=TRUE 4780=FALSE 4800DEFPROC2(m1%,n1%,S$):?a%=n1%:$(a%+1)=S$:PRINT'"ERROR : ";$(a%+1);:PROC@(&B0,m1%,d%,a%,&20):ENDPROC:*FX 13,5 4880*HOFF 4890*TTXOFF 4900REPORT:PRINT" at line ";ERL:END 4920DATA 0.5 4930DATA 4000,4000,4000,4000