1 REM SAVE MORSE\VN 2 REM LIST MORSE\VN 10 REM * 20 REM  CW-TRANSMITTING PROGRAM  40 REM  Intended for CW-training courses  50 REM  Expanded textbuffer and diskfile 82-03-13  60 REM  Concat readfiles. Crypto generator 82-04-11  65 REM  Continued text registration 82-05-23  66 REM  Increased spaces below 12 WPM 82-05-25  68 REM  Adjusted speed-indicator 82-11-05  70 REM  VERSION 5, 1982-11-05. C Rune Sagnell SM5GQ  71 REM  KOPIA 1985-04-21 f|r anv{ndning vid SK0TM telegrafiutbildning  75 REM  Ins{nt av Kent Berggren, SM0LRU, 1985-10-29  78 REM * 79 REM 80 REM _INLEDNING 90 OUT 58%,0% : OUT 6%,0% : REM Ton, rel{ o V24 fr}n 100 K%=150% : REM Defaulthastighet 100-takt 110 ; INP(3%) : REM 40 teckens sk{rm 112 DEFFNM%=PEEK(65064%)*256%+PEEK(65063%)-PEEK(65057%)*256%-PEEK(65056%) 115 DEFFNR%=S%/40% 117 DEFFNK%=40%*(S%/40-S%/40%) 120 GOSUB 270 : GOTO 140 : REM Initiering 125 FOR J%=0% TO X9% : C%(J%)=32% : NEXT J% : X9%=1% : RETURN 130 REM 140 REM _HUVUDMENY 150 CLOSE 5% 160 ; CHR$(12%)CUR(23%,24%)'CTRL< ger MENY'CUR(0%,30%)'SM5GQ/-82'TAB(70%)'VERSION 5'TAB(46%); 170 ; 'M O R S E \ V N I N G'TAB(46%)STRING$(21%,61%) 180 ; TAB(43%)'0 INSTRUKTIONER' 190 ; TAB(43%)'1 REGISTRERING av NY s{ndningstext' 195 ; TAB(43%)'2 FORTSATT REGISTRERING av ny text' 200 ; TAB(43%)'3 INSPELNING av text p} skiva' 210 ; TAB(43%)'4 AVSPELNING av text fr}n skiva' 220 ; TAB(43%)'5 S[NDNING av text fr}n 1 el 4' 230 ; TAB(43%)'6 REPETERING av tidigare s{nd text' 235 ; TAB(43%)'7 REDIGERING av s{ndningstext' 240 ; TAB(43%); : GET E$ 250 ON INSTR(1%,'01234567',E$)+1% GOTO 160,2140,350,3100,1460,1630,1870,1930,2400 260 REM 270 REM _ST[LLNING AV VARIABLER 280 C1%=200% : C2%=200% : C3%=200% 290 DIM C%(5000%),A$=60%,A1$=2%,D$=120%,H$(5%)=60%,L$(5%)=120%,B$=120%,J$=2%,O$(120%)=8%,S$=285% 295 GOSUB 1050 : REM Morsetecken 300 F%=1% : I%=-1% : M%=0% : O%=0% : T=0 : X2%=0% : Y2%=11% : X3%=0% : Y3%=17% 310 N%=-1% : U%=-1% : V%=0% : X%=-1% : Y%=0% : X2%=0% 330 RETURN 340 REM 350 REM _INSKRIVNING AV TEXT 360 GOSUB 125 : GOSUB 270 : GOSUB 650 370 ; CHR$(12%) 380 H$='PARIS PARIS PARIS PARIS PARIS PARIS PARIS PARIS PARIS PARIS##' 390 ; CUR(23%,0%)'%=PARIS #=KRY &=_._._ ^K=_.__. ^V=._...'; 400 REM 410 REM 420 ; CUR(Y%,X%+1%); : GET B$ : B%=ASC(B$) : REM Reg ny text 430 IF B%=127% 140 440 IF INP(56%)=137% OUT 6%,3% : OUT 58%,40% : GOTO 440 ELSE IF INP(56%)=9% OUT 6%,56% : OUT 58%,0% : GOTO 420 450 IF B%=30% X9%=I% : GOSUB 710 : GOTO 420 : REM Provs{ndning morse 460 IF B%=13% X9%=I% : GOTO 140 : REM Avslutn inskrivn, till meny 465 IF B%=35% GOSUB 3000 : GOTO 420 : REM Generering av kryptotext 470 GOSUB 490 : GOTO 420 480 REM 490 REM _KONTROLL AV TECKEN 500 IF B%=37% GOSUB 1390 : RETURN 510 IF B%=60% THEN K%=K%*1.1 : GOTO 660 520 IF B%=62% THEN K%=K%*.98 : GOTO 660 530 IF B%=8% THEN I%=I%-1% : T=T-1% : X%=X%-1% ELSE 570 540 IF X%<-1% THEN Y%=Y%-1% : X%=38% : IF Y%<0% THEN Y%=0% : X%=-1% : I%=0% : RETURN ELSE RETURN ELSE RETURN 550 IF Y%<0% THEN Y%=0% : X%=-1% : I%=0% : RETURN 560 REM 570 REM _UTSKRIFT P] SK[RMEN 580 I%=I%+1% 582 IF I%>4850% ; CHR$(7%); 585 IF I%>4999% I%=4999% : X%=X%-1% : RETURN 590 X%=X%+1% : T=T+1 : GOSUB 695 600 IF B%>95% B%=B%-32% 605 IF B%=22% B%=118% ELSE IF B%=11% B%=107% 610 C%(I%)=B% 620 ; CUR(Y%,X%)CHR$(C%(I%)); 625 IF X%=39% THEN Y%=Y%+1% : X%=-1% 627 IF Y%=22% ; SPACE$(84%); : Y%=21% 630 RETURN 640 REM 650 REM _TAKTINDIKERING 660 IF K%<30% THEN K%=30% ELSE IF K%>640% THEN K%=640% 665 IF K%>256 K1%=300% : K2%=5%*(K%-200%) ELSE K1%=1.6*K% : K2%=-.15*K1% 670 K9%=INT((16000%/(K%+10%))+.5) 680 ; CUR(23,29)K9%'-takt '; 690 GOTO 630 695 ; CUR(23%,0%)'%&kv'I%+1%' tkn:'; 696 ; INT(T/(1.2*K9%))' min'INT(60%*((T/(1.2*K9%))-INT(T/(1.2*K9%))))' sek'TAB(29%)'i'K9%'-takt'; 697 RETURN 700 REM 710 REM _S[NDNINGSRUTIN 715 GOSUB 695 720 REM - Ut fr}n text-fifo 730 IF N%>=I% B%=35% : GOSUB 570 : RETURN 740 N%=N%+1% 750 U%=U%+1% 760 IF U%=40% THEN V%=V%+1% : U%=0% 770 S%=C%(N%) : ; CUR(V%,U%)''; 780 GOSUB 810 790 GOTO 730 800 REM 810 REM _OMVANDLING TILL MORSEKOD 820 O1$=O$(C%(N%)) 830 IF INP(56%)=160% THEN 830 : REM Paus med mell 840 IF INP(56%)>186% POKE 65013%,0% : B%=INP(56%)-128% : GOSUB 510 : REM Takt{ndr 850 IF INP(56%)=127% 140 860 REM 870 REM _TIMING O TILL/FR]N 880 FOR I6%=1% TO LEN(O1$) 890 O2$=MID$(O1$,I6%,1%) 900 IF O2$=' ' THEN L%=1% : GOTO 950 910 IF O2$='.' THEN L%=1% 920 IF O2$='_' THEN L%=3% 930 OUT 58%,40% : REM Rel{ o V24 till 940 OUT 6%,3% : REM Ton till 950 FOR J3%=1% TO K1%*L% : NEXT J3% 970 OUT 58%,0% : REM Rel{ o V24 fr}n 980 OUT 6%,57 : REM Ton fr}n 990 FOR J3%=1% TO K1% : NEXT J3% 1000 NEXT I6% 1010 FOR J3%=1% TO (K1%+K2%)*3% : NEXT J3% 1020 ; CUR(V%,U%)CHR$(S%); 1030 RETURN 1040 REM 1050 REM = MORSE CODE = 1060 O$(32%)=' ' : O$(33%)='..__.' 1070 O$(34%)='._.._.' : O$(36%)='..._._' 1075 O$(38%)='_._._' 1080 O$(39%)='.____.' : O$(40%)='_.__._' 1090 O$(41%)='_.__._' : O$(42%)='.. ..' 1100 O$(43%)='._._.' : O$(44%)='__..__' 1110 O$(45%)='_...._' : O$(47%)='_.._.' 1120 O$(48%)='_____' : O$(49%)='.____' 1130 O$(50%)='..___' : O$(51%)='...__' 1140 O$(52%)='...._' : O$(53%)='.....' 1150 O$(54%)='_....' : O$(55%)='__...' 1160 O$(56%)='___..' : O$(57%)='____.' 1170 O$(58%)='___...' : O$(59%)='._.._' 1180 O$(61%)='_..._' : O$(63%)='..__..' 1190 O$(65%)='._' : O$(66%)='_...' 1200 O$(67%)='_._.' : O$(68%)='_..' 1210 O$(69%)='.' : O$(70%)='.._.' 1220 O$(71%)='__.' : O$(72%)='....' 1230 O$(73%)='..' : O$(74%)='.___' 1240 O$(75%)='_._' : O$(76%)='._..' 1250 O$(77%)='__' : O$(78%)='_.' 1260 O$(79%)='___' : O$(80%)='.__.' 1270 O$(81%)='__._' : O$(82%)='._.' 1280 O$(83%)='...' : O$(84%)='_' 1290 O$(85%)='.._' : O$(86%)='..._' 1300 O$(87%)='.__' : O$(88%)='_.._' 1310 O$(89%)='_.__' : O$(90%)='__..' 1320 O$(91%)='._._' : O$(92%)='___.' 1330 O$(93%)='.__._' : O$(95%)='._.._' 1340 O$(99%)='____' : O$(46%)='._._._' 1350 O$(107%)='_.__.' : O$(118%)='._...' 1360 O$(64%)='.._..' : O$(94%)='__..' 1365 O$(37%)='........' 1370 RETURN 1380 REM 1390 REM _UPPDELNING AV STR[NG H$ 1400 FOR J%=1% TO LEN(H$) 1410 B%=ASC(MID$(H$,J%,1%)) 1420 GOSUB 570 1430 NEXT J% : RETURN 1440 REM 1450 REM 1460 REM _SKRIVN AV TEXT P] SKIVFIL 1470 ; CHR$(12%) : ONERRORGOTO 1615 1480 ; SPACE$(3%)I%+1%' tkn:'INT(T/K9%)' min'INT(60*((T/K9%)-INT(T/K9%)))' sek'TAB(28%)'i'K9%'-takt'; 1490 ; TAB(80%)'FILNAMN f|r skrivning '; : INPUT F$ 1500 IF F$='' 140 1510 IF INSTR(1%,F$,'.')=0% F$=F$+'.'+NUM$(K9%) ELSE K9%=VAL(RIGHT$(F$,INSTR(1%,F$,'.')+1)) 1520 ONERRORGOTO 1610 1530 PREPARE F$ ASFILE 2% 1540 ; #2%,K9% : REM Hastighet 1550 ; #2%,X9% : REM Antal tecken i texten 1560 FOR M%=0% TO X9% 1570 ; #2%,C%(M%) : ; CHR$(C%(M%)); 1580 NEXT M% 1590 CLOSE 2% 1600 ONERRORGOTO 0 : GOTO 140 1610 ; : ; : ; 'ERR'ERRCODE' vid skrivning ' : GOTO 1490 1615 ; : ; : ; 'Ingen text inl{st '; : GET Q$ : GOTO 140 1620 REM 1630 REM _L[SNING AV TEXT FR]N SKIVFIL 1640 ; CHR$(12%) : X0%=0% 1650 ; TAB(80%)'FILNAMN.TAKT f|r l{sn text'; : INPUT F$ : IF F$='' 140 1660 IF INSTR(1%,F$,'.')=0% F$=F$+'.'+NUM$(K9%) 1680 ONERRORGOTO 1855 1720 OPEN F$ ASFILE 1% 1730 INPUT #1%,K9% : REM Hastighet 1740 INPUT #1%,X9% : REM Antal tecken i texten 1750 FOR M%=X0% TO X0%+X9% 1760 INPUT #1%,C%(M%) : ; CHR$(C%(M%)); 1770 NEXT M% 1790 X9%=M% : T=M% : CLOSE 2% 1800 K%=INT((16000%-10*K9%)/K9%) 1820 I%=0% : U%=-1% : V%=0% : X%=-1% : Y%=0% : N%=0% : S%=0% 1825 ; : ; : ; 'Red/Print/Ny fil/Meny'CHR$(8%,8%,8%,8%); : GET Q$ 1830 ON INSTR(1%,CHR$(13%)+'MmNnPpRr',Q$)+1% GOTO 1825,1832,1832,1832,1852,1852,1835,1835,2400,2400 1832 GOSUB 310 : GOTO 140 1835 OPEN 'PR:' ASFILE 5% 1837 ; #5%,STRING$(79%,45%)CHR$(13%,10%)F$'-takt'CHR$(13%,10%,10%) 1840 FOR I%=0% TO X9% 1845 S%=S%+1% : IF S%>65% AND S%<80% AND C%(I%)=32% ; #5%,CHR$(10%,13%) : S%=0% : I%=I%+1% 1847 IF S%=80% S%=0% 1850 ; #5%,CHR$(C%(I%)); : NEXT I% 1852 X0%=M%+1% : GOTO 1650 1853 ; #5%,CHR$(13%,10%,10%,10%) : CLOSE 5% : ONERRORGOTO 0 : GOTO 140 1855 IF ERRCODE=21% ; : ; : ; 'KOLLA SKIVAN (r{tt takt som filtyp?)' : GOTO 1650 1860 ; : ; : ; 'ERR'ERRCODE' vid l{sning '; : GET \$ : GOTO 1630 1865 REM 1870 REM _S[NDNING AV TEXT I MORSE 1880 ; CHR$(12%); 1885 GOSUB 2125 : REM Sk{rmutskr 1890 I%=X9% 1895 IF N%>0% N%=N%-1% : U%=U%-1% : REM R{tt omstart 1900 GOSUB 710 : REM Morses{ndning 1910 IF INP(56%)=30% 420 ELSE 140 : REM Forts reg / Meny 1920 REM 1930 REM _REPETERING AV S[ND TEXT 1940 ; CHR$(12%); 1945 GOSUB 2125 : REM Sk{rmutskr 1950 I%=X9% 1960 GOSUB 310 : REM Initiering 1970 GOSUB 710 : REM Morses{ndning 1980 GOTO 140 : REM Meny 1990 REM 2000 REM _TONGENERATOR F\R H\GTALARE 2010 A=65408 2020 FOR I=0 TO 39 2030 READ N 2040 POKE A+I,N 2050 NEXT I 2060 DATA 245,197,33,254,255,70,35 2070 DATA 78,33,0,0,197,125,211 2080 DATA 58,11,120,177,188,194,143 2090 DATA 255,125,238,64,111,193,197 2100 DATA 27,122,179,254,0,194,140 2110 DATA 255,193,193,241,201 2120 RETURN 2122 REM 2123 REM _UTSKR S[NDNINGSTEXT P] SK[RM 2125 IF X9%>919% 2137 2127 FOR J%=0% TO X9% 2130 ; CHR$(C%(J%)); 2135 NEXT J% 2137 GOSUB 650 : RETURN 2138 REM 2140 REM INSTRUKTIONER 2150 ; CHR$(12%)'INSTRUKTIONER'TAB(40%)'=============' 2160 ; 'OBS! CTRL < ger alltid retur till MENY.' 2170 ; : ; 'REGISTRERING av ny text: Buffern rymmer 3000 tecken. Efter 2850 ges signal.' 2180 ; : ; 'Vid registering omvandlas sm} bokst{ver automatiskt till stora.' 2190 ; : ; '<-- raderar texten ett tecken i taget.' 2200 ; : ; '& ger 10 PARIS f|r hastighetskontroll. # ger 5-st{llig KRYPTOTEXT med valbar' 2205 ; 'procentandel specialtecken och siffror.' 2210 ; : ; 'Vid registrering kan |nskad hastighet v{ljas med > (|kar) och < (minskar).' 2220 ; : ; 'Efter registreringen kan "provs{ndning" ske genom att sl} CTRL ^. RETURN avslu-' 2230 ; 'tar inskrivningen och ger retur MENYN.' 2240 ; : ; '(Forts med RETURN/CTRL <)'; : GET \$ : IF \$='' 140 ELSE ; CHR$(12%) 2250 ; : ; 'Anv{nt FILNAMN vid lagring p} skiva har hastigheten som filtyp. Den skrivs auto-matiskt eller manuellt.' 2260 ; : ; 'Vid L[SNING av skiva st{lls s{ndnings- hastigheten automatiskt in p} registre- rad hastighet i filtypen.' 2270 ; : ; 'Efter H[MTNING fr}n skiva kan texten SKRIVAS UT p} printer eller REDIGERAS.' 2280 ; : ; 'MORSES[NDNING av text (nyinskriven ellerl{st fr}n skiva) kan g|ras en g}ng med 4'; 2290 ; 'i menyn. Vill man repetera s{ndningen (valfritt antal g}nger) v{ljer man 5 i menyn.' 2295 ; : ; 'Efter provs{ndning med CTRL ^ skrivs # .Fortsatt registrering kan ske fr}n dettam{rke. # s{nds ej.' 2300 ; : ; '(Forts{tt med RETURN)'; : GET \$ : ; CHR$(12%) 2305 ; : ; 'Vill man forts{tta registrering efter s{ndning med 4, sl}s n}gon g}ng under s{ndningen CTRL ^ '; 2306 ; 'varvid texten avslutasmed ## som vid provs{ndning.' 2310 ; : ; 'Under MORSES[NDNING accepteras f|ljande:' 2320 ; 'HASTIGHETS[NDRING med > och <.' 2330 ; : ; 'PAUS i s{ndningen s} l{nge MELLANSLAG h}lls nertryckt.' 2340 ; : ; 'AVBROTT i s{ndningen och }terg}ng till MENYN med CTRL <. S{ndningen kan }ter-' 2345 ; 'upptas med 4 eller startas fr}n b|rjan med 5. Flera avbrott kan g|ras.' 2347 ; : ; 'Hastighets{ndring, paus och avbrott verkst{lls i teckenmellanrummen. TR[NA!' 2360 ; : ; 'SLUT (till MENYN med RETURN) '; : GET \$ : GOTO 140 2400 REM 2410 REM _REDIGERINGSRUTIN 2420 S%=0% : T%=0% : GOSUB 2600 2422 ; CUR(18%,0%)'REDIGERINGSKOMMANDON: 'STRING$(16%,61%) 2424 ; '--> mark|r till h|ger, <-- till v{nster RET ner, ^ upp, < > hopp till n{sta ord CTRL D radera ett tkn, '; 2426 ; 'CTRL P l{gg till' : ; 'ett tkn, CTRL< avsluta redigeringen.' 2450 IF S%<0% S%=0% 2453 IF S%>X9%+1% S%=X9% 2455 ; CUR(FNR%,FNK%); 2460 GET G$ : G%=ASC(G$) 2470 IF G%=8% S%=S%-1% : GOTO 2450 2480 IF G%=9% S%=S%+1% : GOTO 2450 2490 IF G%=4% GOSUB 2700 : GOTO 2450 2500 IF G%=16% GOSUB 2650 : GOTO 2450 2510 IF G%=13% S%=S%+40% : GOTO 2450 2520 IF G%=94% OR G%=126% S%=S%-40% : GOTO 2450 2530 IF G%=60% GOSUB 2760 : GOTO 2450 2540 IF G%=62% GOSUB 2810 : GOTO 2450 2550 IF G%=127% GOSUB 310 : GOTO 140 2555 IF G%>95% G%=G%-32% 2557 IF G%=22% G%=118% ELSE IF G%=11% G%=107% 2560 ; CHR$(G%); : C%(S%)=G% : S%=S%+1% : IF S%=X9%+2% X9%=X9%+1% 2570 GOTO 2450 2590 REM 2600 REM *Textdisplay 2605 ; CHR$(12%); 2607 ; CUR(FNR%,FNK%); 2610 FOR I%=S% TO X9% 2620 ; CHR$(C%(I%)); : NEXT I% 2630 ; ' '; : RETURN 2640 REM 2650 REM *Insert 2655 X9%=X9%+1% 2660 FOR J%=X9% TO S% STEP -1% 2665 IF J%=0% J%=-1% : GOTO 2680 2670 C%(J%)=C%(J%-1%) : NEXT J% 2680 C%(J%+1%)=32% : GOSUB 2607 : RETURN 2690 REM 2700 REM *Delete 2705 X9%=X9%-1% 2710 FOR J%=S% TO X9% 2720 C%(J%)=C%(J%+1%) : NEXT J% 2730 C%(J%)=0% : GOSUB 2607 : RETURN 2750 REM 2760 REM *Stega ord bak}t 2770 FOR J%=S%-1% TO 1% STEP -1% 2780 IF C%(J%)=32% 2850 2790 NEXT J% : GOTO 2850 2800 REM 2810 REM *Stega ord fram}t 2820 FOR J%=S%+1% TO X9% 2830 IF C%(J%)=32% 2850 2840 NEXT J% 2850 S%=J% : RETURN 3000 REM _GENERATOR F\R KRYPTOGRUPPER 3002 P1=1 : P2=1 : P3=1 3005 ONERRORGOTO 3007 3006 ; : ; 'Procent siffror '; : INPUT A2 : GOTO 3011 3007 A2=0 3011 ONERRORGOTO 3013 3012 ; 'Procent skiljetecken '; : INPUT A3 : GOTO 3014 3013 A3=0 3014 A1=100-A2-A3 3015 RANDOMIZE : J%=0% 3020 B%=33%+INT((RND*62)+.1) 3021 REM ; CUR(20,0)'B='B%SPACE$(30); GET \$ 3025 IF INP(56%)=255% X9%=I% : ONERRORGOTO 0 : RETURN 3030 IF B%=35% B%=22% 3035 IF B%=37% OR B%=38% OR B%=60% OR B%=62% OR B%=64% OR B%=94% GOTO 3020 3040 IF B%>64% AND B%<94% IF A1=0 GOTO 3020 ELSE P1=P1+1 : GOTO 3053 : REM Antal bokst{ver 3045 IF B%>47% AND B%<58% IF A2=0 GOTO 3020 ELSE P2=P2+1 : GOTO 3055 : REM Antal siffror 3050 IF A3=0 GOTO 3020 ELSE P3=P3+1 : GOTO 3057 : REM Antal |v tecken 3053 IF (P1-1)/(P1+P2+P3)>A1/100% P1=P1-1 : GOTO 3020 ELSE 3059 3055 IF (P2-1)/(P1+P2+P3)>A2/100 P2=P2-1 : GOTO 3020 ELSE 3059 3057 IF (P3-1)/(P1+P2+P3)>A3/100 P3=P3-1 : GOTO 3020 ELSE 3059 3059 REM ; CUR(20,0)'B='B%' P1='P1' P2='P2' P3='P3 GET \$ 3060 GOSUB 570 3065 J%=J%+1% : IF J%=5% J%=-1% : B%=32% : GOTO 3060 3070 GOTO 3020 3095 REM 3100 REM _FORTSATT REGISTERING NY TEXT 3110 ; CHR$(12%); 3120 FOR I%=0% TO X9% : ; CHR$(C%(I%)); : NEXT I% 3130 GOTO 380