Строительный блокнот НЧ широкополосный фазовращатель рлщо-86рк принимает морзянку Под таким названием в журнале Радио N 4 за 1990г. была напечатана статья А Долгого, заинтересовавшая владельцев не только Радио-8бР1&>, но и тех, кто использует на своей станции другие компьютеры. Однако, предложенная в этой статье программа привязана к конкретному компьютеру и ее невозможно адаптировать к компьютеру другого типа путем простой замены нескольких байт. Выполняя многочисленные просьбы радиолюбителей читателей, мы публикуем исходный текст программы приема кода Морзе на языке ассемблера. Надеемся, это поможет энтузиастам механизированного приема телеграфа разобраться в алгоритме ее работы и разработать аналогичные программы для других компьютеров. Исходный текст программы ориентирован на процессор К580ВМ80 и может пригодиться для всех РК, использующих этот процессор. Владельцам компьютеров, собранных на базе процессоров других типов (например, Z80), данная публикация может быть полезна для составления алгоритма приема морзянки на своем РК. мы приглашаем коротковолновиков, создавших компьютерные КВ/УКВ профаммы (прием пакета , телетайпа, сервис любительской станции и т.д.) для компьютеров, имеющих хождение в радиолюбительских кругах (отнюдь не только для Радио-8бРК ), поделиться своим опытом с читателями КВ журнала . Исходный текст программы приема кода Морзе дяя радиолюбительского компьютгоа Радио-8бРК приведен в таблице. Сразу отметим, что он не соответствует в точности опубликованным ранее кодам. Тем не менее принципиальных различий нет и полученная в результате его трансляции программа работает точно так же, как и опубликованная ранее. В основу алгоритма приема и декодирования кода Морзе положено измерение длительностей последовательных нажатий и огжатий ключа и их сравнения с образцом. Нажатие длительностью короче двух образцовых считается точкой, а длинМее - тире. Для адаптации к изменяющейся скорости передачи образец постоянно корректируется. После приема каждой точки за новый образец принимается среднее арифметическое длительности старого и фактической длительности точки. После приема каждого тире новый образец равен четверти суммы длительности старого н факгическоЯдли-тельности тире. Отжатие короче двух образцов считается паузой между элементами знака, длиннее двух, но короче шести - паузой между знаками, а еще более длинное -пробелом. Фактическая длительность пауз на образец не влияет и после любого перерыва в приеме программа остается настроенной на ту скорость, с которой передавался последний принятый знак. Принимаемая последовательность точек и тире преобразуется в промежуточный двоичный код. Исходное значе- ние кода принимается равным 1. После приема каждого элемента код (двигается на один разряд влево, а в его младший разряд записывается О, если принята точка, шш 1, если пришло тире. Принятому знаку соответствует символ, порядковый номер которого в таблице кода Морзе (метки 1АТ и RUS) на единицу меньше численного значения полученного промежуточного кода. Например, сигнал точка-точка-тире-точка декодируется так: код до начала приема: 000(Ю001 после приема первой точки: 00000010 после приема второй точки: 00000100 после приема тире: 00001001 после приема третьей точки: 00010010 Численное значение кода 00010010 равно 18, следовательно принят семнадцатый от метки LAT символ - буква F. Если прием ведется на русском регистре, то символы отсчитываются от метки RUS. От нее же отсчитываются не зависящие от регистра символы - знаки препинания и цифры. Последовательности точек и тире, которым в коде Морзе не соответствует никакой символ, обозначены как подчеркивание . Появление этого символа на экране обычно свидетельствует о сбое. Предусмотрено отображение некоторых двухбуквенных комбинаций радиолюбительского кода, обычно передаваемых слитно. Символ > обозначает AR, @ - AS, # - SK. При необходимости можно внести в таблицу символы и для , UT5DE MORSE RECEIVER ; АЗПС W/02/89 DOTLEN-.EQU lOH ;Исходная даительность точки. ;Испоп1>зуемые подпрограммы МОНИТОРА. CONIN: MSG: CSTS: QUERY: EQU 0F803H EQU OFSIJH EQU тпн EQU 0F81BH EQU 0F86CH ;Ввод с Ю1авиат;>ры. ;Вывод сообшення. ;Состояние клавиатуры. ;Опрос клавиатуры. .Перезапуск МОНИТОРА :Конс1авты для подпрограммы опроса ключа. KEYPORT: EQU 8002Н kETMASK:EQtJ Ш bYIND: EQU 7812Н icEYSYM: EQU 7EH ;Прочие константы. CUR: SCRO: EQU 5FH EQU 7 ACH SADRO: EQU 7F12H LN: EQU 7 LNSYM: EQU 64 N1: N2: EQU 128 EQU 4 EQU 2 N3: EQU 9 BUFLEN; EQU 40H Лорес псла, с которым соединен ключ. ;Маска разряда, с которым соединен ключ. ;Адрес ячейки ОЗУ экрана для индикации полохеиия ключа. ,-Код символа, индицирующего нахатне ключа. ,Код символа, используемого как курсор. .Начало первой ю использ. строк экрана. Чцрес ячейки ОЗУ экрана, с которой нащется вывод символов. Длина стро13< вОЗУ э;яна. .Число символов, выводимых в оциой строк. ;Ма1ссимальное число символов, сдвигаемых за одни вызов SCROLL. ;Константы для вырав-;иивания длительностей ;различных операций вывода на э1фан. Длина кольцевого буфера. BEGIN; LXI HBANNER CAU MSG ;Затоловоь ;Начальные условия. MVl А,0 STA SIP LXI Н,0 SHLD RDPTR LXI HSABRO SHLDSADR /Сдвнгэкранаие начинался. ;Буфер пуст. ;Адрес вывода первого символа. CALLNEWLN CALLTIME4 CALL SETLAT MVl A,DOTLEN MOV D, A ;Исходиая длительность ;Сгрока очишеиа. Детинский регистр. BANNER; DB 1FH,-+-+.................+ DB 10,13.! lUTSDECWRXr DB 10,13.+-+.................+ DB 13,25,! .0 START: CALLKBDCOM CALL TIME CALL INKEY JNZ START Ждем нажатия. MVl С, 1 KEYDWN: MVl B,0 DOWNl: CALLTIME4 INR В JZ START DASK CALL INKEY JZ DOWNl MVl A,02H CMP В JNC DOWNl MOV A,D ADD A CMP В JC DASH MOV A,D ADD В RRC ANI *rFH MOV DA MOV A,C ADD A IMP KEYUP MOV A,D ADD В RRC RRC ANI 3FH MOV DA MOV A,C ADD A INR A ;Ключ слишком долго нажат. ;Пока ключ не отпушен. ;Это была помеха. ;Сравниваем с удвоенной длительностью точки. ,Есвн больше, то это тире, ;нначе принята точка. ;Новое значение длит, точки ;D-(D+B)/2 ;Сдвигаем принятый код и добавляем О в его мл. разряд. ;Прннято тире. KEYUP; MOV СА CPI 80Н JNC START .Новое значение длит.точки. ;D-(D+By4 ;Сдвигаем принятый 1юд .-н добавляем 1 в его мя.разряд. ;Ключ отпущен. -.Это слишком длинный код. точки. IMP START MVl В,00Н UPl: CALL TIME4 INR В CALLINKEY JZ KEYDWN ;Если ключ нажат. MOV A,D ADD A CMP В JNC UPl MVl B,0OH LHLD MORSE MVl A,1FH CMP С JNC LTl LXI H,RUS-2 ;Еа!и пауза < дв. точки, .иначе это кшец знака. Лцрес таблицы Морзе. ;Ес1и больше 4 точек/тире, гго всегда декодируем :по русской таблице. LTl; SPACE: DAD В MOV A,M CAI,L0UTSYM;3aH0CHM символ в буфер MVI В,0 CALLTIME4 INK В CALL INKEY mSTABT MOV A,D ADD A ADD A SUB в таС SPACE MVI A, CALLOUTSYM JMP START ;и обнуляем код. ;Если ключ нахая. ;Ж1ем 4 длит, точки ;и выводим пробел. Лояпро1ра ша опроса ключа ;и индикации его пояохения. ;Выход с флагом Z-1, если нажат, и Z-0, если не нажат. INKEY: LDA KEYPORT ANI KEYMASK MVIAJCEYSYM JZ Ш1 ;Если ключ нахаг. MV1A,20H Ш1: STTA KEYIND RET гПодпрограмма ввода команд с клавиатуры. KBDCOM: LDA CHRI MOV СЛ CALL QUERY CMP С RZ STA CHRI CPI R JZ SETRUS ;Ha русский регистр. CPI V JZ SETLAT CPI ODH JZ NEWLN CPI IFH JZ WS RET SETRUS: LXI H,RUS-2 SHLD MORSE RET LXI H,UT-2 SHLD MORSE RET MVI A,OADH ;Код пробела с признаком новой строки. PUSHPSW IDA шт. MOV СЛ INR А ANI BUFLEN-1 СТА WRPTR MVI В,0 LXI H,BUF DAD в LDA LNCNT DCR A JM BTOl STA LNCNT MOV АД MOV ВЛ POP PSW JMP ВЮ2 ;Перевинули указатель и ;считаем символы в строке. ;Если пора начал новую строку. ;Малены1вя задержка для .-выравнивания длительностей. ВГО1: MVI A,LNSYM STA LNCNT BF02: TIME4: POP PSW ORI 80H MOV ил POP В POP H RET CALL TIME CALL TIME CALL TIME ;Инициализируем счетчик символов. Добавляем признак новой строки. ;3аписали в буфф. ;Повторяем вызовы, чтобы ;получить нужную ;зяяерхху. ;Бслн нажататахе клавиша. ;На латииский регистр. .-Перевести строку. ;Выйти из программы. Яояпршрамма задержки, совиешснной ;с вывод) символа из буфера на экран. TIME. PUSHH PUSHD PUSH В PUSH PSW LDA SIP ORA A JZ DLl CALL SCROLL JMP RTRN Зсли сдвиг эаноичеи, ;иначе продолжаем его. DL1: SEOAT; NEWLN: LHLDRDPTR MOV A,H CMP L JNZ OUTCHR ;Если &?фер не пуст. MVI A,NO CALL DEUY JMP RTRN ;Подпрограмма записи символа в кольцевой буфер. ;Выводим символ на экран OUTSYM: PUSH И PUSH В OUTCHR: MOV CL MVI В,0
|