home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nibble Magazine
/
nib38b.dsk
/
MORSECODE.TUTOR.bas
< prev
next >
Wrap
BASIC Source File
|
2023-02-26
|
10KB
|
319 lines
10 REM *************************
20 REM * MORSECODE.TUTOR *
30 REM * BY JOHN WHITNEY *
40 REM * COPYRIGHT(C) 1990 *
50 REM * MINDCRAFT PUBL. CORP. *
60 REM * CONCORD, MA 01742 *
65 REM *************************
70 DIM C(40,6),PN(15)
80 PN(1) = 66:PN(2) = 89:PN(3) = 32
90 PN(4) = 74:PN(5) = 79:PN(6) = 72
100 PN(7) = 78:PN(8) = 32:PN(9) = 87
110 PN(10) = 72:PN(11) = 73:PN(12) = 84:PN(13) = 78:PN(14) = 69:PN(15) = 89
120 HOME : PRINT CHR$(21): VTAB 3: HTAB 13: PRINT "MORSE CODE TUTOR": PRINT "COPYRIGHT(C) 1990 MINDCRAFT PUBL. CORP."
130 FOR VN = 1 TO 15
140 VTAB (7): HTAB (13)
150 FOR VO = VN TO 1 STEP -1
160 PRINT CHR$(PN(16 -VO));
170 NEXT VO
180 PRINT
190 NEXT VN
200 PRINT
210 VTAB (11): HTAB (12): PRINT " LOADING DATA... ": REM 1 AND 2 SPACES
220 READ P,S,L,W
230 FOR CT = 1 TO 126
240 CT$ = CT$ +"^"
250 NEXT CT
260 FOR I = 1 TO 40
270 CT = 0: READ CR$
280 FOR J = 1 TO 6
290 READ C(I,J)
300 IF C(I,J) = 1 THEN CT = (CT *2) +1
310 IF C(I,J) = 3 THEN CT = (CT *2) +2
320 NEXT J
330 IF CT = 1 THEN CT$ = CR$ + MID$ (CT$,2): GOTO 360
340 IF CT = 126 THEN CT$ = LEFT$(CT$,125) +CR$: GOTO 360
350 CT$ = LEFT$(CT$,CT -1) +CR$ + MID$ (CT$,CT +1)
360 NEXT I
370 FOR I = 770 TO 792
380 READ X
390 POKE I,X
400 NEXT : VTAB 24: PRINT "PRESS RETURN TO CONTINUE";: GET XX$
410 HOME : VTAB (3): HTAB (18): INVERSE : PRINT "MENU": NORMAL : VTAB (7)
420 PRINT " (1) TRANSLATE SENTENCE TO CODE"
430 PRINT " (2) SINGLE LETTER DRILLS"
440 PRINT " (3) PRACTICE SENDING"
450 PRINT " (4) CHANGE WORDS PER MINUTE (DEFAULT=5)"
460 PRINT " ESC EXIT PROGRAM"
470 VTAB (15): PRINT "ENTER OPTION: ";: GET OP$
480 IF ASC(OP$) = 27 THEN HOME : END
490 OP = VAL(OP$)
500 ON OP GOSUB 520,970,1800,2150
510 GOTO 410
520 HOME : VTAB (3): HTAB (7): INVERSE : PRINT "TRANSLATE SENTENCE TO CODE": NORMAL : PRINT : PRINT
530 MS$ = "": PRINT "DO YOU WANT VISUAL? ";: GET V$: PRINT V$
540 PRINT "ENTER THE SENTENCE YOU WISH TO HEAR"
550 PRINT "TRANSLATED (ESC TO QUIT):"
560 VTAB (10): HTAB (1): CALL -958: GET M$: PRINT SPC( 160): VTAB (10): HTAB (1): GOTO 580
570 GET M$
580 IF ASC(M$) = 13 THEN 660
590 IF ASC(M$) = 27 THEN RETURN
600 IF ASC(M$) = 8 AND MS$ = "" THEN GOTO 570
610 IF ASC(M$) = 8 AND LEN(MS$) = 1 THEN MS$ = "": PRINT M$;: GOTO 570
620 IF ASC(M$) = 8 THEN MS$ = LEFT$(MS$, LEN(MS$) -1): PRINT M$;: GOTO 570
630 IF ASC(M$) = 21 THEN M$ = " "
640 PRINT M$;:MS$ = MS$ +M$
650 GOTO 570
660 GOSUB 670:MS$ = "": GOTO 560
670 REM *****STRING THRU MS$*****
680 VTAB (13): PRINT SPC( 160)
690 K = 0:LN = LEN(MS$)
700 K = K +1
710 IF K >LN THEN RETURN
720 MC$ = MID$ (MS$,K,1)
730 CI = ASC(MC$)
740 VTAB (13): HTAB (K): PRINT MID$ (MS$,K,1);
750 GOSUB 790
760 FOR XX = 1 TO L: NEXT
770 GOTO 700
780 REM *****PLAY CHARACTER*****
790 VTAB (20): HTAB (1): PRINT SPC( 39): VTAB (20): HTAB (2)
800 IF CI >64 AND CI <91 THEN CI = CI -64: GOTO 880
805 IF CI >96 AND CI <123 THEN CI = CI -96: GOTO 880
810 IF CI >47 AND CI <58 THEN CI = CI -21: GOTO 880
820 IF CI = 46 THEN CI = 37: GOTO 880
830 IF CI = 44 THEN CI = 38: GOTO 880
840 IF CI = 63 THEN CI = 39: GOTO 880
850 IF CI = 47 THEN CI = 40: GOTO 880
860 PRINT " ";: FOR XX = 1 TO W: NEXT
870 RETURN
880 CC = 1
890 POKE 768,P
900 POKE 769,S *C(CI,CC)
910 IF V$ = "Y" OR V$ = "y" THEN INVERSE : PRINT SPC( C(CI,CC));: NORMAL : PRINT " ";
920 CALL 770
930 FOR XX = 1 TO S *2: NEXT
940 CC = CC +1: IF CC >6 THEN RETURN
950 IF C(CI,CC) = 0 THEN RETURN
960 GOTO 890
970 REM *****LETTER DRILL*****
980 DG$ = ""
990 HOME : VTAB (3): HTAB (14)
1000 INVERSE : PRINT "LETTER DRILL": NORMAL
1010 VTAB (6)
1020 HTAB (10): PRINT "DRILL 1: E T M A N I"
1030 HTAB (10): PRINT " 2: R D U S C O": REM 6 SPACES THROUGH LINE 1100
1040 HTAB (10): PRINT " 3: K P B G W F"
1050 HTAB (10): PRINT " 4: Q H L Y"
1060 HTAB (10): PRINT " 5: J X V Z"
1070 HTAB (10): PRINT " 6: 1 2 3 4"
1080 HTAB (10): PRINT " 7: 5 6 7 8"
1090 HTAB (10): PRINT " 8: 9 0 . , / ?"
1100 HTAB (10): PRINT " 9: CHOOSE YOUR OWN"
1110 PRINT
1120 HTAB (10): PRINT "RETURN TO START, ESC TO QUIT"
1130 VTAB (20): PRINT "SELECTION LIST: ";DG$: VTAB (18): HTAB (1): PRINT SPC( 40): VTAB (18): HTAB (1): PRINT "ENTER OPTION: ";
1140 GET DR$: PRINT
1150 IF ASC(DR$) = 27 THEN RETURN
1160 DR = VAL(DR$)
1170 IF ASC(DR$) = 13 THEN 1300
1180 IF DR = 1 THEN DG$ = DG$ +"ETMANI": GOTO 1130
1190 IF DR = 2 THEN DG$ = DG$ +"RDUSCO": GOTO 1130
1200 IF DR = 3 THEN DG$ = DG$ +"KPBGWF": GOTO 1130
1210 IF DR = 4 THEN DG$ = DG$ +"QHLY": GOTO 1130
1220 IF DR = 5 THEN DG$ = DG$ +"JXVZ": GOTO 1130
1230 IF DR = 6 THEN DG$ = DG$ +"1234": GOTO 1130
1240 IF DR = 7 THEN DG$ = DG$ +"5678": GOTO 1130
1250 IF DR = 8 THEN DG$ = DG$ +"90.,/?": GOTO 1130
1260 IF DR < >9 THEN PRINT "": GOTO 1130
1270 VTAB (18): PRINT TAB( 25)" "
1280 VTAB (18): HTAB (1): INPUT "ENTER STRING: ";D2$
1290 DG$ = DG$ +D2$: GOTO 1130
1300 IF DG$ = "" THEN RETURN
1310 PRINT : PRINT : PRINT : PRINT "DO YOU WANT VISUAL? ";: GET V$: PRINT V$
1320 REM **** REVIEW ****
1330 HOME : VTAB (3): HTAB (12): INVERSE : PRINT "REVIEW SELECTIONS"
1340 VTAB (23): NORMAL : PRINT "(PRESS SPACE BAR TO PROCEED)": INVERSE
1350 VTAB (10): HTAB (18): PRINT SPC( 4)" "
1360 VTAB (11): HTAB (18): PRINT " "
1370 VTAB (11): HTAB (22): PRINT " "
1380 VTAB (12): HTAB (18): PRINT " "
1390 VTAB (12): HTAB (22): PRINT " "
1400 VTAB (13): HTAB (18): PRINT " "
1410 VTAB (13): HTAB (22): PRINT " "
1420 VTAB (14): HTAB (18): PRINT SPC( 4)" "
1430 NORMAL
1440 FOR YY = 1 TO LEN(DG$)
1450 CI = ASC( MID$ (DG$,YY,1))
1460 VTAB (12): HTAB (20): PRINT CHR$(CI)
1470 GOSUB 790
1480 VTAB (1): HTAB (1): GET KB$
1490 NEXT YY
1500 REM ***** START QUIZ *****
1510 HOME : VTAB (3): HTAB (18): INVERSE : PRINT "QUIZ"
1520 VTAB (10): HTAB (18): PRINT SPC( 4)" "
1530 VTAB (11): HTAB (18): PRINT " "
1540 VTAB (11): HTAB (22): PRINT " "
1550 VTAB (12): HTAB (18): PRINT " "
1560 VTAB (12): HTAB (22): PRINT " "
1570 VTAB (13): HTAB (18): PRINT " "
1580 VTAB (13): HTAB (22): PRINT " "
1590 VTAB (14): HTAB (18): PRINT SPC( 4)" "
1600 NORMAL : VTAB (23): PRINT "(PRESS ESC TO QUIT)"
1610 FOR QQ = 1 TO 300: NEXT
1620 VTAB (16): PRINT SPC( 80)
1630 GOSUB 1750
1640 GOSUB 790
1650 VTAB (8): HTAB (17): PRINT "ANSWER:"
1660 VTAB (12): HTAB (20)
1670 GET KB$: PRINT KB$
1680 KB = ASC(KB$)
1690 IF KB = 27 THEN GOTO 970
1700 VTAB (16): PRINT SPC( 80)
1710 IF KB = ASC(DC$) THEN VTAB (16): HTAB (17): PRINT "CORRECT": GOTO 1610
1720 VTAB (16): HTAB (16): PRINT "INCORRECT"
1730 VTAB (17): HTAB (20): PRINT DC$:CI = ASC(DC$): GOTO 1640
1740 GOTO 1610
1750 REM ****PICK RANDOM CHARACTER****
1760 DC = INT( RND(1) * LEN(DG$)) +1
1770 DC$ = MID$ (DG$,DC,1)
1780 CI = ASC(DC$)
1790 RETURN
1800 REM ***** SEND *****
1810 HOME : VTAB (3): HTAB (12): INVERSE : PRINT "PRACTICE SENDING": NORMAL
1820 VTAB (5): PRINT "PRESS SPACE BAR FOR DOT,"
1830 PRINT "ANY OTHER KEY FOR DASH"
1840 PRINT "PRESS ESC TO QUIT"
1845 PRINT : PRINT "= ... TOOK TOO MUCH TIME": PRINT "^ ... UNRECOGNIZABLE SEQUENCE"
1850 CT = 0: VTAB (15)
1860 IF PEEK( -16384) >127 THEN 1890
1870 PU = PU +1: IF PU >L/25 THEN GOSUB 2070
1880 GOTO 1860
1890 PU = 0
1900 GET KB$: IF ASC(KB$) = 27 THEN RETURN
1910 IF KB$ = " " THEN GOSUB 1930: GOTO 1860
1920 GOSUB 2000: GOTO 1860
1930 REM ***** PLAY DOT *****
1940 POKE 768,P
1950 POKE 769,S
1960 CALL 770
1970 CT = (CT *2) +1
1980 IF CT >126 THEN PRINT "^";:CT = 0
1990 RETURN
2000 REM ***** PLAY DASH *****
2010 POKE 768,P
2020 POKE 769,S *3
2030 CALL 770
2040 CT = (CT *2) +2
2050 IF CT >126 THEN PRINT "^";:CT = 0
2060 RETURN
2070 REM ***** DISPLAY TRANSLATED CHAR *****
2080 PU = 0
2090 IF CT = 0 THEN XT = XT +1
2100 IF XT = 7 THEN PRINT "=";:XT = 0: GOTO 2140
2110 IF CT = 0 THEN 2140
2120 PRINT MID$ (CT$,CT,1);
2130 CT = 0
2140 RETURN
2150 REM ***** SET WORDS PER MINUTE *****
2160 HOME : VTAB (3): HTAB (10): INVERSE : PRINT "SET WORDS PER MINUTE": NORMAL
2170 PRINT : PRINT : PRINT
2180 INPUT "WORDS PER MINUTE: ";WP
2190 IF WP <3 THEN PRINT "TOO SLOW - REENTER": VTAB (7): GOTO 2180
2200 IF WP >250 THEN PRINT "TOO FAST - REENTER": VTAB (7): GOTO 2180
2210 S = 250/WP
2220 L = S *50
2230 W = 2 *L
2240 RETURN
2250 REM PITCH
2260 DATA 81
2270 REM DURATION (SPEED MULTIPLIER)
2280 DATA 50
2290 REM LETTER GAP
2300 DATA 750
2310 REM WORD GAP
2320 DATA 1500
2330 REM *** CHARACTERS ***
2340 DATA A
2350 DATA 1,3,0,0,0,0
2360 DATA B
2370 DATA 3,1,1,1,0,0
2380 DATA C
2390 DATA 3,1,3,1,0,0
2400 DATA D
2410 DATA 3,1,1,0,0,0
2420 DATA E
2430 DATA 1,0,0,0,0,0
2440 DATA F
2450 DATA 1,1,3,1,0,0
2460 DATA G
2470 DATA 3,3,1,0,0,0
2480 DATA H
2490 DATA 1,1,1,1,0,0
2500 DATA I
2510 DATA 1,1,0,0,0,0
2520 DATA J
2530 DATA 1,3,3,3,0,0
2540 DATA K
2550 DATA 3,1,3,0,0,0
2560 DATA L
2570 DATA 1,3,1,1,0,0
2580 DATA M
2590 DATA 3,3,0,0,0,0
2600 DATA N
2610 DATA 3,1,0,0,0,0
2620 DATA O
2630 DATA 3,3,3,0,0,0
2640 DATA P
2650 DATA 1,3,3,1,0,0
2660 DATA Q
2670 DATA 3,3,1,3,0,0
2680 DATA R
2690 DATA 1,3,1,0,0,0
2700 DATA S
2710 DATA 1,1,1,0,0,0
2720 DATA T
2730 DATA 3,0,0,0,0,0
2740 DATA U
2750 DATA 1,1,3,0,0,0
2760 DATA V
2770 DATA 1,1,1,3,0,0
2780 DATA W
2790 DATA 1,3,3,0,0,0
2800 DATA X
2810 DATA 3,1,1,3,0,0
2820 DATA Y
2830 DATA 3,1,3,3,0,0
2840 DATA Z
2850 DATA 3,3,1,1,0,0
2860 DATA 0
2870 DATA 3,3,3,3,3,0
2880 DATA 1
2890 DATA 1,3,3,3,3,0
2900 DATA 2
2910 DATA 1,1,3,3,3,0
2920 DATA 3
2930 DATA 1,1,1,3,3,0
2940 DATA 4
2950 DATA 1,1,1,1,3,0
2960 DATA 5
2970 DATA 1,1,1,1,1,0
2980 DATA 6
2990 DATA 3,1,1,1,1,0
3000 DATA 7
3010 DATA 3,3,1,1,1,0
3020 DATA 8
3030 DATA 3,3,3,1,1,0
3040 DATA 9
3050 DATA 3,3,3,3,1,0
3060 DATA "."
3070 DATA 1,3,1,3,1,3
3080 DATA ","
3090 DATA 3,3,1,1,3,3
3100 DATA "?"
3110 DATA 1,1,3,3,1,1
3120 DATA "/"
3130 DATA 3,1,1,3,1,0
3140 REM TONE DATA
3150 DATA 173,48,192,136,208,5,206,1,3,240
3160 DATA 9,202,208,245,174,0,3,76,2,3,96,0,0