DTMF Asm
DTMF Asm
com ; RELEASED UNDER GNU PUBLIC LICENSE ; ; SOFTWARE DTMF DECODER ; modified Goertzel algorithm ; timer 2 used to generate interupts at 9765.625hz ; PWM1 output at 19531.25hz NOT USED ; ; ; Use 255 samples table ; FOR 16F87X / 20 Mhz ; F sample = 5000000/512 hz = 9765. 625 hz ; ; ; RC0 BEEP OUT ; RC1 DTMF Signal Input - Schmitt trigger ; RC2 PWM1 OUT/ not used ; RC3 HOOK ON OUT ; ; RB0 = OUTPUT1 ; RB1 = OUTPUT2 ; RB2 = OUTPUT3 ; RB3 = OUTPUT4 ; ; #PASS#1-4#0-1## SET OUTPUT ; #PASS#1-4## VERIFY OUTPUT ; #PASS#NEWPASS#NEWPASS## CHANGE PASS ; PASS IS 10 DIGITS LONG ; ; ; ; ;Started 9/1/02 ; ; ; ; #include <p16f877.inc> Bank0: MACRO bcf STATUS, bcf STATUS, ENDM Bank1: MACRO bsf STATUS, bcf STATUS, ENDM Bank2: MACRO bcf STATUS, bsf STATUS, ENDM Bank3: MACRO bsf STATUS, bsf STATUS, ENDM RP0 RP1 RP0 RP1 RP0 RP1 RP0 RP1
;**************************** ; ;User Variables ; ;**************************** COUNT EQU H'27' RESULT EQU H'28' FLAGS EQU H'29' EE_Byte EQU H'2A' ;2b ;2c ;2e ;2f A697SIN A697COS A770SIN A770COS A852SIN A852COS A941SIN A941COS A1209SIN A1209COS A1336SIN A1336COS A1447SIN A1447COS A1633SIN A1633COS EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU H'30' H'31' H'32' H'33' H'34' H'35' H'36' H'37' 0X38 0X39 0X3A 0X3B 0X3C 0X3D 0X3E 0X3F
SAMPLEBIT EQU 0X40 FSR_SAVE_DTMF EQU 0X41 ; DTMF START ROUTINE TEMP TEMP_VAL EQU 0X42 TABLECOUNTER EQU 0X43 TEMP_TIMES EQU 0X44 LOWTEMPLATE EQU 0X45 HIGHTEMPLATE EQU 0X46 BYTE EQU 0X47 RESULT1 EQU 0X48 ; DECODED DIGIT OR 0 PCLATH_SAVE EQU 0X49 W_TEMP EQU 0X4A STATUS_TEMP EQU 0X4B FSR_SAVE EQU 0X4C TIME0 EQU 0X4D ;TIMEOUT LSB TIME1 EQU 0X4E TIME2 EQU 0X4F ;TIMEOUT MSB #DEFINE DONE FLAGS,0 #DEFINE TIMEOUT FLAGS,1 #DEFINE BEEP FLAGS,2 ; Utility routines variables CBLOCK 0x50 scrA: 1 ; scratch pad 0X50 scrB: 1 scrC: 1 scrD: 1 count_1:1 ; counter lsb count_2:1
count_3:1 count_4:1 dig_10: 1 dig_9: 1 dig_8: 1 dig_7: 1 dig_6: 1 dig_5: 1 dig_4: 1 dig_3: 1 dig_2: 1 dig_1: 1 dig_0: 1 PSS0: PSS1: PSS2: PSS3: PSS4: PSS5: PSS6: PSS7: PSS8: PSS9: 1 1 1 1 1 1 1 1 1 1
; ; ; ; ; ; ; ; ; ; ; ;
counter msb display digit display digit display digit display digit display digit display digit display digit display digit display digit display digit end of string
10 9 8 7 6 5 4 3 2 1 0 0X62
;PASSWORD ;PASSWORD ;PASSWORD ;PASSWORD ;PASSWORD ;PASSWORD ;PASSWORD ;PASSWORD ;PASSWORD ;PASSWORD
ENDC CBLOCK comA: comB: comC: comD: ENDC 0x72 1 1 1 1 ; variables for all the RAM pages
;*********************************************** ;EEprom Variables ;*********************************************** OUT0 EQU 0X0 PASS0 PASS1 PASS2 PASS3 PASS4 PASS5 PASS6 PASS7 PASS8 PASS9 EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU ORG DE DE 0X8 0X9 0XA 0XB 0XC 0XD 0XE 0XF 0X10 0X11 h'2100' ;EEPROM INITIAL VALUES 0,0,0,0,0,0,0,0 "1234567890"
;************************************************
ORG 0X00 NOP NOP CLRF STATUS ; ENSURE BANK0 GOTO START ;GOTO STARTPLUS INTERRUPT_VECTOR ORG 0X04 ;**************************** ; ; CONTEXT SAVE ; ;**************************** C_SAVE MOVWF W_TEMP SWAPF STATUS,W CLRF STATUS MOVWF STATUS_TEMP MOVF MOVWF MOVF MOVWF BTFSS GOTO BCF PCLATH,W PCLATH_SAVE FSR, W FSR_SAVE PIR1,TMR2IF C_RESTORE PIR1,TMR2IF ; Exit ISR if it wasn't a TMR2 Overflow ; RESET TIMER 2 INT FLAG
BTFSC TIMEOUT ; CHECK IF NOT TIMEOUT GOTO CONTIN1 ; DECREMENT TIMEOUT COUNTER DECF TIME0, F BTFSS STATUS, Z GOTO CONTIN1 ; TIME0<>0 DECF TIME1, F BTFSS STATUS, Z GOTO CONTIN1 ; TIME1<>0 BSF TIMEOUT ; SET TIMEOUT=TRUE CONTIN1: ; BEEP COUNTER BTFSS BEEP ; CHECK IF NOT BEEP GOTO CONTIN2 DECF scrA,F BTFSS STATUS, Z GOTO CONTIN2 movlw 1 xorwf PORTC, F ; flip port C0 MOVF TIME2, W ; RELOAD DELAY MOVWF scrA CONTIN2: BTFSC GOTO DONE C_RESTORE ; Skip if done
;*****************************
;TEST LEVEL of RC1 and set BYTE CLRF BTFSS GOTO PIN_HIGH COMF CONTINUE BYTE PORTC, 1 CONTINUE BYTE, F
;***************************** ; ;Get the expected Lowband Bits ; ;***************************** MOVLW LOW LOWBAND ADDWF TABLECOUNTER,W MOVLW HIGH LOWBAND BTFSC STATUS,C ADDLW 1 MOVWF PCLATH MOVF CALL TABLECOUNTER,W LOWBAND
CLRF PCLATH MOVWF LOWTEMPLATE MOVF BYTE,W XORWF LOWTEMPLATE, F ; APPLY INPUT OVER MASK ;***************************** ; ;Get the expected Highband Bits ; ;***************************** MOVLW LOW HIGHBAND ADDWF TABLECOUNTER,W MOVLW HIGH HIGHBAND BTFSC STATUS,C ADDLW 1 MOVWF PCLATH MOVF CALL TABLECOUNTER,W HIGHBAND
CLRF PCLATH MOVWF HIGHTEMPLATE MOVF BYTE,W XORWF HIGHTEMPLATE, F ; APPLY INPUT OVER MASK ;******************************* ; ; LOWTEMPLATE AND HIGHTEMPLATE ; CONTAIN THE EXPECTED VALUES ; FOR THE INCOMING BIT ; ;******************************* MOVLW MOVWF MOVLW MOVWF LOW A697SIN FSR 8 SAMPLEBIT ;ACCUMULATOR ADDR
COMPAREBITL RLF BTFSS GOTO DECF GOTO MATCHL INCF CONTINL INCF DECFSZ GOTO MOVLW MOVWF MOVLW MOVWF COMPAREBITH RLF BTFSS GOTO DECF GOTO MATCHH INCF CONTINH INCF DECFSZ GOTO
LOWTEMPLATE,F STATUS,C MATCHL INDF,F CONTINL INDF,F FSR,F SAMPLEBIT,F COMPAREBITL LOW A1209SIN FSR 8 SAMPLEBIT HIGHTEMPLATE,F STATUS,C MATCHH INDF,F CONTINH INDF,F FSR,F SAMPLEBIT,F COMPAREBITH
;******************************** ; ; Increment Tablecounter 0..255 ; ;******************************** INCF MOVF XORLW max 7f) BTFSS STATUS,Z GOTO C_RESTORE BSF DONE ; DTMF DECISION ALGORITHM ; compute absolute value acc = ABS(acc) MOVLW H'30' MOVWF FSR TESTFORNEG BTFSC INDF,7 GOTO NEG GOTO NEXT NEG ; SUBTRACT F FROM 0 MOVF SUBLW MOVWF NEXT INCF FSR,F INDF,W 0 INDF TABLECOUNTER,F TABLECOUNTER,W D'255' ;This is the number of samples to test against (
; add acumulator results for sin and cos MOVLW MOVWF MORERESULTS MOVF CLRF INCF ADDWF MOVF INCF XORLW BTFSS GOTO H'30' FSR INDF,W INDF FSR,F INDF,F FSR,W FSR,F H'3F' STATUS,Z MORERESULTS
; compare acc with 64 of 255 MOVLW MOVWF TEMPX1 MOVF INDF,W SUBLW D'64' ;THRESHOLD RRF RESULT,F INCF FSR,F INCF FSR,F MOVF FSR,W XORLW 0X41 BTFSS STATUS,Z GOTO TEMPX1 COMF RESULT,F ; RESULT IS 1633/1477/1336/1209/941/852/770/697 FOR VALUE>64 ; DECISION ALGORITHM : A VALUE MUST BE DETECTED AT LEAST 2-3 TIMES ; BEFORE IS CONSIDERED VALID / MOVF XORWF BTFSC GOTO CLRF MOVF MOVWF GOTO DECI1 MOVLW 0XFF XORWF TEMP_TIMES,W BTFSC STATUS,Z GOTO CLEANUP INCF TEMP_TIMES, F DECI3 MOVLW XORWF BTFSS .1 TEMP_TIMES,W STATUS,Z ; 2 TIMES DETECTED -1 ; COMPARE TEMP_TIMES/255 ; ==255, START AGAIN ; <> 255, INC TEMP_TIMES RESULT, W TEMP_VAL,W STATUS, Z DECI1 TEMP_TIMES RESULT,W TEMP_VAL CLEANUP ; COMPARE RESULT WITH TEMP_VAL ; == ; TEMP_TIMES = 0 ; TEMP_VAL = RESULT ; START AGAIN 0X31 FSR
GOTO CLEANUP ; <> START AGAIN ; GOT ONE VALUE 2 TIMES !!!!!!!!!!! CLRW XORWF TEMP_VAL, W ; COMPARE TEMP_VAL / 0 BTFSC STATUS,Z GOTO CLEANUP ; ==0, START AGAIN DECI2 ; <>0 ;********************************************** ; GOT ONE CHARACTER, CONVERT IT TO ASCII.... ;********************************************** MOVF XORLW BTFSC GOTO MOVF XORLW BTFSC GOTO MOVF XORLW BTFSC GOTO MOVF XORLW BTFSC GOTO MOVF XORLW BTFSC GOTO MOVF XORLW BTFSC GOTO MOVF XORLW BTFSC GOTO MOVF XORLW BTFSC GOTO MOVF XORLW BTFSC GOTO MOVF XORLW BTFSC GOTO MOVF XORLW BTFSC GOTO MOVF XORLW BTFSC GOTO RESULT,W D'17' STATUS,Z GOTCHA1 RESULT,W D'33' STATUS,Z GOTCHA2 RESULT,W D'65' STATUS,Z GOTCHA3 RESULT,W D'18' STATUS,Z GOTCHA4 RESULT,W D'34' STATUS,Z GOTCHA5 RESULT,W D'66' STATUS,Z GOTCHA6 RESULT,W D'20' STATUS,Z GOTCHA7 RESULT,W D'36' STATUS,Z GOTCHA8 RESULT,W D'68' STATUS,Z GOTCHA9 RESULT,W D'40' STATUS,Z GOTCHA0 RESULT,W D'72' STATUS,Z GOTCHAPOUND RESULT,W D'24' STATUS,Z GOTCHASTAR
; GOT ONLY TRASH... CLRF TEMP_TIMES GOTO CLEANUP ; CONVERT ASCII GOTCHAPOUND MOVLW GOTO GOTCHASTAR MOVLW GOTO GOTCHA1 MOVLW GOTO GOTCHA2 MOVLW GOTO GOTCHA3 MOVLW GOTO GOTCHA4 MOVLW GOTO GOTCHA5 MOVLW GOTO GOTCHA6 MOVLW GOTO GOTCHA7 MOVLW GOTO GOTCHA8 MOVLW GOTO GOTCHA9 MOVLW GOTO GOTCHA0 MOVLW GOTO SENDIT MOVWF GOTO CLEANUP MOVLW MOVWF TEMPXX INCF CLRF MOVF XORLW BTFSS GOTO FSR,F INDF FSR,W 0X3F STATUS,Z TEMPXX 0X2F FSR ; start -1 RESULT1 C_RESTORE ; PLACE RECEIVED CHAR IN RESULT1 H'23' SENDIT H'2A' SENDIT H'31' SENDIT H'32' SENDIT H'33' SENDIT H'34' SENDIT H'35' SENDIT H'36' SENDIT H'37' SENDIT H'38' SENDIT H'39' SENDIT H'30' SENDIT
CLRF BCF
TABLECOUNTER DONE
;******************************** ; ; Context Restore ; ;******************************** C_RESTORE CLRF MOVF MOVWF MOVF MOVWF SWAPF MOVWF SWAPF SWAPF RETFIE STATUS FSR_SAVE,W FSR PCLATH_SAVE,W PCLATH STATUS_TEMP,W STATUS W_TEMP,F W_TEMP,W ;ENSURE BANK0 RESTORE
; RESTORE PCLATH
START call call STARTPLUS ; INIT MOVLW CALL ANDLW MOVWF Bank1 MOVLW MOVWF Bank0 BCF BCF CLRF CLRF CLRF BSF INIT clrf PORTC movlw B'11110011' BANKSEL TRISC movwf TRISC BANKSEL T2CON MOVLW B'00001100' e MOVWF T2CON ; CLEAR PORTC ;port C0=Input for now/out, C1=INPUT, C2,3 OUT init_disp cur_h1
PORTB OUTPUTS FROM EEPROM LOW OUT0 EE_READ_BYTE 0X0F ; MASK THE LOW 4 BITS PORTB ; SET OUTPUTS 0XF0 TRISB TIMEOUT BEEP TIME0 TIME1 TIME2 DONE ; PORT B 0-3 OUTPUTS ; KEEP THE TIMEOUT STOPPED ; SILENCE... ; INIT TIMEOUT COUNTER ; DO NOT START DTMF DETECTOR.... ; INIT ROUTINE
BANKSEL PR2 MOVLW 0XFF MOVWF PR2 BANKSEL BCF BANKSEL BSF BANKSEL BSF BSF BANKSEL MOVLW MOVWF BANKSEL BCF BANKSEL MOVLW MOVWF PIR1 PIR1,TMR2IF PIE1 PIE1,TMR2IE INTCON INTCON,PEIE INTCON,GIE CCP1CON B'00001100' CCP1CON TRISC TRISC,2 CCPR1L .128 CCPR1L
; CLEAR TIMER 2 INT FLAG ; START INT FOR TIMER 2 ; START PERIPHERAL INT ; START GLOBAL INT
CLRF TEMP_VAL CLRF TEMP_TIMES CLRF COUNT ; NR CHAR FOR DISPLAY CALL TESTPASS ; PRINT PASS ; TO STOP DTMF DETECTOR - BSF DONE ; TO START DTMF DETECTOR - CALL START_DTMF CALL BEEPOK CALL BEEPERR ;********************************* ; MAIN LOOP ;********************************* ; FIRSRT READ #PASS#, WHERE PASS HAS 10 DIGITS MAINDTMF: CALL START_DTMF CALL CLRTIMEOUT MAIN0: BTFSC TIMEOUT GOTO TIMEO1 ; TIMEOUT ERROR, NO SOUND, HANG UP LINE ; FIRST WAIT A DIGIT BTFSS DONE GOTO MAIN0 ; WE GOT A DIGIT, COMPARE WITH # MOVLW '#' ; WAIT # XORWF RESULT1,W BTFSS STATUS,Z GOTO MAINDTMF ; DIGIT<>#, TRY AGAIN ; debug call cur_h1 movf RESULT1,w call send_c ; end debug BSF CALL CALL PORTC,3 START_DTMF CLRTIMEOUT ; BEEP ON ; GET A NEW DIGIT ; START TIMEUOT
BTFSC TIMEOUT GOTO TIMEO ; WAIT A DIGIT BTFSS DONE GOTO MAIN1 MOVF RESULT1,W MOVWF INDF ;debug call send_c ;end debug DECF EE_Byte,F BTFSC STATUS,Z GOTO MAIN21 INCF FSR,F CALL START_DTMF CALL CLRTIMEOUT GOTO MAIN1 MAIN21: CALL START_DTMF CALL CLRTIMEOUT MAIN2: BTFSC TIMEOUT GOTO TIMEO ; WAIT A DIGIT BTFSS DONE GOTO MAIN2 MOVLW '#' XORWF RESULT1,W BTFSS STATUS,Z GOTO MAINDTMF ;debug movf RESULT1,w call send_c ;end debug ; COMPARE PASSWORD MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MAIN5: MOVF EE_Byte,W CALL EE_READ_BYTE XORWF INDF,W BTFSC STATUS,Z GOTO MAIN3 ; PASS BAD CALL BEEPERR GOTO MAINDTMF MAIN3: DECF BTFSC scrA,F STATUS,Z LOW PASS0 EE_Byte LOW PSS0 FSR .10 scrA
; GOT 10 DIGITS
; ; ;
; W= EEPROM DIGIT
;CALL BEEPOK ; PASS OK ; READ 3 DIGITS IN PSS 0,1,2 CALL START_DTMF ; GET A NEW DIGIT CALL CLRTIMEOUT ; START TIMEUOT MOVLW LOW PSS0 ; POINTER RAM MOVWF FSR MOVLW .3 ; READ ONLY 3 DIGITS MOVWF EE_Byte ; COUNTER MAIN6: BTFSC TIMEOUT GOTO TIMEO ; WAIT A DIGIT BTFSS DONE GOTO MAIN6 MOVF RESULT1,W MOVWF INDF ;debug call send_c ;end debug DECF EE_Byte,F BTFSC STATUS,Z GOTO MAIN7 INCF FSR,F CALL START_DTMF CALL CLRTIMEOUT GOTO MAIN6 MAIN7: ; TIMEOUT ERROR, RESTART
; GOT 10 DIGITS
; GOT 3 DIGITS ; IF PSS 1,2 = ## THEN #PASS#1-4## = VERIFY MOVLW '#' XORWF PSS1,W BTFSS STATUS,Z GOTO NOVERIFY MOVLW '#' XORWF PSS2,W BTFSS STATUS,Z GOTO NOVERIFY VERIFY: ; VERIFY COMMAND ;********************************************************************** ; CHECK PSS0 FOR 1-4 --> 31,32,33,34 MOVLW '1' XORWF PSS0,W BTFSC STATUS,Z GOTO VERIFY1 MOVLW '2' XORWF PSS0,W BTFSC STATUS,Z GOTO VERIFY1 MOVLW '3' XORWF PSS0,W BTFSC STATUS,Z GOTO VERIFY1 MOVLW '4' XORWF PSS0,W BTFSC STATUS,Z
GOTO VERIFY1 GOTO TIMEO VERIFY1: ; EXECUTE VERIFY COMMAND MOVLW .1 MOVWF PSS1 ; PSS1 TEMP MOVLW '0' SUBWF PSS0, F ;SUBSTRACT PSS0-W = 0-3 VERIFY2: DECF PSS0, F BTFSC STATUS,Z GOTO VERIFY3 ; READY BCF STATUS,C RLF PSS1,F GOTO VERIFY2 VERIFY3: MOVLW LOW OUT0 CALL EE_READ_BYTE ; RETRIEVE VALUES FROM EEPROM ANDWF PSS1,W ; AND MASK BTFSC STATUS,Z GOTO VERIFYOFF VERIFYON: CALL BEEPOK ; OUTPUT = 1 GOTO MAINDTMF VERIFYOFF: CALL BEEPERR GOTO MAINDTMF NOVERIFY: ; GET PSS3,4 CALL START_DTMF CALL CLRTIMEOUT MOVLW LOW PSS3 MOVWF FSR MOVLW .2 MOVWF EE_Byte MAIN8: BTFSC TIMEOUT GOTO TIMEO ; WAIT A DIGIT BTFSS DONE GOTO MAIN8 MOVF RESULT1,W MOVWF INDF ;debug call send_c ;end debug DECF EE_Byte,F BTFSC STATUS,Z GOTO MAIN9 INCF FSR,F CALL START_DTMF CALL CLRTIMEOUT GOTO MAIN8 MAIN9: ; GOT PSS3,4 ; IF PSS 3,4 = ## THEN #PASS#1-4#0-1## = SET MOVLW '#' XORWF PSS3,W BTFSS STATUS,Z
; GET A NEW DIGIT ; START TIMEUOT ; POINTER RAM ; READ ONLY 2 DIGITS ; COUNTER ; TIMEOUT ERROR, RESTART
; GOT 10 DIGITS
XSET: ; SET COMMAND ;********************************************************************** ; CHECK PSS1 FOR # MOVLW '#' XORWF PSS1,W BTFSS STATUS,Z GOTO TIMEO ; CHECK PSS0 FOR 1-4 --> 31,32,33,34 MOVLW '1' XORWF PSS0,W BTFSC STATUS,Z GOTO XSET1 MOVLW '2' XORWF PSS0,W BTFSC STATUS,Z GOTO XSET1 MOVLW '3' XORWF PSS0,W BTFSC STATUS,Z GOTO XSET1 MOVLW '4' XORWF PSS0,W BTFSC STATUS,Z GOTO XSET1 GOTO TIMEO XSET1: ; CHECK PSS2 FOR 0-1 --> 30,31 MOVLW '0' XORWF PSS2,W BTFSC STATUS,Z GOTO XSET2 MOVLW '1' XORWF PSS2,W BTFSC STATUS,Z GOTO XSET2 GOTO TIMEO XSET2: ; EXECUTE SET COMMAND MOVLW .1 MOVWF PSS1 MOVLW '0' SUBWF PSS0, F SET2: DECF PSS0, F BTFSC STATUS,Z GOTO SET1 BCF STATUS,C RLF PSS1,F GOTO SET2 SET1: ; PSS1 HAS THE DESIERED MOVLW SUBWF BTFSC '0' PSS2, F STATUS,Z
; READY
GOTO SETSET:
SETRESET ; RETRIEVE VALUES FROM EEPROM ; OR MASK ; OUTPUT THE NEW VALUE ; WRITE THE NEW VALUE TO EEPROM ; BEEP HAPPY... ; RESTART ; COMPLEMENT MASK ; RETRIEVE VALUES FROM EEPROM ; OR MASK ; OUTPUT THE NEW VALUE ; WRITE THE NEW VALUE TO EEPROM ; BEEP HAPPY... ; RESTART
MOVLW LOW OUT0 CALL EE_READ_BYTE IORWF PSS1,W MOVWF PORTB MOVWF EE_Byte MOVLW LOW OUT0 CALL EE_WRITE_BYTE CALL BEEPOK GOTO MAINDTMF SETRESET: COMF PSS1,F MOVLW LOW OUT0 CALL EE_READ_BYTE ANDWF PSS1,W MOVWF PORTB MOVWF EE_Byte MOVLW LOW OUT0 CALL EE_WRITE_BYTE CALL BEEPOK GOTO MAINDTMF NOSET: ; CHECK FOR PASS CHANGE ; GET PSS5,10 CALL START_DTMF CALL CLRTIMEOUT MOVLW LOW PSS5 MOVWF FSR MOVLW .5 MOVWF EE_Byte MAIN10: BTFSC TIMEOUT GOTO TIMEO ; WAIT A DIGIT BTFSS DONE GOTO MAIN10 MOVF RESULT1,W MOVWF INDF ;debug call send_c ;end debug DECF EE_Byte,F BTFSC STATUS,Z GOTO MAIN11 INCF FSR,F CALL START_DTMF CALL CLRTIMEOUT GOTO MAIN10 MAIN11: ; WAIT FOR # CALL START_DTMF CALL CLRTIMEOUT MAIN12: BTFSC TIMEOUT GOTO TIMEO ; WAIT A DIGIT BTFSS DONE
; GET A NEW DIGIT ; START TIMEUOT ; POINTER RAM ; READ ONLY 5 DIGITS ; COUNTER ; TIMEOUT ERROR, RESTART
; GOT 10 DIGITS
; COMPARE # ; DIGIT<>#, RESTART GET A NEW DIGIT START TIMEUOT POINTER RAM 10 DIGIT PASS COUNTER TIMEOUT ERROR, RESTART
; GET 10 DIGITS IN DIG_10...DIG1 CALL START_DTMF ; CALL CLRTIMEOUT ; MOVLW LOW dig_10 ; MOVWF FSR MOVLW .10 ; MOVWF EE_Byte ; MAIN13: BTFSC TIMEOUT GOTO TIMEO ; ; WAIT A DIGIT BTFSS DONE GOTO MAIN13 MOVF RESULT1,W MOVWF INDF ; DECF EE_Byte,F BTFSC STATUS,Z GOTO MAIN14 ; INCF FSR,F CALL START_DTMF CALL CLRTIMEOUT GOTO MAIN13 ; MAIN14: ; WAIT FOR # CALL START_DTMF CALL CLRTIMEOUT MAIN15: ; BTFSC TIMEOUT GOTO TIMEO ; ; WAIT A DIGIT BTFSS DONE GOTO MAIN15 MOVLW '#' ; XORWF RESULT1,W BTFSS STATUS,Z GOTO MAINDTMF ; CALL START_DTMF CALL CLRTIMEOUT MAIN151: BTFSC TIMEOUT GOTO TIMEO ; WAIT A DIGIT BTFSS DONE GOTO MAIN151 MOVLW '#' XORWF RESULT1,W BTFSS STATUS,Z GOTO MAINDTMF ; COMPARE PSS0..9 WITH DIG_10..1 ; COMPARE PASSWORD
MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MAIN16: MOVF MOVWF MOVF MOVWF MOVF MOVWF MOVF MOVWF MOVF
LOW dig_10 EE_Byte LOW PSS0 FSR .10 scrA FSR,W scrB EE_Byte,W FSR INDF, W scrC scrB, W FSR scrC,W
; ; ;
; STORE FSB TEMP ; POINTER TO DIG ; READ DIG ; STORE TEMP DIG ; RESTORE POINTER FOR PSS ; RESTORE DIG VALUE IN W ; COMPARE DIG/PSS
XORWF INDF,W BTFSC STATUS,Z GOTO MAIN17 ; PASS BAD CALL BEEPERR GOTO MAINDTMF MAIN17: DECF scrA,F BTFSC STATUS,Z GOTO MAIN18 INCF EE_Byte,F INCF FSR,F GOTO MAIN16
MAIN18: ;NEW PASS OK, WRITE NEW PASS FROM MOVLW LOW PSS0 MOVWF FSR ; MOVLW .10 MOVWF scrA ; MOVLW LOW PASS0 MOVWF scrB ; MAIN19: MOVF INDF,W ; MOVWF EE_Byte ; MOVF scrB, W ; CALL EE_WRITE_BYTE ; DECF scrA,F BTFSC STATUS,Z GOTO MAIN20 ; INCF scrB,F ; INCF FSR,F GOTO MAIN19 MAIN20: ;debug call cur_h1 call TESTPASS ;end debug CALL BEEPOK GOTO MAINDTMF
PSS0..9 TO EEPROM PASS0..9 FSR POINER RAM PSS0..9 SCRA COUNTER POINTER TO EEPROM READ FROM RAM TO EE_Byte POINTER IN EEPROM WRITE THE BYTE PASS OK, CONTINUE NEXT DIGIT
; PASS CHANGED
;***************************************************************
TIMEO: ; TIMEOUT + TIMEOUT BEEP BSF DONE ;STOP DTMF DECODER CALL BEEPERR ; TIMEOUT BEEP, TWO LOW BEEPS CALL BEEPPAUSE CALL BEEPERR TIMEO1: BSF DONE ;STOP DTMF DECODER BCF PORTC,3 ; BEEP OFF GOTO MAINDTMF ;RESTART ; ****** END MAIN LOOP ;START DTMF DECODER START_DTMF BSF DONE MOVF FSR,W MOVWF FSR_SAVE_DTMF MOVLW 0X2F MOVWF FSR TEMPXX1 INCF FSR,F CLRF INDF MOVF FSR,W XORLW 0X3F BTFSS STATUS,Z GOTO TEMPXX1 CLRF CLRF MOVF MOVWF BCF RETURN TABLECOUNTER RESULT1 FSR_SAVE_DTMF, FSR DONE
; CLEAR RAM FROM 0X30-0X3F ; table read pointer ; CLEAR RESULT DIGIT W ; RESTORE FSR ; CLEAR DONE, START DTMD INT ROUTINE
; BEEP ON ERROR, DESTROY scrA! BEEPERR: MOVLW .16 GOTO BEEP1 ; BEEP WHEN OK, DESTROY scrA! BEEPOK: MOVLW .4 BEEP1: MOVWF MOVWF BANKSEL BCF BANKSEL BSF BSF CLRF MOVLW MOVWF BCF BEEPWAIT: BTFSS TIME2 scrA TRISC TRISC,0 PORTC BEEP TIMEOUT TIME0 .25 TIME1 TIMEOUT TIMEOUT ; BEEP PITCH ; PORTC 0 = OUT ; BACK TO BANK 0 ; START INT BEEP ROUTINE ; STOP TIMEOUT ROUTINE ; INIT TIMEOUT COUNTER ; START TIMEOUT
GOTO BEEPWAIT BCF BEEP BCF PORTC,0 BANKSEL TRISC BSF TRISC,0 BANKSEL PORTC RETURN
; STOP INT BEEP ROUTINE ; SET OUTPUT TO 0 VOLTS ; PORTC 0 = INPUT / HIGH z ; BACK TO BANK 0
; BEEPPAUSE WAIT A LITTLE BIT.... BEEPPAUSE: BSF TIMEOUT ; STOP TIMEOUT ROUTINE CLRF TIME0 ; INIT TIMEOUT COUNTER MOVLW .10 MOVWF TIME1 BCF TIMEOUT ; START TIMEOUT BEEPWAIT1: BTFSS TIMEOUT GOTO BEEPWAIT1 RETURN
; CLEAR TIMEOUT TIMER CLRTIMEOUT: ; CLEAR TIMEOUT TIMER ( ~6.7 SECONDS) BCF CLRF CLRF BCF RETURN TIMEOUT TIME0 TIME1 TIMEOUT ; STOP INT TIMEOUT ROUTINE ; INIT TIMEOUT COUNTER ; START INT TIMEOUT ROUTINE
; PRINT PASSWORD IN EEPROM TESTPASS: MOVLW .8 MOVWF EE_Byte TESTPASS1: MOVF EE_Byte,W CALL EE_READ_BYTE CALL send_c ; PRINT DIGIT INCF EE_Byte,F MOVLW 0X12 ; END OF PASS+1 XORWF EE_Byte, W BTFSS STATUS, Z GOTO TESTPASS1 CALL cur_h1 RETURN
;********************** ; UTILITY ROUTINES ;********************** ; ; 8/15/02 ; ; display routines, 16F87X Q=20Mhz ; display IC HD44780A00 / 16X2 ; Display connected to Port D
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
DATA4 DATA5 DATA6 DATA7 DATA0-3 - GROUND RS E - NOT USED - NOT USED
init_disp - initialize display cur_h1 - cursor home line 1 cur_h2 - cursor home line 2 movlw movwf movlw movwf call LOW text comA HIGH text comB prt_rom - print the text in Rom (comB:comA)
binbcdU8 - convert 8 bit unsigned count_1 to dis_2,dis_1 bcdascii8 - Convert bcd dis_2..1 in ASCII dis_4..1 leadzero8 - delete leading zeroes from dig_4 - dig_2 dispU8 - display 8 bit unsigned count_1 to dis_4..1, +1 stack level dispS8 - display 8 bit signed count_1 to dis_4..1, +1 stack level
binbcdU32 - convert 32 bit unsigned count_4:3:2:1-->dig_5..1, 10 digits, dis_5 low nibble=MSD, +1 stack level ; bcdascii32 - Convert bcd dig_5..1 in ASCII dig_9..1 ; leadzero32 - delete leading zeroes from dig_10 - dig_2 ; ; prtram - print from RAM, string located at (IRP:W) send_c - send char in W
; send caracter in W send_c: movwf swapf andlw iorlw movwf nop bsf nop nop bcf goto goto movf andlw iorlw movwf nop bsf nop nop
+ 100 uS delay comC comC, W 0xF 0x10 ;RS=1 PORTD ;E=0 PORTD,0x5;E=1 PORTD,0x5;E=0 $+1 $+1 ;delay 1 uS comC, W 0xF 0x10 ;RS=1 PORTD ;E=0 PORTD,0x5;E=1
bcf ; delay 100 uS del_100: movlw movwf del_100A: decfsz goto return ; send byte in W send_b: movwf swapf andlw movwf nop bsf nop nop bcf goto goto movf andlw movwf nop bsf nop nop bcf return
PORTD,0x5;E=0
comC comC, W ; high nibble 0xF PORTD ;E=0 PORTD,0x5;E=1 PORTD,0x5;E=0 $+1 $+1 ; delay 1uS comC, W ; Low nibble 0xF PORTD ; E=0 PORTD,0x5; E=1 PORTD,0x5; E=0
; send nibble, low w send_n: movwf PORTD nop bsf PORTD,0x5 nop nop bcf PORTD,0x5 return
; print the string located at (comB:comA) in program memory prt_rom: Bank2 prt_rom1: movf comA, W ;Write the movwf EEADR ;address bytes movf comB, W movwf EEADRH bsf bsf bsf nop nop bcf movf andlw btfsc STATUS, RP0 EECON1, EEPGD EECON1, RD STATUS, RP0 EEDATA, W 0xFF STATUS, Z ;Bank3 ;Point to program memory ;start read operation ;required two nop's ;Bank2 ;char in W ;compare 0
goto prt_rom2 Bank0 call send_c incfsz goto incf goto prt_rom2: Bank0 return ; cursor home line 1 cur_h1: movlw cur_h11: call call return ; cursor home line 2 cur_h2: movlw goto 0x80 send_b del_100 0xC0 cur_h11 comA, F prt_rom comB, F prt_rom
; delay 1 ms del_1m: movlw ; w=delayX100nS del_1mx: movwf del_1mA: decfsz goto return del_1mB: del_1mC:
movlw 165 movwf scrA decfsz scrA, F goto del_1mC goto del_1mA ;print from RAM, string located at (IRP:W) movwf FSR movlw 0 subwf INDF, w ; compare 0 btfsc STATUS, Z return ; char = zero movf INDF, W call send_c incf FSR, F goto prt_ram1
prt_ram: prt_ram1:
leadzero8:
; delete leading zeroes from dig_4 - dig_2 BCF STATUS, IRP movlw .3 movwf scrA movlw LOW dig_4 goto leadzeroin ; delete leading zeroes from dig_10 - dig_2 BCF STATUS, IRP movlw .9
leadzero32:
movwf scrA movlw LOW dig_10 leadzeroin: leadz1: movwf FSR movlw 0x30 ; ascii zero subwf INDF, w ; compare 0x30 btfss STATUS, Z return ; first char <>zero movlw 0x20 ; ascii space movwf INDF decf scrA, F btfsc STATUS, Z ; exit if zero return incf FSR, F goto leadz1
bcdascii32:
bcdascii8:
; Convert bcd dis_5..1 in ASCII dis_9..1 swapf dig_5, W andlw 0x0F addlw 0x30 movwf dig_10 movf dig_5, W andlw 0x0F addlw 0x30 movwf dig_9 swapf dig_4, W andlw 0x0F addlw 0x30 movwf dig_8 movf dig_4, W andlw 0x0F addlw 0x30 movwf dig_7 swapf dig_3, W andlw 0x0F addlw 0x30 movwf dig_6 movf dig_3, W andlw 0x0F addlw 0x30 movwf dig_5 ; Convert bcd dis_2..1 in ASCII dis_4..1 swapf dig_2, W andlw 0x0F addlw 0x30 movwf dig_4 movf dig_2, W andlw 0x0F addlw 0x30 movwf dig_3 swapf dig_1, W andlw 0x0F addlw 0x30 movwf dig_2 movf dig_1, W andlw 0x0F addlw 0x30 movwf dig_1
return dispS8: ; display 8 bit signed count_1 to dis_4..1, +1 stack level btfss count_1,7 goto dispU8 ; disp neg 8 comf count_1, F ; complement incf count_1, F ; X(-1) call binbcdU8 ; dis2..1 bcd call bcdascii8 ; dis4..1 ascii ; leadzero and - delete leading zeroes from dig_4..2 and add the - sign BCF STATUS, IRP movlw .4 movwf scrA movlw LOW dig_4 movwf FSR leadzN1: movlw 0x30 ; ascii zero subwf INDF, w ; compare 0x30 btfss STATUS, Z goto leadzN2 ; first char <>zero, add movlw 0x20 ; ascii space movwf INDF decf scrA, F btfsc STATUS, Z ; exit if zero return incf FSR, F goto leadzN1 leadzN2: ; dec pointer and display "-" decf FSR, F movlw "-" ; ascii movwf INDF return return dispU8: ; display 8 bit unsigned count_1 to dis_4..1, +1 stack level call binbcdU8 call bcdascii8 call leadzero8 return binbcdU8: ; convert 8 bit unsigned count_1 to dis_2,dis_1 bcf STATUS,C ; clear the carry bit BCF STATUS, IRP ;Page zero or 1 for indirect movlw 8 movwf scrA clrf dig_1 clrf dig_2 loop8: rlf rlf rlf count_1,F dig_1, F dig_2, F
adjDEC8:
movlw movwf movlw addwf movwf btfsc movwf movlw addwf movwf btfsc movwf movlw movwf movlw addwf movwf btfsc movwf movlw addwf movwf btfsc movwf goto
dig_1 FSR 0x3 INDF,W scrB scrB,3 INDF 0x30 INDF,W scrB scrB,7 INDF dig_2 FSR 0x3 INDF,W scrB scrB,3 INDF 0x30 INDF,W scrB scrB,7 INDF loop8
; binbcdU32:
; convert 32 bit unsigned count_4:3:2:1-->dig_5..1, 10 digits, ; dis_5 low nibble=MSD, +1 stack level bcf STATUS,C ; clear the carry bit BCF STATUS, IRP ;Page zero or 1 for indirect movlw 32 movwf scrA clrf dig_1 clrf dig_2 clrf dig_3 clrf dig_4 clrf dig_5
loop28:
; decfsz scrA, F goto adjDEC RETLW 0 ; adjDEC: ; movlw movwf call dig_1 FSR adjBCD
movlw movwf call ; movlw movwf call ; movlw movwf call ; movlw movwf call goto adjBCD: movlw addwf movwf btfsc movwf movlw addwf movwf btfsc movwf RETLW
dig_2 FSR adjBCD dig_3 FSR adjBCD dig_4 FSR adjBCD dig_5 FSR adjBCD loop28 0x3 INDF,W scrB scrB,3 INDF 0x30 INDF,W scrB scrB,7 INDF 0
; init display in 4 bit transfer mode init_disp: Bank0 clrf PORTD Bank1 movlw B'11000000' ; port D<0..5>=out movwf TRISD Bank0 movlw call movlw call movlw call movlw call 200 del_1mx 0x3 send_n 50 del_1mx 0x3 send_n ; 20ms
; 5ms
call del_100 movlw 0x3 call send_n call del_100 movlw 0x2 call send_n call del_1m movlw 0x28
; 100uS
call send_b call del_100 movlw 0xE ; display on, cursor on, blink off call call movlw call movlw send_b del_100 0x1 ; display clear send_b 30 ; 2 ms delay to clear the display
;**************************** ;EEprom routines by Tony Kubek DISABLE_IRQ MACRO LOCAL STOP_INT STOP_INT BCF INTCON,GIE BTFSC INTCON,GIE GOTO STOP_INT ENDM ;+++++ ; ENABLE_IRQ enable global irq ENABLE_IRQ MACRO BSF INTCON,GIE ENDM ; enable global interrupt
; *********************************************************************** ; EE_WRITE_BYTE - Routine to write a byte to ee ram ; Adress in W, byte MUST be in EE_Byte EE_WRITE_BYTE Bank2 MOVWF EEADR Bank0 MOVF EE_Byte,W Bank2 MOVWF EEDATA BSF STATUS,RP0 BCF EECON1,EEPGD BSF EECON1,WREN DISABLE_IRQ MOVLW MOVWF H'55' EECON2 ; select bank2 ; setup adress ; ; get byte ; ; ; ; ; setup byte to write bank3 !! set to data ee ram enable writes disable irq's
; required sequence !!
; begin write procedure ; enable irq's again ; disable writes ( does not affect current write
Bank0 ; reset to bank0 ; wait for the write to complete before we return BTFSS PIR2,EEIF ; wait for interrupt flag to be set GOTO $-1 ; clear interupt bit and write enable bit BCF PIR2,EEIF ;clear eewrite irq flag RETURN ; *********************************************************************** ; EE_READ_BYTE - Routine to read a byte from ee ram ; Adress in W, byte will be delivered in W EE_READ_BYTE Bank2 MOVWF EEADR ; put in adress reg. BSF STATUS,RP0 ; bank3 !! BCF EECON1,EEPGD ; set to read data memory BSF EECON1,RD ; set bit to read BCF STATUS,RP0 ; bank2 !! MOVF EEDATA,W ; move data to W Bank0 ; Reset to BANK0 ! RETURN ; and return
;***************************************************************************
org 0x0600 ; page 0 LOWBAND ADDWF PCL,F RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW B'11111111' B'11111111' B'11111010' B'10101010' B'10101010' B'10100000' B'10000000' B'00000001' B'00000101' B'00010101' B'01010111'
RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW
B'01011111' B'01111110' B'01111110' B'11111010' B'11101000' B'11101000' B'10100000' B'10100001' B'10000001' B'10000111' B'00000111' B'00011111' B'00011110' B'01011110' B'01111000' B'01111000' B'01111000' B'11100001' B'11100001' B'11100001' B'10000111' B'10000111' B'10000110' B'10011110' B'00011110' B'00011100' B'00011000' B'01111001' B'01111001' B'01110001' B'01100011' B'11100111' B'11100111' B'11000110' B'10001110' B'10001100' B'10011100' B'10011000' B'00011001' B'00111001' B'00110011' B'01110011' B'01100011' B'01100110' B'01100110' B'11100110' B'11001100' B'11001100' B'10001101' B'10011001' B'10011001' B'10011011' B'00110011' B'00110010' B'00110110' B'01100110' B'01100100' B'01101100' B'01001100' B'11001101'
RETLW B'11001001' RETLW B'11011011' RETLW B'10011011' RETLW B'10010011' RETLW B'10010010' RETLW B'10110010' RETLW B'00110100' RETLW B'00110100' RETLW B'00100100' RETLW B'01101101' RETLW B'01101101' RETLW B'01001101' RETLW B'01001011' RETLW B'11001011' RETLW B'11010010' RETLW B'11010010' RETLW B'10010010' RETLW B'10110100' RETLW B'10110100' RETLW B'10110101' RETLW B'00101101' RETLW B'00101101' RETLW B'00101111' RETLW B'01101011' RETLW B'01001010' RETLW B'01001010' RETLW B'01000010' RETLW B'11010000' RETLW B'11010000' RETLW B'11010100' RETLW B'10110101' RETLW B'10110101' RETLW B'10111111' RETLW B'10101111' RETLW B'00101111' RETLW B'00101010' RETLW B'00001010' RETLW B'01000000' RETLW B'01000000' RETLW B'01010000' RETLW B'01010101' RETLW B'11010101' RETLW B'11010101' RETLW B'11111111' RETLW B'10111111' RETLW B'10111110' RETLW B'10101010' RETLW B'10101010' RETLW B'00101000' RETLW B'00000000' RETLW B'00000001' RETLW B'01000001' RETLW B'01010101' RETLW B'01010111' RETLW B'01010111' RETLW B'11111111' RETLW B'11111110' RETLW B'11111010' RETLW B'10101000' RETLW B'10101000'
RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW
B'10100000' B'10100001' B'00000001' B'00000111' B'00000111' B'01010111' B'01011110' B'01011110' B'01111110' B'11111000' B'11111000' B'11101001' B'10100001' B'10100001' B'10000011' B'10000111' B'00000110' B'00000110' B'00011110' B'01011100' B'01011000' B'01111000' B'01111001' B'11110001' B'11100011' B'11100011' B'10100111' B'10000110' B'10000110' B'10001100' B'00011100' B'00011100' B'00011001' B'01111001' B'01111001' B'01110011' B'01110011' B'11100010' B'11100110' B'11100110' B'10001100' B'10001100' B'10001101' B'10011001' B'00011001' B'00011011' B'00110011' B'01110011' B'01110010' B'01100110' B'01100100' B'11100100' B'11001100' B'11001101' B'10001101' B'10001011' B'10011011' B'10011011' B'00010010' B'00110010'
RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW
B'00110100' B'01110100' B'01100100' B'01101101' B'01101101' B'11001101' B'11001011' B'11001011' B'10011010' B'10010010' B'10010010' B'10110000' B'00110100' B'00110101' B'00110101' B'01101101' B'01101111' B'01101111' B'01001011' B'11001010' B'11001010' B'11010000' B'10010000' B'10010100' B'10110101' B'10110101' B'00111111' B'00101111' B'00101111' B'01101010' B'01001010' B'01001010' B'01000000' B'11000000' B'11010001' B'11010101' B'10010101' B'10110111' B'10111111' B'10111110' B'00101110' B'00101010' B'00101000' B'01000000' B'01000000' B'01000001' B'01010101' B'11010111' B'11010111' B'11111111' B'10111110' B'10111110' B'10111000' B'10101000' B'00101000' B'00100001' B'00000001' B'01000001' B'01000111' B'01010111'
org 0x0700 HIGHBAND ADDWF PCL,F RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW B'11111111' B'11101010' B'10101000' B'10000000' B'00000101' B'00010111' B'01011111' B'01111110' B'11111000' B'11100000' B'10000001' B'10000111' B'00010111' B'00011110' B'01111000' B'01111000' B'11100001' B'11100011' B'10000111' B'10001110' B'00011100' B'00111000' B'01111001' B'01100011' B'11100111' B'11000110' B'10001100' B'10011100' B'00011001' B'00110011' B'01110011' B'01100110' B'11000100' B'11001100' B'10011001' B'10011011' B'00110011' B'00110010' B'01100100' B'01101100' B'11001101' B'11001011' B'10010011' B'10110010' B'00110100' B'00100100' B'01101101' B'01001011'
RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW
B'11001011' B'11010010' B'10010000' B'10110100' B'00101101' B'00101111' B'01001011' B'01001010' B'11010000' B'11010100' B'10110101' B'10111111' B'00101111' B'00101010' B'01000000' B'01010000' B'11010101' B'11110111' B'10111111' B'10101010' B'00101000' B'00000000' B'01000001' B'01010111' B'11011111' B'11111110' B'10101000' B'10101000' B'00000001' B'00000111' B'01010111' B'01011110' B'11111000' B'11111000' B'10100001' B'10100011' B'00000111' B'00011110' B'01011100' B'01111000' B'11111001' B'11100011' B'10100111' B'10000110' B'00001100' B'00011100' B'01011001' B'01110011' B'11100011' B'11100110' B'10000100' B'10001100' B'00011001' B'00011011' B'01110011' B'01110010' B'01100100' B'11001100' B'11001101' B'10011011'
RETLW B'10011011' RETLW B'00110010' RETLW B'00110100' RETLW B'01100100' RETLW B'01101101' RETLW B'11001111' RETLW B'11001011' RETLW B'10010010' RETLW B'10110000' RETLW B'00110100' RETLW B'00100101' RETLW B'01101111' RETLW B'01001011' RETLW B'11001010' RETLW B'11010000' RETLW B'10010100' RETLW B'10110101' RETLW B'00111111' RETLW B'00101111' RETLW B'01001010' RETLW B'01000000' RETLW B'11010000' RETLW B'11010101' RETLW B'10110111' RETLW B'10111111' RETLW B'00101010' RETLW B'00101000' RETLW B'01000000' RETLW B'01000001' RETLW B'11010111' RETLW B'11111111' RETLW B'10111110' RETLW B'10101000' RETLW B'00101000' RETLW B'00000001' RETLW B'01000111' RETLW B'01010111' RETLW B'11011110' RETLW B'11111100' RETLW B'10111000' RETLW B'10100001' RETLW B'00000011' RETLW B'00000110' RETLW B'01010110' RETLW B'01011100' RETLW B'11111001' RETLW B'11111001' RETLW B'10100011' RETLW B'10100010' RETLW B'00000110' RETLW B'00011100' RETLW B'01011101' RETLW B'01111001' RETLW B'11110011' RETLW B'11100010' RETLW B'10100110' RETLW B'10000100' RETLW B'00001101' RETLW B'00011001' RETLW B'01011011'
RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW
B'01110010' B'11100010' B'11100100' B'10001101' B'10001101' B'00011011' B'00011010' B'01110010' B'01110100' B'11100101' B'11101101' B'10001111' B'10011010' B'00010010' B'00110000' B'01110101' B'01100101' B'11101111' B'11001010' B'10001010' B'10010000' B'00010001' B'00110101' B'01101111' B'01101110' B'11001010' B'11001000' B'10010001' B'10010101' B'00110111' B'00111110' B'01101110' B'01101000' B'11000001' B'11010001' B'10010111' B'10111110' B'00111110' B'00101000' B'01101001' B'01000001' B'01000111' B'11010110' B'11111110' B'10111100' B'10101001' B'00100001' B'00000011' B'01000110' B'01010110' B'11011100' B'11111001' B'10111001' B'10100011' B'00000010' B'00000110' B'01011100' B'01011101' B'11111001' B'11111011'
RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW
B'10100010' B'10100110' B'00000100' B'00001101' B'01011101' B'01111011' B'11110010' B'11100010' B'10100100' B'10000101' B'00001101' B'00011011' B'01011010' B'01110010' B'11110100' B'11100101' B'10001101' B'10001111' B'00011010' B'00010010' B'01110000' B'01110101' B'11100101' B'11101111' B'10001010' B'10001010' B'00010000'
END