Kurz-lang-kurz – kein Problem
Dieses Programm eignet sich in hervorragender Weise, um das Morsen zu lernen oder zu trainieren.
Dem Anfänger wird die Möglichkeit geboten, durch eine Morsezeichenübersicht die Morsezeichen zu erlernen. Später kann man durch den Programmteil »Computer morst Zufallstext« die erworbenen Kenntnisse überprüfen, wobei die Morsegeschwindigkeit frei gewählt werden kann. Mit etwas Übung gelingt es schon recht bald, zumindest bei niedriger Morsegeschwindigkeit, die meisten Zeichen zweifelsfrei zu identifizieren. Man kann den Computer aber auch dazu bringen, einen eingegebenen Text in Morsezeichen zu übersetzen, was ebenfalls als Trainingsmöglichkeit genutzt werden kann.
Für Profis gibt es dann im dritten Teil die Möglichkeit, selbst gemorsten Text vom Computer überprüfen zu lassen. Als Eingabetaste dient entweder »f7« oder der Feuerknopf beim Joystick.
Gerade dieser Teil des Programms war schwierig zu realisieren, weil die Verarbeitung und Übersetzung in Basic viel zu langsam ist. Letztendlich konnte diese Schwierigkeit aber umgangen werden, indem die gemorste Zeichenfolge nicht unmittelbar ausgewertet, sondern zunächst in einen freien RAM-Bereich zwischengespeichert wird. Erst nachdem der Morsetext zu Ende eingegeben ist, wird dieser Speicherbereich ausgelesen und übersetzt.
Alle Funktionen werden über ein Menü angewählt, wodurch das Programm sehr einfach zu bedienen ist.
(Stefan Ingenhorst)9 | Sprung zum Titelbild |
10 | Begrenzung des Basicspeichers (sonst überlappen Zeichensatz und Variablen) |
40-130 | Morsezeichen werden kreiert (77-kurz, 78-lang) |
140-180 | Soundchip wird initialisiert |
190-220 | Variablenfeld wird mit Morsealphabet gefüllt |
290-380 | Menü |
990-1070 | Zufallsbuchstabenblocks à 5 Zeichen werden kombiniert |
1997-2120 | Eingegebener Text wird in Morsealphabet übersetzt |
2497-2900 | Morsezeichen werden hörbar gemacht |
2997-3340 | Gemorste Zeichen werden ab 49152 gespeichert |
3497-3640 | Gespeicherte Timerwerte werden ausgewertet |
3997-4300 | Morsezeichentabelle auf Bildschirm |
4997-5010 | Programmende mit Systemreset |
10000-20140 | Titelbildunterprogramme |
29997-30240 | Morsealphabet in Data-Zeilen |
35000-35180 | Remarks zur Erklärung |
0 rem ***************************** 1 rem * * 2 rem * morsetrainer + dolmetcher * 3 rem * c by jens martens und * 4 rem * stefan ingenhorst * 5 rem * * 6 rem ***************************** 7 rem ******andromat software****** 8 rem ***************************** 9 gosub20000 10 poke55,200:poke56,47:clr:m$="":fori=54272to54300:pokei,0:next 20 rem ******************************** 25 rem * neue zeichen;77-kurz,78-lang * 30 rem ******************************** 40 poke56334,peek(56334)and254:poke1,peek(1)and251 50 fori=0to2048:ifi=iithengosub10000 60 poke12288+i,peek(53248+i):next 70 poke1,peek(1)or4:poke56334,peek(56334)or1 80 poke53272,(peek(53272)and240)or12 90 reada:ifa=-1then160 100 forj=0to7:readb:poke12288+a*8+j,b:next:goto90 110 data 77,0,0,0,24,24,0,0,0 120 data 78,0,0,0,126,126,0,0,0 130 data-1 140 rem *************** 150 rem ** set sound ** 155 rem *************** 160 w=54276:poke54277,32:poke54278,242 170 poke54272,157:poke54273,69 180 poke54296,15 190 rem ********************** 200 rem ** morsedaten lesen ** 201 rem ********************** 205 dimm$(255) 210 readm:ifm=-1then300 220 readm$:m$(m)=m$:goto210 290 rem *********** 291 rem ** menue ** 292 rem *********** 300 print"{clr}"tab(13)"{orng}{down}{rvon}* m e n u e *{rvof}" 320 print"{yel}{down}{down}{down}{down}{rght}{rght}{rvon}1{rvof} computer morst zufallstext" 330 print"{down}{down}{rght}{rght}{rvon}2{rvof} computer morst eingegebenen text" 340 print"{down}{down}{rght}{rght}{rvon}3{rvof} computer empfaengt" 350 print"{down}{down}{rght}{rght}{rvon}4{rvof} morsezeichen auflisten" 360 print"{down}{down}{rght}{rght}{rvon}5{rvof} programm beenden" 370 input"{down}{down}{down}{rght}{rght}bitte waehlen ";m:ifm<1orm>5then300 380 onmgoto1000,2000,3000,4000,5000 990 rem *************************** 991 rem ** zufallstextgeneration ** 992 rem *************************** 1000 print"{clr}{down}{down}{down}{down}{rght}{rght}bitte geschwindigkeit waehlen" 1010 input"{down}{rght}{rght}(in worten pro minute) ";g 1020 m$="":fori=1to40:m$=m$+" ":forj=1to5 1030 a=int(65*rnd(1))+34:ifm$(a)=""then1030 1040 m$=m$+chr$(a):nextj,i 1050 print:print:print 1060 form=1to252step36:printmid$(m$,m,36):next 1070 goto2500 1997 rem ****************** 1998 rem ** eigener text ** 1999 rem ****************** 2000 print"{clr}{down}{down}{down}{rght}{rght}bitte text eingeben !" 2020 print"{down}{down}{rght}{rght}wenn fertig, 'f1' druecken ." 2030 m$="" 2040 getz$:ifz$=""then2040 2050 ifasc(z$)=133then2100 2060 ifasc(z$)=20thenm$=left$(m$,len(m$)-1):goto2080 2065 ifm$(asc(z$))=""then2040 2070 m$=m$+z$:iflen(m$)>254then2100 2080 print"{home}{down}{down}{down}{down}{down}{down}{down}{down}{rght}{rght}"m$" " 2090 goto2040 2100 print"{home}":fork=1to8:printchr$(17):next:print"{rght}{rght}{orng}text uebernommen .{yel}" 2110 print"{down}{rght}{rght}welche geschwindigkeit" 2120 input"{down}{rght}{rght}(in worten/minute){up}{up}{rght}{rght}{rght}{rght}{rght}";g 2497 rem ***************** 2498 rem ** uebersetzen ** 2499 rem ***************** 2500 g=20/g*46 2510 fori=1tolen(m$):a=asc(mid$(m$,i,1)) 2515 ifa=32thengoto2900 2520 forj=1tolen(m$(a)):b=asc(mid$(m$(a),j,1)) 2530 ifb=205thengosub2700 2540 ifb=206thengosub2800 2550 nextj:fork=1tog:nextk 2560 nexti 2565 print"{down}{rght}{rght}bitte taste druecken " 2570 poke198,0:wait198,1:poke198,0:goto300 2700 pokew,33:fork=1tog:next:pokew,32:fork=1tog:next:return 2800 pokew,33:fork=1to3*g:next:pokew,32:fork=1tog:next:return 2900 fork=1to3*g:next:goto2560 2997 rem ************************** 2998 rem * morsezeichen empfangen * 2999 rem ************************** 3000 print"{clr}{down}geben sie jetzt ihre morse-zeichen ueber{down}die taste 'f7' ein !" 3005 print"{down}wenn fertig, ca. 5 sec warten und danach{down}taste erneut druecken" 3030 print"{down}{down}{rvon}{lblu}alles roger{rvof}{yel} es kann jetzt losgehen !" 3100 w=54276:i=49152 3110 poke198,0:wait198,1:poke198,0 3120 ifpeek(203)<>64then3200 3160 pokew,32:sys65499 3170 ifpeek(203)=64then3170 3180 goto3330 3200 pokew,33:sys65499 3210 ifpeek(203)<>64then3210 3330 ifti>255then3500 3340 pokei,ti:i=i+1:goto3120 3497 rem ******************** 3498 rem * morse-auswertung * 3499 rem ******************** 3500 print"{down}{down}es folgt die auswertung":print"{down}{orng}":m=0:m$="" 3510 forii=49152toi-1:m=m+peek(ii):next 3520 m=m/(i-49152) 3530 forii=49152toi-1:n=peek(ii) 3540 ifn>mand(ii/2<>int(ii/2))thengosub3600:m$="" 3550 ifn<mand(ii/2=int(ii/2))thenm$=m$+chr$(205) 3560 ifn>mand(ii/2=int(ii/2))thenm$=m$+chr$(206) 3570 next:gosub3600 3580 print:print"{yel}{down}{down}bitte taste druecken" 3590 poke198,0:wait198,1:poke198,0:goto300 3600 forj=32to90 3610 ifm$=m$(j)thenprintchr$(j); 3620 next 3630 ifn>m*3thenprintchr$(32); 3640 return 3997 rem ****************** 3998 rem * zeichentabelle * 3999 rem ****************** 4000 m=0:n=0:print"{clr}":fori=1to100:ifm$(i)=""then4100 4010 m$=m$(i):ifi=32then4100 4020 printtab(m*15)chr$(i)" = "m$:n=n+1:ifn=19thenprint"{home}":n=0:m=m+1 4100 next 4200 print"{home}{rght}{rght}":fork=1to11:printchr$(17):next:print"bitte taste druecken" 4300 poke198,0:wait198,1:poke198,0:goto300 4997 rem ********** 4998 rem * abgang * 4999 rem ********** 5000 print"{clr}"spc(11)"{down}{down}{down}{down}ok, das war's" 5010 fori=1to2000:next:sys64738 9998 rem ************** 10000 poke214,22:print:poke211,ii/100 10010 print" {rvon}{lblu} bitte warten {rvof}{yel}" 10015 ii=ii+100 10020 return 19997 rem ************* 19998 rem * titelbild * 19999 rem ************* 20000 poke53280,0:poke53281,0 20010 print"{clr}{yel}"spc(7)"W W"spc(20)"{red}{rvon}{SHIFT-POUND} {rvof}{SHIFT-POUND}{yel}" 20020 printspc(8)"{CBM-B} {CBM-D}{CBM-V}"spc(19)"{red}{rvon}{SHIFT-POUND} {rvof}{SHIFT-POUND}{yel}" 20030 printspc(9)"{CBM-B}{CBM-V}"spc(19)"{red}{rvon}{SHIFT-POUND} {rvof}{SHIFT-POUND}{yel}" 20040 printspc(8)"{CBM-D}{CBM-V}{CBM-B} {CBM-*}"spc(13)"{red}{rvon}{SHIFT-POUND} {rvof}{SHIFT-POUND}{yel}" 20050 printspc(7)"W{CBM-V} {CBM-B} {CBM-D}"spc(12)"{red}{rvon}{SHIFT-POUND} {rvof}{SHIFT-POUND}{yel}" 20060 printspc(12)"{CBM-B} {CBM-D}"spc(14)"{red}{rvon}{SHIFT-POUND} {rvof}{SHIFT-POUND}{yel}" 20070 printspc(13)"{CBM-B} {CBM-D}"spc(13)"{red}{rvon}{SHIFT-POUND} {rvof}{SHIFT-POUND}{yel}" 20080 printspc(14)"{CBM-B}{CBM-V}"spc(11)"{red}{rvon}{CBM-*}{SHIFT-POUND} {rvof}{SHIFT-POUND}{yel}" 20090 printspc(10)"{rvon}{CBM-*}{rvof}{CBM-F}{CBM-F}{CBM-F}{CBM-V}{CBM-V}"spc(11)"{red}{rvon} {rvof}{SHIFT-POUND}" 20100 printspc(27)"{red}{rvon} {CBM-*}{rvof}" 20110 printspc(11)"{yel}{down}{down}{down}morsezeichen" 20120 printspc(7)"{gry3}{down}{down}{rvon}c{rvof} by jens martens und":printtab(14)"{down}stefan ingenhorst" 20130 print"{yel}{down}{down}{rght}{rght}{rght}{rght}{rvon}a n d r o m a t - s o f t w a r e{rvof}" 20140 return 29997 rem ******************** 29998 rem ** morse-alphabet ** 29999 rem ******************** 30000 data32," " 30010 data34,"MNMMNM",39,"MNNNNM" 30020 data40,"NMNNM",41,"NMNNMN" 30030 data43,"MNMNM",45,"NMMMMN" 30040 data46,"MNMNMN",47,"NMMNM" 30050 data48,"NNNNN",49,"MNNNN" 30060 data50,"MMNNN",51,"MMMNN" 30070 data52,"MMMMN",53,"MMMMM" 30080 data54,"NMMMM",55,"NNMMM" 30090 data56,"NNNMM",57,"NNNNM" 30100 data44,"NNMMNN",61,"NMMMN" 30110 data63,"MMNNMM",65,"MN" 30120 data66,"NMMM",67,"NMNM" 30130 data68,"NMM",69,"M" 30140 data70,"MMNM",71,"NNM" 30150 data72,"MMMM",58,"NNNMMM" 30160 data73,"MM",74,"MNNN" 30170 data75,"NMN",76,"MNMM" 30180 data77,"NN",78,"NM" 30190 data79,"NNN",80,"MNNM" 30200 data81,"NNMN",82,"MNM" 30210 data83,"MMM",84,"N" 30220 data85,"MMN",86,"MMMN" 30230 data87,"MNN",88,"NMMN" 30240 data89,"NMNN",90,"NNMM",-1 35000 rem *************************** 35010 rem sys 65499 <=> ti$="000000" 35020 rem sys 64738 <=> system reset 35030 rem *************************** 35040 rem variablentabelle 35050 rem *************************** 35060 rem m$(x) <=> morsezeichen zu x 35070 rem g <=> morsegeschwindigkeit 35080 rem m$,z$ <=> hilfs-string 35090 rem w <=>si:voice i: waveform 35100 rem a,b,i,ii,k <=> hilfszaehler 35110 rem ti <=> timer in sec/60 35120 rem **************************** 35130 rem abspeicherung der timerwerte 35140 rem zum entschluesseln der morse 35150 rem zeichen ab 49152 (dez.) 35160 rem **************************** 35170 rem neuer zeichensatz ab 12228 35180 rem ****************************