; MORSE DECODER ; BY TOSHIE HIROSHIMA LIST P=16F88 #INCLUDE P16F88.INC __CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _BODEN_ON & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _HS_OSC & _LVP_OFF & _CPD_OFF __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF CBLOCK 020h cnt70us cnt1ms cnt10ms cnt ad_result charbuf chrjump chrpos chrtmp mr_mod mr_cnt mr_thr mr_thr2 mr_cod mr_len mr_tmp mr_len0 mr_len1 mr_lent mr_auto ; Automatic code-set selection (0H: Manual, 1H: Auto) mr_prevchar ; Previous Decoded Character sw_prev ; RA1 Previous State sw_flag ; RA1 Negative Edge ENDC CBLOCK 040h ch0 ch1 ch2 ch3 ch4 ch5 ch6 ch7 ch8 ch9 cha chb chc chd che chf ENDC ORG 0 GOTO start start CLRF cnt70us CLRF cnt1ms CLRF cnt10ms CLRF cnt CLRF chrpos CLRF mr_mod ; BSF mr_mod,0 ; Set Wabun CLRF mr_auto BSF mr_auto,0 CLRF sw_prev BSF sw_prev,0 CLRF sw_flag MOVLW ' ' MOVWF ch0 MOVWF ch1 MOVWF ch2 MOVWF ch3 MOVWF ch4 MOVWF ch5 MOVWF ch6 MOVWF ch7 MOVWF ch8 MOVWF ch9 MOVWF cha MOVWF chb MOVWF chc MOVWF chd MOVWF che MOVWF chf MOVLW d'70' MOVWF mr_thr MOVLW d'175' MOVWF mr_thr2 MOVWF mr_len0 MOVWF mr_len1 MOVWF mr_lent BSF STATUS,RP0 MOVLW 003h MOVWF TRISA CLRF TRISB MOVLW 080h MOVWF OPTION_REG CLRF INTCON MOVLW 040h MOVWF ADCON1 MOVLW 000h MOVWF ANSEL BCF STATUS,RP0 MOVLW 051h MOVWF ADCON0 CLRF PORTB CALL lcdinit MOVLW '[' CALL printchar MOVLW 'H' CALL printchar MOVLW 'T' CALL printchar MOVLW 'D' CALL printchar MOVLW 'E' CALL printchar MOVLW 'C' CALL printchar MOVLW '1' CALL printchar MOVLW ']' CALL printchar CLRF mr_len CLRF mr_cod decode_loop INCF mr_len,F MOVF mr_len,W BCF STATUS,C SUBLW d'9' BTFSC STATUS,C GOTO decode_skip MOVLW d'9' MOVWF mr_len CLRF mr_cod decode_skip BCF STATUS,C RLF mr_cod,F CALL wait_mark CALL count_mark ADDWF mr_cod,F CALL wait_break CALL count_break MOVWF mr_tmp BTFSS mr_tmp,0 GOTO decode_loop CALL decode MOVWF mr_prevchar CALL printchar CALL change_mode MOVLW ' ' BTFSC mr_tmp,1 CALL printchar CLRF mr_len CLRF mr_cod CALL follow goto decode_loop check_switch BTFSS PORTA,1 GOTO check_switch0 BSF sw_prev,0 RETURN check_switch0 BTFSS sw_prev,0 RETURN BCF sw_prev,0 BTFSS mr_auto,0 GOTO check_switch_manu BTFSS mr_mod,0 GOTO check_switch_auto_eng BCF mr_auto,0 BCF mr_mod,0 CALL printall RETURN check_switch_auto_eng BCF mr_auto,0 BSF mr_mod,0 CALL printall RETURN check_switch_manu BTFSS mr_mod,0 GOTO check_switch_manu_eng BSF mr_auto,0 BSF mr_mod,0 CALL printall RETURN check_switch_manu_eng BSF mr_auto,0 BCF mr_mod,0 CALL printall RETURN follow BCF STATUS,C RRF mr_len0,W SUBWF mr_len1,W BTFSS STATUS,C GOTO follow_update BCF STATUS,C RRF mr_len1,W SUBWF mr_len0,W BTFSS STATUS,C GOTO follow_update RETURN follow_update MOVF mr_len1,W MOVWF mr_lent MOVF mr_len0,W ADDWF mr_lent,F RRF mr_lent,F MOVF mr_thr,W ADDWF mr_lent,F RRF mr_lent,W MOVWF mr_thr BCF STATUS,C RLF mr_thr,W MOVWF mr_thr2 BCF STATUS,C RRF mr_thr,W ADDWF mr_thr2,F RETURN wait_break CALL check_switch CALL wait5ms_beep BTFSS PORTA,0 GOTO wait_break RETURN wait_mark CALL check_switch CALL wait5ms_silent BTFSC PORTA,0 GOTO wait_mark RETURN count_mark CLRF mr_cnt count_mark1 BTFSC PORTA,0 GOTO count_mark2 CALL wait5ms_beep CALL check_switch INCF mr_cnt,F MOVF mr_cnt,W SUBLW 0FFh BTFSC STATUS,Z GOTO count_mark2 GOTO count_mark1 count_mark2 MOVF mr_len0,W MOVWF mr_len1 MOVF mr_cnt,W MOVWF mr_len0 SUBWF mr_thr,W BTFSS STATUS,C RETLW 01h RETLW 00h count_break CLRF mr_cnt count_break1 BTFSS PORTA,0 GOTO count_break2 CALL wait5ms_silent CALL check_switch INCF mr_cnt,F MOVF mr_cnt,W SUBLW 0FFh BTFSC STATUS,Z GOTO count_break2 GOTO count_break1 count_break2 MOVF mr_cnt,W SUBWF mr_thr2,W BTFSS STATUS,C RETLW 03h MOVF mr_cnt,W SUBWF mr_thr,W BTFSS STATUS,C RETLW 01h RETLW 00h change_mode ; Automatic Code-set Selection BTFSS mr_auto,0 RETURN MOVF mr_prevchar,W BTFSS mr_mod,0 GOTO change_mode_cur_en SUBLW '(' BTFSS STATUS,Z GOTO change_mode_cur_en BCF mr_mod,0 change_mode_cur_en MOVF mr_prevchar,W SUBLW ')' BTFSS STATUS,Z GOTO change_mode_nop0 BSF mr_mod,0 change_mode_nop0 MOVF mr_prevchar,W SUBLW 05h ; HO-RE BTFSS STATUS,Z GOTO change_mode_nop1 BSF mr_mod,0 change_mode_nop1 RETURN printchar MOVWF chrtmp MOVF chrpos,W ADDLW 040h MOVWF FSR MOVF chrtmp,W MOVWF INDF INCF chrpos,F BTFSS chrpos,3 GOTO printchar_1 CALL scrolllines printchar_1 CALL printall RETURN scrolllines MOVLW 040h MOVWF FSR scrolllines_loop MOVF INDF,W MOVWF chrtmp MOVLW ' ' MOVWF INDF MOVLW 08h ADDWF FSR,F MOVF chrtmp,W MOVWF INDF MOVLW 0F9h ADDWF FSR,F BTFSS FSR,3 GOTO scrolllines_loop CLRF chrpos RETURN printall MOVLW 080h CALL lcdpos MOVLW 048h MOVWF FSR printall_loop1 MOVF INDF,W CALL lcdchar INCF FSR,F BTFSC FSR,3 GOTO printall_loop1 MOVLW 0C0h CALL lcdpos MOVLW 040h MOVWF FSR printall_loop2 MOVF INDF,W CALL lcdchar INCF FSR,F BTFSS FSR,3 GOTO printall_loop2 MOVLW 0C7h CALL lcdpos BTFSS mr_auto,0 GOTO printall_manual MOVLW 06h BTFSC mr_mod,0 MOVLW 07h CALL lcdchar printall_manual MOVLW 'a' BTFSC mr_mod,0 MOVLW 0A8h CALL lcdchar RETURN wait1260us_beep BSF PORTA,2 CALL wait630us BCF PORTA,2 CALL wait630us RETURN wait1260us_silent BCF PORTA,2 CALL wait630us CALL wait630us NOP RETURN wait5ms_beep BSF PORTA,2 CALL wait630us BCF PORTA,2 CALL wait630us BSF PORTA,2 CALL wait630us BCF PORTA,2 CALL wait630us BSF PORTA,2 CALL wait630us BCF PORTA,2 CALL wait630us BSF PORTA,2 CALL wait630us BCF PORTA,2 CALL wait630us RETURN wait5ms_silent BCF PORTA,2 CALL wait630us CALL wait630us CALL wait630us CALL wait630us CALL wait630us CALL wait630us CALL wait630us CALL wait630us NOP NOP NOP NOP NOP NOP NOP RETURN wait70us MOVLW d'56' MOVWF cnt70us NOP NOP wait70us_loop DECFSZ cnt70us, f GOTO wait70us_loop RETURN wait630us CALL wait70us CALL wait70us CALL wait70us CALL wait70us CALL wait70us CALL wait70us CALL wait70us CALL wait70us CALL wait70us RETURN wait1ms ; Wait 999.8us MOVLW d'14' MOVWF cnt1ms NOP NOP NOP NOP NOP NOP NOP wait1ms_loop CALL wait70us DECFSZ cnt1ms, f GOTO wait1ms_loop RETURN wait10ms ; Wait10ms CALL wait1ms CALL wait1ms CALL wait1ms CALL wait1ms CALL wait1ms CALL wait1ms CALL wait1ms CALL wait1ms CALL wait1ms CALL wait1ms NOP NOP RETURN wait40ms CALL wait10ms CALL wait10ms CALL wait10ms CALL wait10ms RETURN wait200ms CALL wait40ms CALL wait40ms CALL wait40ms CALL wait40ms CALL wait40ms RETURN lcdwrite MOVWF PORTB NOP NOP NOP BSF PORTB,6 NOP NOP NOP BCF PORTB,6 NOP NOP NOP RETURN lcdchar MOVWF charbuf SWAPF charbuf,W ANDLW 00Fh IORLW 020h CALL lcdwrite CALL wait70us MOVF charbuf,W ANDLW 00Fh IORLW 020h CALL lcdwrite CALL wait70us RETURN lcdpos MOVWF charbuf SWAPF charbuf,W ANDLW 00Fh CALL lcdwrite CALL wait70us MOVF charbuf,W ANDLW 00Fh CALL lcdwrite CALL wait70us RETURN lcdinit CALL wait10ms CALL wait10ms CALL wait10ms MOVLW 002h CALL lcdwrite MOVLW 002h CALL lcdwrite MOVLW 008h CALL lcdwrite CALL wait70us MOVLW 000h CALL lcdwrite MOVLW 00Dh CALL lcdwrite CALL wait70us MOVLW 000h CALL lcdwrite MOVLW 001h CALL lcdwrite CALL wait1ms CALL wait1ms MOVLW 000h CALL lcdwrite MOVLW 006h CALL lcdwrite CALL wait1ms CALL wait1ms CALL wait1ms MOVLW 040h CALL lcdpos ; WI 00h MOVLW B'00000010' CALL lcdchar MOVLW B'00011111' CALL lcdchar MOVLW B'00001010' CALL lcdchar MOVLW B'00001010' CALL lcdchar MOVLW B'00011111' CALL lcdchar MOVLW B'00000010' CALL lcdchar MOVLW B'00000010' CALL lcdchar MOVLW B'00000000' CALL lcdchar ; WE 01h MOVLW B'00000000' CALL lcdchar MOVLW B'00011111' CALL lcdchar MOVLW B'00000001' CALL lcdchar MOVLW B'00000101' CALL lcdchar MOVLW B'00000100' CALL lcdchar MOVLW B'00000100' CALL lcdchar MOVLW B'00011111' CALL lcdchar MOVLW B'00000000' CALL lcdchar ; B-T 02h MOVLW B'00011000' CALL lcdchar MOVLW B'00010100' CALL lcdchar MOVLW B'00011000' CALL lcdchar MOVLW B'00010100' CALL lcdchar MOVLW B'00011000' CALL lcdchar MOVLW B'00000111' CALL lcdchar MOVLW B'00000010' CALL lcdchar MOVLW B'00000010' CALL lcdchar ; V-A 03h MOVLW B'00010100' CALL lcdchar MOVLW B'00010100' CALL lcdchar MOVLW B'00010100' CALL lcdchar MOVLW B'00001000' CALL lcdchar MOVLW B'00000010' CALL lcdchar MOVLW B'00000101' CALL lcdchar MOVLW B'00000111' CALL lcdchar MOVLW B'00000101' CALL lcdchar ; RA-TA 04h MOVLW B'00011100' CALL lcdchar MOVLW B'00000000' CALL lcdchar MOVLW B'00011100' CALL lcdchar MOVLW B'00000100' CALL lcdchar MOVLW B'00001111' CALL lcdchar MOVLW B'00000101' CALL lcdchar MOVLW B'00001011' CALL lcdchar MOVLW B'00000010' CALL lcdchar ; HO-RE 05h MOVLW B'00000100' CALL lcdchar MOVLW B'00011111' CALL lcdchar MOVLW B'00000100' CALL lcdchar MOVLW B'00010101' CALL lcdchar MOVLW B'00000000' CALL lcdchar MOVLW B'00001000' CALL lcdchar MOVLW B'00001001' CALL lcdchar MOVLW B'00001110' CALL lcdchar ; REV a 06h MOVLW B'00011111' CALL lcdchar MOVLW B'00011111' CALL lcdchar MOVLW B'00010011' CALL lcdchar MOVLW B'00011101' CALL lcdchar MOVLW B'00010001' CALL lcdchar MOVLW B'00001101' CALL lcdchar MOVLW B'00010000' CALL lcdchar MOVLW B'00011111' CALL lcdchar ; REV kana-I 07h MOVLW B'00011111' CALL lcdchar MOVLW B'00011111' CALL lcdchar MOVLW B'00011101' CALL lcdchar MOVLW B'00011011' CALL lcdchar MOVLW B'00010011' CALL lcdchar MOVLW B'00001011' CALL lcdchar MOVLW B'00011011' CALL lcdchar MOVLW B'00011111' CALL lcdchar CALL wait1ms RETURN decode BCF STATUS,C MOVF mr_len,W SUBLW d'9' BTFSS STATUS,C GOTO code10 BCF STATUS,C RLF mr_cod,F BTFSC mr_mod,0 INCF mr_cod,F MOVF mr_cod,W MOVWF chrjump MOVLW high decode_t MOVWF PCLATH MOVF mr_len,W ADDLW low decode_t BTFSC STATUS,C INCF PCLATH,F MOVWF PCL decode_t GOTO code0 GOTO code1 GOTO code2 GOTO code3 GOTO code4 GOTO code5 GOTO code6 GOTO code7 GOTO code8 GOTO code9 code0 RETLW 0EBh code1 MOVLW high code1_t MOVWF PCLATH MOVF chrjump,W ADDLW low code1_t BTFSC STATUS,C INCF PCLATH,F MOVWF PCL code1_t DT 'E',0CDh,'T',0D1h code2 MOVLW high code2_t MOVWF PCLATH MOVF chrjump,W ADDLW low code2_t BTFSC STATUS,C INCF PCLATH,F MOVWF PCL code2_t DT 'I',0DEh,'A',0B2h,'N',0C0h,'M',0D6h code3 MOVLW high code3_t MOVWF PCLATH MOVF chrjump,W ADDLW low code3_t BTFSC STATUS,C INCF PCLATH,F MOVWF PCL code3_t DT 'S',0D7h,'U',0B3h,'R',0C5h,'W',0D4h,'D',0CEh,'K',0DCh,'G',0D8h,'O',0DAh code4 MOVLW high code4_t MOVWF PCLATH MOVF chrjump,W ADDLW low code4_t BTFSC STATUS,C INCF PCLATH,F MOVWF PCL code4_t DT 'H',0C7h,'V',0B8h,'F',0C1h,0EBh,0C9h,'L',0B6h,0EBh,0DBh,'P',0C2h,'J',0A6h DT 'B',0CAh,'X',0CFh,'C',0C6h,'Y',0B9h,'Z',0CCh,'Q',0C8h,0EBh,0BFh,0EBh,0BAh code5 MOVLW high code5_t MOVWF PCLATH MOVF chrjump,W ADDLW low code5_t BTFSC STATUS,C INCF PCLATH,F MOVWF PCL code5_t DT '5','5','4','4',0EBh,004h,'3','3',0EBh,0C4h,0EBh,0D0h,0EBh,0DFh,'2','2' DT 0EBh,0B5h,0EBh,000h,'+',0DDh,0EBh,0C3h,0EBh,001h,0EBh,0B0h,0EBh,0BEh,'1','1' DT '6','6',002h,0D2h,'/',0D3h,0EBh,0D5h,0EBh,0B7h,0EBh,0BBh,'(',0D9h,0EBh,0B4h DT '7','7',0EBh,0CBh,0EBh,0BCh,0EBh,0B1h,'8','8',0EBh,0BDh,'9','9','0','0' code6 MOVLW high code6_t MOVWF PCLATH MOVF chrjump,W ADDLW low code6_t BTFSC STATUS,C INCF PCLATH,F MOVWF PCL code6_t ;00 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f DT 0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,003h,0EBh,0EBh,0EBh,0EBh,0EBh DT 0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh, '?', '?',0EBh,0EBh,0EBh,0EBh,0EBh,0EBh ;20 DT 0EBh,0EBh,0EBh,0EBh, ')', ')',0EBh,0EBh,0EBh,0A3h, '.',0A4h,0EBh,0EBh,0EBh,0EBh DT 0EBh,0EBh,0EBh,0EBh, '@',0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh ;40 DT 0EBh,0EBh, '-', '-',0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,005h,005h DT 0EBh,0EBh,0EBh,0EBh,0EBh,0EBh, '!', '!',0EBh,0EBh, ')', '(',0EBh,0EBh,0EBh,0EBh ;60 DT 0EBh,0EBh,0EBh,0EBh,0EBh,0EBh, ',',0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh DT 0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh,0EBh code7 RETLW 0EBh code8 RETLW 0FFh code9 RETLW 0EFh code10 RETLW 0EBh END