10@%=0 20MODE 3 30INPUT LINE "Channel: " channel 40T%=OPENIN("RAW"+CHR$(channel+ASC("0"))) 50DIM buff 41 60ON ERROR GOTO 120 70PROCinitham 80REPEAT 90 PROCrd 100 PROCprocess 110UNTIL0 120ON ERROR OFF 130CLOSE#0 140REPORT:PRINT" at line ";ERL 150END 160DEFPROCrd 170frameno=(BGET#T%)+(BGET#T%)*256 180decrow=BGET#T% 190magno=BGET#T% 200rowno=BGET#T% 210FOR I%=0 TO 39 220 buff?I%=BGET#T% 230NEXT 240ENDPROC 250DEFPROCdisp 260 PROCmrag 270 FOR I%=0 TO 19 280 PROChex2(buff?I%) 290 VDU 32 300 NEXT 310 PRINT " Frame ";frameno; 320 PRINT '" "; 330 FOR I%=20 TO 39 340 PROChex2(buff?I%) 350 VDU 32 360 NEXT 370 PRINT " Slot ";decrow; 380ENDPROC 390DEFPROCmrag 400 PROChex2(magno) 410 VDU ASC(",") 420 PROChex2(rowno) 430 VDU ASC(":"),32 440ENDPROC 450DEFPROChex2(I%) 460L%=I% DIV 16:R%=I% MOD 16 470PROChex(L%):PROChex(R%) 480ENDPROC 490DEFPROChex(J%) 500IF J%>9 THEN J%=J%+7 510VDU J%+ASC("0") 520ENDPROC 530DEFPROCasc 540PRINT '" | "; 550FOR I%=0 TO 39 560 PROCsafe(buff?I%) 570NEXT 580PRINT " |" 590ENDPROC 600DEFPROCinitham 610DIM ham 255 620P%=ham 630[OPT 2 640 EQUD &4101FF41 \ 1 650 EQUD &FF4140FF 660 EQUD &FF4142FF 670 EQUD &47FFFF4A 680 EQUD &FF4140FF 690 EQUD &40FF0040 \ 0 700 EQUD &4BFFFF46 710 EQUD &FF4340FF 720 EQUD &FF414CFF 730 EQUD &47FFFF44 740 EQUD &47FFFF46 750 EQUD &074747FF \ 7 760 EQUD &45FFFF46 770 EQUD &FF4D40FF 780 EQUD &FF464606 \ 6 790 EQUD &47FFFF46 800 EQUD &FF4142FF 810 EQUD &49FFFF44 820 EQUD &42FF0242 \ 2 830 EQUD &FF4342FF 840 EQUD &45FFFF48 850 EQUD &FF4340FF 860 EQUD &FF4342FF 870 EQUD &4303FF43 \ 3 880 EQUD &45FFFF44 890 EQUD &FF444404 \ 4 900 EQUD &FF4F42FF 910 EQUD &47FFFF44 920 EQUD &054545FF \ 5 930 EQUD &45FFFF44 940 EQUD &45FFFF46 950 EQUD &FF434EFF 960 EQUD &FF414CFF 970 EQUD &49FFFF4A 980 EQUD &4BFFFF4A 990 EQUD &FF4A4A0A \ 10 1000 EQUD &4BFFFF48 1010 EQUD &FF4D40FF 1020 EQUD &0B4B4BFF \ 11 1030 EQUD &4BFFFF4A 1040 EQUD &4CFF0C4C \ 12 1050 EQUD &FF4D4CFF 1060 EQUD &FF4F4CFF 1070 EQUD &47FFFF4A 1080 EQUD &FF4D4CFF 1090 EQUD &4D0DFF4D \ 13 1100 EQUD &4BFFFF46 1110 EQUD &FF4D4EFF 1120 EQUD &49FFFF48 1130 EQUD &094949FF \ 9 1140 EQUD &FF4F42FF \ Possibly tables are wrong? 1150 EQUD &49FFFF4A 1160 EQUD &FF484808 \ 8 1170 EQUD &49FFFF48 1180 EQUD &4BFFFF48 1190 EQUD &FF434EFF 1200 EQUD &FF4F4CFF 1210 EQUD &49FFFF44 1220 EQUD &4F0FFF4F \ 15 1230 EQUD &FF4F4EFF 1240 EQUD &45FFFF48 1250 EQUD &FF4D4EFF 1260 EQUD &FF4F4EFF 1270 EQUD &4EFF0E4E \ 14 1280 EQUD &0B4B4BFF \ 11 1290] 1300ENDPROC 1310DEFFNham(WW%) 1320IF ham?WW% > 127 THEN PRINT'"*** Uncorrectable hamming code error: ";:PROChex2(WW%) 1330= ((ham?WW%) AND 15) 1340DEFPROCprocess 1350IF rowno=0 THEN PROCheader:ENDPROC 1360IF rowno=31 THEN PROCdatacast:ENDPROC 1370IF rowno=27 THEN PROClink:ENDPROC 1380IF rowno=30 THEN PROCtsdp:ENDPROC 1390PROCdisp:PROCasc 1400ENDPROC 1410 1420DEFPROCheader 1430PROCdisp 1440 FOR I%=0 TO 7 1450 buff?I%=FNham(buff?I%) 1460 NEXT 1470PRINT'"Header: Page "; 1480PROCpageno 1490PROCflags 1500PROClang 1510IF C4 THEN PRINT" Erase"; 1520IF C5 THEN PRINT" Newsflash"; 1530IF C6 THEN PRINT" Subtitle"; 1540IF C7 THEN PRINT" No_header"; 1550IF C8 THEN PRINT" Update"; 1560IF C9 THEN PRINT" Out_of_seq"; 1570IF C10 THEN PRINT" No_display"; 1580IF C11 THEN PRINT" Serial"; 1590IF Lang<>0 THEN PRINT" Language code ";Lang; 1600PRINT '" '"; 1610FOR I%=8 TO 39 1620 PROCsafe(buff?I%) 1630NEXT 1640PRINT "'" 1650ENDPROC 1660 1670DEFPROClink 1680PROCdisp 1690FOR I%=0 TO 36 1700 buff?I%=FNham(buff?I%) 1710NEXT 1720PRINT'"Links: Type "; 1730PRINT buff?0;" "; 1740PRINT"CRC "; 1750PROChex2(buff?38) 1760PROChex2(buff?39) 1770PRINT '" "; 1780FOR I%=1 TO 31 STEP 6 1790 PROCshowlink(I%) 1800 VDU 32 1810NEXT 1820PRINT 1830ENDPROC 1840 1850DEFPROCdatacast 1860PROCdisp 1870PRINT 1880PROChandle 1890PRINT 1900ENDPROC 1910 1920DEFPROCtsdp 1930PROCdisp 1940FOR I%=0 TO 6 1950 buff?I%=FNham(buff?I%) 1960NEXT 1970PROCasc 1980PRINT"TSDP: "; 1990PRINT"Type ";buff?0; 2000PRINT" Initial page "; 2010PROCshowlink(1) 2020PRINT" Channel code "; 2030PROChex2(buff?7) 2040PROChex2(buff?8) 2050BBCform=TRUE 2060PRINT'" MJD "; 2070IF (buff?10) DIV 16 <> 0 THEN PROCIBAfrig:BBCform=FALSE 2080PROChex2((buff?10)-&01) 2090PROChex2((buff?11)-&11) 2100PROChex2((buff?12)-&11) 2110PRINT" Time "; 2120PROChex2((buff?13)-&11) 2130PRINT":"; 2140PROChex2((buff?14)-&11) 2150PRINT":"; 2160PROChex2((buff?15)-&11) 2170PRINT " G.M.T. "; 2180C%=buff?9-&81 2190C%=C% DIV 2 2200IF C%=0 THEN GOTO 2260 2210PRINT" ("; 2220IF ((buff?9) AND &40) <> 0 THEN PRINT "-"; ELSE PRINT "+"; 2230PRINTC% DIV 2; 2240IF (C% AND 1) <> 0 THEN PRINT ".5"; 2250PRINT" for local time)"; 2260REM GOTO target... 2270IF BBCform THEN PRINT " (BBC format)"; ELSE PRINT " (IBA format)"; 2280PRINT'" Program "; 2290FOR I%=16 TO 19 2300 PROCsafe(buff?I%) 2310NEXT 2320PRINT" '"; 2330FOR I%=20 TO 39 2340 PROCsafe(buff?I%) 2350NEXT 2360PRINT"'" 2370ENDPROC 2380DEFPROCpageno 2390PRINT magno; 2400PRINT ~(buff?1) AND 15; 2410PRINT ~(buff?0) AND 15; 2420PRINT (buff?5) AND 3; 2430PRINT ~(buff?4) AND 15; 2440PRINT (buff?3) AND 7; 2450PRINT ~(buff?2) AND 15; 2460ENDPROC 2470DEFPROCflags 2480C4=((buff?3) AND 8) <> 0 2490C5=((buff?5) AND 4) <> 0 2500C6=((buff?5) AND 8) <> 0 2510C7=((buff?6) AND 1) <> 0 2520C8=((buff?6) AND 2) <> 0 2530C9=((buff?6) AND 4) <> 0 2540C10=((buff?6) AND 8) <> 0 2550C11=((buff?7) AND 1) <> 0 2560C12=((buff?7) AND 2) <> 0 2570C13=((buff?7) AND 4) <> 0 2580C14=((buff?7) AND 8) <> 0 2590ENDPROC 2600DEFPROClang 2610Lang=0 2620IF C12 THEN Lang=Lang+1 2630IF C13 THEN Lang=Lang+2 2640IF C14 THEN Lang=Lang+4 2650ENDPROC 2660DEFPROCsafe(D%) 2670LOCAL C% 2680 C%=32 2690 D%=D% AND 127 2700 IF (D%>32) AND (D%<127) THEN C%=D% 2710 VDU C% 2720ENDPROC 2730DEFPROCshowlink(I%) 2740C4=((buff?(I%+3)) AND 8) <> 0 2750C5=((buff?(I%+5)) AND 4) <> 0 2760C6=((buff?(I%+5)) AND 8) <> 0 2770linkmag=0 2780IF C4 THEN linkmag=linkmag+1 2790IF C5 THEN linkmag=linkmag+2 2800IF C6 THEN linkmag=linkmag+4 2810PRINT (magno EOR linkmag); 2820PRINT ~(buff?(I%+1)) AND 15; 2830PRINT ~(buff?I%) AND 15; 2840PRINT (buff?(I%+5)) AND 3; 2850PRINT ~(buff?(I%+4)) AND 15; 2860PRINT (buff?(I%+3)) AND 7; 2870PRINT ~(buff?(I%+2)) AND 15; 2880ENDPROC 2890DEFPROChandle 2900FT=FNham(buff?0) 2910AL=FNham(buff?1) 2920IF (FT AND 1) = 1 THEN PRINT"***ILLEGAL PACKET***"; 2930RIpresent=((FT DIV 2) AND 1) 2940CIpresent=((FT DIV 4) AND 1) 2950DLpresent=((FT DIV 8) AND 1) 2960RI=0:CI=0:DL=0 2970ptr=2 2980Addr=0 2990IF AL=0 THEN GOTO 3040 3000FOR I%=1 TO AL 3010 Addr=Addr*16+(FNham(buff?ptr)) 3020 ptr=ptr+1 3030NEXT 3040IF RIpresent=1 THEN RI=FNham(buff?ptr):ptr=ptr+1 3050IF CIpresent=1 THEN CI=buff?ptr:ptr=ptr+1 3060IF DLpresent=1 THEN DL=(buff?ptr) AND 31:ptr=ptr+1 3070IF DLpresent=1 THEN endaddr=ptr+DL-1 ELSE endaddr=37 3080PRINT "Datacast: Data channel ";magno;" Packet address ";Addr;" FT=";FT; 3090IF RIpresent=1 THEN PRINT " RI=";RI; 3100IF CIpresent=1 THEN PRINT " CI=";CI; 3110IF DLpresent=1 THEN PRINT " DL=";DL; 3120PRINT " CRC "; 3130PROChex2(buff?38) 3140PROChex2(buff?39) 3150PRINT 3160REM 3170IF ptr>39 OR endaddr>39 THEN PRINT"Argh!!!":END 3180IF DL=0 AND DLpresent=1THEN GOTO 3240 3190PRINT" / "; 3200FOR I%=ptr TO endaddr 3210 ZZ%=FNtext 3220NEXT 3230PRINT" /"; 3240ENDPROC 3250DEFFNtext 3260buff?I%=(buff?I%) AND 127 3270IF (buff?I%)=13 THEN PRINT"";:=0 3280IF (buff?I%)=10 THEN PRINT"";:=0 3290IF (buff?I%)=127 THEN PRINT"?";:=0 3300IF (buff?I%)<32 THEN PRINT".";:=0 3310IF (buff?I%)=32 THEN PRINT"_";:=0 3320VDU buff?I% 3330=0 3340DEFPROCdchex(I) 3350PRINT"<"; 3360IF I<15 THEN PRINT"0"; 3370PRINT~I; 3380PRINT">"; 3390ENDPROC 3400DEFPROCIBAfrig 3410buff?10=FNswp(buff?10)+&01 3420buff?11=FNswp(buff?11)+&11 3430buff?12=FNswp(buff?12)+&11 3440buff?13=FNswp(buff?13)+&11 3450buff?14=FNswp(buff?14)+&11 3460buff?15=FNswp(buff?15)+&11 3470ENDPROC 3480DEFFNswp(N%) 3490=((N% * 16) AND &F0) + (N% DIV 16)