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