Радио-86РК/Радио 10-87/Программа "Морзе-тренажер"

Материал из Emuverse
Данный материал защищён авторскими правами!

Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей.

Автор: Г. ИВАНОВ

Источник: http://retro.h1.ru/RK86/Morze/Morze.html

Эта программа разработана для радиолюбительского компьютера «Радио-86РК» и предназначена для обучения радиотелеграфистов приему на слух. Она позволяет автоматически составлять тренировочные тексты из различных наборов цифр, букв латинского и русского алфавитов, специальных знаков. Тексты со скоростью от 25 до 150 знаков в минуту воспроизводит в звуке динамическая головка компьютера. Для работы с программой не требуется каких-либо дополнительных устройств или переделки компьютера. Все функции тренажера реализованы программно.

Программа состоит из двух частей основной на языке Бейсик и подпрограммы в машинных кодах. Основная программа поддерживает диалог с пользователем, организует введение и составление тренировочных текстов, выбор режимов работы. Использование языка Бейсик для поддержания интерфейса с пользователем дает возможность гибко изменять порядок диалога и при необходимости дополнять его новыми возможностями.

Наиболее критичный ко времени исполнения модуль генерации кода Морзе составлен на ассемблере и транслирован в машинные коды. Это позволило обеспечить широкий выбор скорости генерации кода Морзе и точное соотношение длительностей посылок (точек, тире, пауз). Текст подпрограммы генерации кода Морзе указан в табл.1. Входные параметры подпрограммы определяются символическими переменными СКОР и СИМВОЛ, точка входа — меткой МОРЗЕ. Перед обращением к подпрограмме МОРЗЕ в ячейку с адресом СКОР, заносится значение скорости передачи кода Морзе, а в ячейку СИМВОЛ — код воспроизводимого символа из таблицы КОИ-7.

						Таблица 1
;***********************************************************************
; ПРОГРАННА МОРЗЕ-КОДИРОВАНИЯ СИНВОЛОВ КОИ-7
; ЧАСТЬ ПРОГРАММЫ "МОРЗЕ - ТРЕНАЖЕР"
; ПОДПРОГРАММА ВСТРАИВАЕТСЯ ВНУТРЬ BASIC-ИНТЕРПРЕТАТОРА
;***********************************************************************
	ORG 	19ЕЕН 	; НАЧАЛЬНЫЙ АДРЕС ПОДПРОГРАММЫ
ЗВОНОК: EOU 	0FD27H 	; АДРЕС ПОДПРОГРАММЫ "ЗВОНОК* МОНИТОРА
ТОН: 	EQU 	15Н 	; КОНСТАНТА - ТОН ЗВУКА
СКОР: 	DS 	1 	; СКОРОСТЬ ПЕРЕДАЧИ
СИМВОЛ: DS 	1 	; КОДИРУЕМЫЙ СИМВОЛ
МОРЗЕ: 	LDA 	СИМВОЛ 	; А" ASCII-КОИ? КОД СИМВОЛА
	СРI 	32 	; ПРОВЕЛ •?
	JNZ 	"+11 	; ПРОБЕЛ -> ПАУЗА МЕЖДУ СЛОВАМИ
	MVI	Е,4 	; Е-ДЛИТЕЛЬНОСТИ ПАУЗЫ МЕЖДУ СЛОВАМИ
	CALL 	ПАУЗА 	; НА ПОДПРОГРАММУ ПАУЗЫ
	JMP 	ВЫХОД 	; НА ВЫХОД
	СРI 	44 	; КОД СИМВОЛА ".44 ?
	JC 	ВЫХОД 	; ДА -> НА ВЫХОД
	СРI 	128 	; КОД СИМВОЛА >=128 ?
	JNC 	ВЫХОД 	; ДА -> НА ВЫХОД
	LXI 	D,0 	; DE=0
	MOV 	E,A 	; Е=КОД СИМВОЛА (СМЕЩЕНИЕ)
LXI 	Н,ТАБЛ-44 	; ЗАГРУЗИТЬ В РЕГ. ПАРУ HL АДРЕС
 			;ТАБЛИЦЫ (БЕЗ УЧЕТА СМЕЩЕНИЯ)
	DAD 	D 	; ВЫЧИСЛИТЬ АДРЕС ЭЛЕМЕНТА ТАБЛИЦЫ
	MOV 	А,М 	; А=КОД МОРЗЕ ИЗ ТАБЛИЦЫ
	MVI 	D,8 	; СЧЕТЧИК D"Q
СТБИТ: 	RLC 		; СДВИГ ВЛЕВО ДО "СТАРТОВОГО" БИТА
	DCR 	D 	; УМЕНЬШИТЬ СЧЕТЧИК D НА 1
	J2 	ВЫХОД 	; ВСЕ БИТЫ ПРОВЕРЕНЫ -> НА ВЫХОД
	JNC 	СТБИТ 	; ПОВТОР, ЕСЛИ "СТ." БИТ НЕ ОБНАРУЖЕН
	STA 	СИМВОЛ 	; СИМВОЛ^А
ГЕНКОД: LDA 	СИМВОЛ 	;А=СИМВОЛ
	RLC 		;ПРОВЕРКА СЛЕДУЮЩЕГО БИТА
	STA 	СИМВОЛ 	;СИМВОЛ=А
	MVI 	Е,1 	;Е=ДЛИТЕЛЬНОСТИ ТОЧКИ
	JNC 	$+5 	;ЕСЛИ БИТ=0, ТО ТОЧКА, ИНАЧЕ - ТИРЕ
	MVI 	Е,3 	;Е=ДЛИТЕЛЬНОСТИ ТИРЕ
	CALL 	ЗВУК 	;НА ПОДПР. ВЫДАЧИ ЗВУКОВОЙ ПОСЫЛКИ
	MVI 	Е,1 	;Е=ДЛИТЕЛЬНОСТИ ПАУЗЫ МЕЖДУ ПОСЫЛКАМИ
	CALL 	ПАУЗА 	;НА ПОДПРОГРАММУ ПАУЗЫ
	DCR 	D 	;УМЕНЬШИТЬ СЧЕТЧИК D НА 1
	JNZ 	ГЕНКОД 	;НЕ ВСЕ ПОСЫЛКИ ВЫДАНЫ -> ПОВТОР
	MVI     Е,2     ; Е"ДЛИТЕЛЬНОСТИ ПАУЗЫ МЕЖДУ ЗНАКАМИ 
	CALL    ПАУЗА   ; НА ПОДПРОГРАММУ ПАУЗЫ
ЕЫХОД: 	RET             ; ВОЗВРАТ Б ИНТЕРПРЕТАТОР БЕЙСИКА
ПАУЗА: 			;ДЛИТЕЛЬНОСТИ ПАУЗЫ: 
                 	;	E=1 -> МЕЖДУ ПОСЫЛКАМИ 
			;       Е=2 -> МЕЖДУ ЗНАКАМИ 
			;       Е=4 -> МЕЖДУ СЛОВАМИ 
	LDA     СКОР    ; А=СКОРОСТЬ 
	МОV     С,А     ; С=А
ПМ1:    MVI     В,ТОН+ТОН ; В=ЭКВИВАЛЕНТ ДЛИТЕЛЬНОСТИ ТОНА
	NОР             ; ПУСТОЙ ОПЕРАТОР 
	DCR     В       ; УМЕНЬШИТЬ СЧЕТЧИК В НА 1 
	JNZ     $-2     ; ПОВТОРИТЬ, ЕСЛИ B<>0
	DCR     С       ; УМЕНЬШИТЬ СЧЕТЧИК С НА 1 
	JNZ     ПМ1     ; ПОВТОРИТЬ, ЕСЛИ C<>0
	DCR     Е       ; УМЕНЬШИТЬ СЧЕТЧИК ДЛИТЕЛЬНОСТИ ПАУЗЫ •
	JNZ     ПАУЗА   ; ПОВТОРИТЬ, ЕСЛИ Е<>0 
	RET
ЗВУК:   		;ДЛИТЕЛЬНОСТИ ПОСЫЛОК: 
			;	Е=1 -> ТОЧКА ;               
			;	Е=3 -> ТИРЕ 
	LDA     СКОР    ; А=СКОРОСТЬ 
	MOV     С,А     ; С=А
	MVI     В,ТОН   ; В=КОНСТАНТЕ-ТОН ЗВУКА 
	CALL    ЗВОНОК  ; НА ПОДПРОГРАММУ МОНИТОРА 
	DCR     Е       ; УМЕНЬШИТЬ СЧЕТЧИК ДЛИТЕЛЬН. ПОСЫЛКИ 
	JNZ     ЗВУК    ; ПОВТОРИТЬ, ЕСЛИ Е<>0 
	RET
ТАБЛ:   		; ТАБЛИЦА КОДОВ МОРЗЕ ДЛЯ СИМВОЛОВ КОИ-7
;   ,   -   .   /   0   1   2   3   4   5   6   7   3   9 
DB 55H,31H,40H,32H,3FH,2FH,27H,23H,21H,20H,30H,38H,3CH,3EH 
;   :   ;   <   =   >   ?    @   A   B   C   D   E   F   Q 
DB 78H,36H,2AH,45H,28H,4CH,0C5H,05H,18H,1AH,0CH,02H,12H,0EH
;   H   I   J   K   L   N   N   O   P   Q   R   S   T   U 
DB 10H,04H,17H,0DH,14H,07H,06H,0FH,16H,1DH,0AH,08H,03H,09H 
;   V   W   X   Y   Z   C   \   ]   ^   _   Ю   А   Б   Ц
DB 11H,0BH,19H,1BH,1CH,6DH,73H,6DH,7DH,80H,13H,05H,18H,1AH 
;   Д   Е   Ф   Г   Х   И   Й   К   Л   М   Н   О   П   Я 
DB 0CH,02H,12H,0EH,10H,04H,17H,0DH,14H,07H,06H,0FH,16H,15H 
;   Р   С   Т   У   Ж   В   Ь   Ы   Э   Ш   Э   Щ   Ч  DEL 
DB 0AH,08H,03H,09H,11H,0BH,19H,1BH,1CH,1FH,24H,1DH,1EH,80H
	END           ;***************** КОНЕЦ **********

Подпрограмма МОРЗЕ интерпретирует символы, коды которых находятся в интервале 44—127 таблицы КОИ-7, и пробел (код 32), воспроизводимый, как пауза между словами. Морзе-код символа представляет собой один байт. Составляющие байт нули и единицы кодируют разные по длительности посылки — точки и тире. При записи Морзе-кода последняя посылка отображается младшим битом D0, предпоследняя D1 и т. д. Так как Морзе-коды символов имеют различное число посылок, в байт записывают дополнительный, «стартовый» бит, после которого следуют, биты посылок. Например, символ «а» (•-) отображается байтом 00000101В или 05Н; специальный символ «ВК» (--• • •—*—) байтом 11000101В или С5Н. При интерпретации кода Морзе соответствующий ему байт сдвигается влево оператором RLC до появления в признаке переноса стартового бита. Последующие за ним биты интерпретируются звуковыми посылками. Из Морзе-кодов составлена таблица, первый элемент которой размещается в памяти по адресу ТАБЛ.

Машинные коды подпрограммы встраивают в свободную область интерпретатора Бейсика, для чего подпрограмма транслирована с адреса 19ЕНН. Коды подпрограммы представлены в табл.2. Подпрограмма загружается в память по директиве I монитора после загрузки интерпретатора Бейсика. Целесообразно вывести на ленту версию интерпретатора, включающую подпрограмму МОРЗЕ.

				Таблицы 2
19F0 ЗА ЕF 19 FE 20 C2 00 1A 1E 04 CD 40 1A С3 3F 1A 
1A00 FE 2С DA 3F 1A FЕ 80 D2 3F 1A 11 00 00 5F 21 ЗА 
1А10 1A 19 7E 16 08 07 15 CA 3F 1A D2 15 1A 32 EF 19 
1A20 3А EF 19 07 32 EF 19 1E 01 D2 2E 1A 1E 03 CD 54 
1A30 1A 1E 01 CD 40 1A 15 C2 20 1A 1E 02 CD 40 1A C9 
1A40 ЗА ЕЕ 19 4F 06 2A 00 05 C2 46 1A 0D C2 44 1A 1D 
1A50 C2 40 1A C9 ЗА ЕЕ 19 4F 06 15 CD 27 FD 1D C2 54 
1A60 1A C9 55 31 40 32 3F 2F 27 23 21 20 30 38 3С 3E 
1A70 78 36 2A 45 28 4C C5 05 19 1A 0С 02 12 0E 10 04 
1A80 17 0D 14 07 06 OF 16 1D 0A 08 03 09 11 0В 19 1В 
1A90 1С 6D 73 6D 7D 80 13 05 18 1A 0С 02 12 0E 10 04 
1AA0 17 0D 14 07 06 0F 16 15 0A 08 03 09 11 0В 19 1В 
1AB0 1C 1F 24 1D 1E 80 00 00 00 00 00 00 00 00 00 00

Текст основной программы показан в табл.3. При выполнении программа занимает около 5,5 Кбайт ОЗУ и может быть использована на компьютерах с объемом ОЗУ 16 Кб.

10 REM *******************************************************
11 REM * ПРОГРАММА   * МОРЗЕ   ТРЕНАЖЕР*                     *
12 REM * РАЗРАБОТКА RA3AU                       Г.Н.ИВАНОВ   *
13 REM * СОСТАВЛЯЕТ С ПОМОЩЬЮ ДАТЧИКА ПСЕВДОСЛУЧАЙНЫХ ЧИСЕЛ  *
14 REM * ТРЕНИРОВОЧНЫЕ ТЕКСТЫ И ВОСПРОИЗВОДИТ КОДОМ МОРЗЕ.   *  
20 REM *******************************************************
100 CLEAR 1000 
150 NT$="1234567690"
160 LT$="ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
170 КТ$="АЕВГДЕЖЭИЙКЛМНОПРСТУФХИЧШШЬЫЭЮЯ" 
200 SP=60: POKE 6638,10 
220 MS$=NT$+LT$+KT$
500 REM                  ДИСПЕТЧЕР МЕНЮ  
510 GOSUB 2000: PRINT TAB<20);"OCHOBHOE МЕНЮ:": PRINT 
520 PRINT TAB(10);"1=ТЕСТ ДАТЧИКА КОДА МОРЗЕ" 
530 PRINT TAB(10);"2=НЕПОСРЕДСТВЕННАЯ ПЕРЕДАЧА С КЛАВИАТУРЫ" 
540 PRINT ТАВ(10);"3=ВВОД ТРЕНИРОВОЧНОГО ТЕКСТА" 
550 PRINT TAB(10);"4=HAБOP ЗНАКОВ, ГЕНЕРАЦИЯ ТЕКСТА ИЗ ГРУПП" 
560 PRINT ТАВ(10);"5=РАСПЕЧАТКA ТРЕНИРОВОЧНОГО ТЕКСТА" 
570 PRINT ТАБ(10);"6=ПЕРЕДАЧА ВИДИМОГО НА ЭКРАНЕ ТЕКСТА" 
580 PRINT TAB(10);"7=ПЕРЕДАЧА НЕВИДИМОГО НА ЭКРАНЕ ТЕКСТА" 
590 PRINT ТАВ(10);"8=НАЗНАЧЕНИЕ СКОРОСТИ ПЕРЕДАЧИ" 
800 PRINT: PRINT TAB(5);: INPUT С 
810 ОN С GOSUB 5000,5100,8700,3000,6000,5300,5500,8000 
820 GOTO 510
1000 REM ********** ПОДПРОГРАММЫ ***************** 
2000 REM * ОЧИСТКА ЭКРАНА И ВЫВОД ЗАСТАВКИ 
2010 CLS: CUR 12,24
2020 PRINT "* МОРЗЕ - ТРЕНАЖЕР*": PRINT 
2030 PRINT TAB(16);"СКОРОСТЬ ";SP;" ЗНАКОВ/МИН" 
2040 PRINT: RETURN
2100 REM * ОПИСАНИЕ СПЕЦИАЛЬНЫХ ЗНАКОВ 
2110 PRINT: PRINT TAB(20);"СПЕЦИАЛЬНЫЕ ЗНАКИ:" 
2120 PRINT "AR: '<'   AS: '>'   BК: '@'   KN: ';'   OK; "^" 
2130 PRINT "SK: '='    !: '\'   РАЗДЕЛ: '-'   ЗАБОЙ: '(ЗБ)' 
2140 PRINT: RETURN
3000 REM * НАЗНАЧЕНИЕ НАБОРА ЗНАКОВ, ГЕНЕРАЦИЯ ТЕКСТА 
3010 GOSUB 2000: PRINT TAB(20);"НАБОРЫ ЗНАКОВ:": PRINT 
3020 PRINT TAB(15);"1=ЦИФPЫ" 
3030 PRINT ТАВ(15);"2=БУКВЫ - ЛАТИНСКИЕ" 
3040 PRINT ТАБ(15);"3=БУКВЫ - КИРИЛЛИЦА" 
3050 PRINT ТАВ(15);"4=ЦИФРЫ И БУКВЫ - ЛАТИНСКИЕ" 
3060 PRINT ТАВ(15);"5=ЦИФРЫ И БУКВЫ - КИРИЛЛИЦА" 
3070 PRINT ТАВ(15);"6=ОРИГИНАЛЬНЫЙ НАБОР ЗНАКОВ" 
3100 PRINT: PRINT ТАВ(13); INPUT С 
3110 ON С GOSUB 8100,8200,8300,8400,8500,8600
3120 IF C>0 AND C<7 THEN GOSUB 7000: GOTO 3140 
3130 GOTO 3010 
3140 RETURN
4000 REM * ПЕРЕДАЧА КОДА МОРЗЕ СИМВОЛА D" 
4010 POKE 6639,ASC(D$): D=USR(6640); RETURN 
5000 REM * ТЕСТ ДАТЧИКА КОДА МОРЗЕ 
5010 GOSUB 2000: PRINT TAB(16)1"ТЕСТ ДАТЧИКА КОДА MОРЗЕ* 
5020 FOR IS=44 TO 127: D$=CHR$(IS) 
5030 PRINT IS,D$: GOSUB 4000: NEXT IS 
5040 RETURN
5100 REM * НЕПОСРЕДСТВЕННАЯ ПЕРЕДАЧА С КЛАВИАТУРЫ 
5110 GOSUB 2000
5120 PRINT TAB(10)1"НЕПОСРЕДСТВЕННАЯ ПЕРЕДАЧА С КЛАВИАТУРЫ" 
5130 GOSUB 2100: PRINT TAB(14);" ВЫХОД В ОСНОВНОЕ МЕНЮ: '(ВК)" 
5140 PRINT: PRINT 
5200 Y=USR(-2045) 
5210 IF Y=13 THEN 5250 
5220 IF Y=32 THEN 5240 
5230 IF Y<44 OR Y>127 THEN 5200 
5240 D$=CHR$(Y): PRINT D$;: GOSUB 4000: GOTO 5200 
5250 PRINT: RETURN
5300 REM * ПЕРЕДАЧА ВИДИМОГО НА ЭКРАНЕ ТЕКСТА ^ 
5310 GOSUB 2000 
5320 PRINT TAB(14);"ПЕРЕДАЕТСЯ ТРЕНИРОВОЧНЫЙ ТЕКСТ ..."
5330 LS=LEN(MS$)  
5340 FOR IS=1 TO INT(LS)/30)+1 
5350 PRINT: PRINT ТАВ(4);
5360 FOR JS=1 TO 30: IF (IS-1)*30+JS>LS THEN 5380 
5370 D$=MID$(MS*,(IS-1)*30+JS,1): PRINT D$;: GOSUB 4000 
5380 NEXT JS: NEXT IS 
5390 RETURN
5500 REM * ПЕРЕДАЧА НЕВИДИМОГО НА ЭКРАНЕ ТЕКСТА 
5510 GOSUB 2000
5520 PRINT TAB(14);"ПЕРЕДАЕТСЯ ТРЕНИРОВОЧНЫЙ ТЕКСТ ..." 
5530 LS=LEN(MS$) 
5540 FOR IS=1 TO LS 
5550 D$=MID$(MS",IS,1): GOSUB 4000: NEXT IS
5560 RETURN
6000 REM * РАСПЕЧАТКА ТРЕНИРОВОЧНОГО ТЕКСТА 
6010 GOSUB 2000
6020 PRINT TAB(18);"ТРЕНИРОВОЧНЫЙ ТЕКСТ;": PRINT 
6030 LS=LEN(MS$)
6040 FOR IS=1 TO INT(LS/30)+1 
6030 PRINT TAB(14);MID$(MS$,(IS-1)*30+1,30) 
6060 NEXT IS
6070 PRINT: PRINT TAB(10); 
6080 PRINT "ЧТОБЫ ПРОДОЛЖИТЬ, НАЖНИТЕ ЛЮБУЮ КЛАВИИУ ..."
6090 Y=USR(-2045): IF Y=255 THEN 6090 
6100 RETURN
7000 RЕM * ГЕНЕРАЦИЯ ТЕКСТА, СОСТОЯЩЕГО ИЗ ГРУПП ЗНАКОВ 
7010 GOSUB 2000
7020 PRINT TAB(12);"ГЕНЕРИРУЕТСЯ ТРЕНИРОВОЧНЫЙ ТЕКСТ ...-
703О MS$="": LS=LEN(ST$) 
7040 FOR IS=1 TO 40: FOR JS=1 TO 5 
7050 MS$=MS$+MID$(ST$,INT(RND(1)*LS)+1,1): NEXT JS 
7060 MS$=MS$+" ": NEXT IS 
7070 RETURN
8000 REM * НАЗНАЧЕНИЕ СКОРОСТИ ПЕРЕДАЧИ 
8010 GOSUB 2000
8020 PRINT TAB(16)1"ВВЕДИТЕ СКОРОСТЬ ПЕРЕДАЧИ;" 
8030 PRINT TAB(16)1"ОТ  25  ДО  150  ЗНАКОВ/МИН" 
8040 PRINT; PRINT TAB(14);: INPUT SP 
8050 IF SP<25 OR SP>150 THEN 8010 
8060 POKE 6638,INT(6000/SP): RETURN 
8100 ST$=NT$: RETURN: REM * ЦИФРЫ 
8200 ST$=LT$: RETURN: REM * БУКВЫ - ЛАТИНСКИЕ 
8300 ST$=KT$: RETURN: REM * БУКВЫ - КИРИЛЛИЦА 
8400 ST$=NT$+LT$: RETURN: REM * ЦИФРЫ И БУКВЫ - ЛАТИНСКИЕ 
83ОО ST$=NT$+KT$; RETURN: REM * ЦИФРЫ И БУКВЫ - КИРИЛЛИЦА 
8600 REM * НАЗНАЧЕНИЕ ОРИГИНАЛЬНОГО НАБОРА ЗНАКОВ 
8610 GOSUB 2000: GOSUB 2100 
8620 PRINT TAB(18); "ВВЕДИТЕ НАБОР ЗНАКОВ:" 
8630 INPUT ST$: RETURN 
8700 REM * ВВОД ТРЕНИРОВОЧНОГО ТЕКСТА 
8710 GOSUB 2000: GOSUB 2100: MS$="" 
8720 PRINT TAB(14); "ВВЕДИТЕ ТРЕНИРОВОЧНЫЙ ТЕКСТ:" 
8730 INPUT ST$: IF ST$="" THEN 8760 
8740 MS$=MS$+LEFT$(ST$,250-LEN(MS$)) 
8750 IF LEN(MS$)<250 THEN 8730 
8760 RETURN 
9999 REM ****************** КОНЕЦ **********************************

Программа построена по модульному принципу и состоит из головной части (стр. 10-820) и подпрограмм (стр. 1000 — 8730). Головная часть содержит начальное определение переменных (стр. 100—220) и операторы управления работой программы в режиме меню (стр. 500—-820). Подпрограммы реализуют вывод вспомогательной информации на дисплей (стр. 2000, 2100, 6000), составление тренировочных текстов с помощью датчика псевдослучайных чисел (стр. 3000, 7000, 8100— 8500), воспроизведение текстов кодом Морзе (стр. 5000—5500), организуют введение необходимых для работы данных (стр. 8000, 8600, 8700).

Работа с программой построена в режиме диалога. После запуска программы на выполнение на экране дисплея появляется меню:

МОРЗЕ — ТРЕНАЖЕР СКОРОСТЬ 60 ЗНАКОВ/МИН ОСНОВНОЕ МЕНЮ:
1 Тест датчика кода Морзе
2 Непосредственная передача с клавиатуры
3 Ввод тренировочного текста
4 Набор знаков, генерация текста из групп
5 Распечатка тренировочного текста
6 Передача видимого на экране текста
7 Передача невидимого на экране текста
8 Назначение скорости передачи ? (ответ)

По ответу 1 воспроизводится код Морзе для полного набора символов. Ответ 2 позволяет непосредственно воспроизводить коды, набирая знаки на клавиатуре. По ответу 3 с клавиатуры вводят текст, который затем воспроизводится как тренировочный. Размер вводимого текста — не более 250 символов. Введение текста построчное, заканчивают его символом пробела в первой позиции строки.

По ответу 4 на экране появляется меню для выбора набора знаков и составления тренировочного текста:

НАБОРЫ ЗНАКОВ:

1 Цифры
2 Буквы — латинские
3 Буквы — кириллица
4 Цифры и буквы -латинские
5 Цифры и буквы — кириллица
6 Оригинальный набор знаков ? (ответ)

Ответы определяют наборы знаков, из которых с помощью генератора псевдослучайных чисел затем составляют тренировочные тексты. Последний используют при необходимости составить текст из оригинального набора, например из специальных знаков или отдельно изучаемых букв.

По ответу 5 на экране будет распечатан находящийся в памяти текст, например:

ТРЕНИРОВОЧНЫЙ ТЕКСТ:
8УЬБД КЖЛТ9 БЦЮУД ЛЗОЙЦ ЯТТМЛ
Д4Л1ЦФ ЖРЫ1Ф ЧКБ37 АВЗ^Е Р1<5Р5
42KIIJ3 Х111ДОЙ 49Ы9Н 6ЙБАЗ "Д1ЈГД

Ответы 6 и 7 позволяют воспроизвести кодом Морзе текст, выводя или не выводя его на экран.

По ответу 8 можно задать скорость воспроизведения кода Морзе в пределах от 25 до 150 знаков в минуту. Прием сигналов на слух на большей скорости затруднен из-за неудовлетворительного качества звукового сигнала компьютера, имеющего характерный «рваный» тон. На относительно невысокой скорости влияние такого гона незаметно. Однако подпрограмма генерации кода Морзе позволяет манипулировать внешний звуковой генератор с большими скоростями. Для этого необходимо к одному из разрядов порта D14 подключить через буферный элемент звуковой генератор.

Программу в этом случае необходимо доработать. В основной программе операторы начального определения переменных (стр. 100—220) дополняют операторами инициализации порта D14. В подпрограмме ЗВУК выдачу звукового сигнала заменяют на команды установки и сброса 1 на управляемом разряде D14, обращение к подпрограмме ЗВОНОК заменяют на обращение к подпрограмме ПАУЗА.

Г. ИВАНОВ

г. Химки. Московской обл.