;
;         <keysen_629.txt>     
;               
;
;------------------------------------------------------------------------------
; OSCCAL RESTORE (not required if internal OSC is not used)
;------------------------------------------------------------------------------
;
START
        errorlevel -302
        BSF     STATUS,RP0    ; set file register bank to 1 
        CALL    0x3FF         ; retrieve factory calibration value
        MOVWF   OSCCAL        ; update register with factory cal value 
        BCF     STATUS,RP0    ; set file register bank to 0
    goto hard_init
;
;------------------------------------------------------------------------------
;  
;
;    DATA EEPROM READ
deerd
     bsf STATUS,RP0 ;Bank 1
    ; movlw CONFIG_ADDR ;
     movwf EEADR ;Address to read
     bsf EECON1,RD ;EE Read
wait_rdf
      btfsc EECON1,RD
       goto wait_rdf
     movf EEDATA,W ;Move data to W
     bcf STATUS,RP0 ;Bank 0
     return
;-------------------------------------------
;    DATA EEPROM WRITE
deewr
     bsf STATUS,RP0 ;Bank 1
     movwf EEDATA
     bsf EECON1,WREN ;Enable write
     bcf INTCON,GIE ;Disable INTs
     movlw 0x55 ;Unlock write
     movwf EECON2 ;
     movlw 0xAA ;
     movwf EECON2 ;
     bsf EECON1,WR ;Start the write
wait_wrf
      btfsc EECON1,WR
       goto wait_wrf
     bcf EECON1,WREN ;Disable write
     bcf STATUS,RP0 ;Bank 0
     bsf INTCON,GIE ;Enable INTS
     return
;-------------------------------------------
;     WRITE VERIFY     ,    
;    EEPROM  "" 
;dewer
;     bcf STATUS,RP0 ;Bank 0
;     ;Any code
;     bsf STATUS,RP0 ;Bank 1 READ
;     movf EEDATA,W ;EEDATA not changed 
;     ;from previous write
;     bsf EECON1,RD ;YES, Read the 
;     ;value written
;     xorwf EEDATA,W
;     btfss STATUS,Z ;Is data the same
;     goto WRITE_ERR ;No, handle error
;     ;Yes, continue
;-------------------------------------------
;      
;   
rewrit_dat
     bsf flags,wr_pg_dis ;       ""
      movlw ee_point
      call deerd ;      
       bsf STATUS,RP0 ; Bank 1
        movwf EEADR ; Address to write
         bcf STATUS,RP0 ; Bank 0
          movf tmp0,w ;      
      call deewr
;    
;     EEPROM  
     return
;------------------------------------------------------------------------------
; PLACE USER PROGRAM HERE
;------------------------------------------------------------------------------
;
;      
;
hard_init
       MOVLW 07h ; Set GP<2:0> to 
       MOVWF CMCON ; digital IO
       bsf STATUS,RP0 ;Bank 1
;   ""  (OPTION_REG./GPPU = 1)
       movlw lvk_mask
       movwf TRISIO
     if active_outlevel == 1
       movwf tmp0
     else    ; active_outlevel = 0
       movlw cold_data
       movwf tmp0
     endif
       bcf STATUS,RP0 ;Bank 0
       movwf GPIO
       movlw ee_point
       call deerd ;      
      call deerd ;     
      movwf GPIO
      movwf tmp0
;  0    32 ( 64)    cpu
;     0,005888 (0,016384) 
; (   0,011776 (0,032768) )
     bcf flags,tik_flag
     clrwdt
     bsf STATUS,RP0 ;Bank 1
     movlw b'11010100' ; b'11010101' = /64, b'11010100' = /32
     movwf OPTION_REG
     bcf STATUS,RP0 ;Bank 0
     clrf TMR0
     movlw (1<<GIE | 1<<T0IE)
     movwf INTCON
;
;-------------------------------------------------------
;
;        
;    " "   
   movlw 0x0A
   movwf cnte0
pause
   btfss flags,tik_flag ;  
   goto pause
   bcf flags,tik_flag
   decfsz cnte0,f
   goto pause
;
;-------------------------------------------------------
;
;   
;    = 0
;     active_outlevel = 1  0
;    defn_key3.txt
;
test0
   btfss flags,tik_flag ;  
   goto test0
   bcf flags,tik_flag
test0a
   movlw inp_mask
   andwf GPIO,w ;    W
	 movwf tmp1 ;   tmp1
	 xorwf tmp0,w ;   
	 btfsc STATUS,Z
	  goto test0 ;   
	movlw 5 ;       
	movwf cnte0 ;  
test1
   btfss flags,tik_flag ;  
   goto test1
   bcf flags,tik_flag
   decfsz cnte0,f
   goto test1
   movlw inp_mask
   andwf GPIO,w ;    W
   xorwf tmp1,w
   btfss STATUS,Z
    goto  test0a ; falstart (GPIO     tmp1)
test2
    rlf tmp1,w ;       
    movwf tmp2 ;    tmp2
    swapf tmp2,f ;  
    comf tmp2,f ;    
    movlw line_mask
    andwf tmp2,w ;  ,    
                ;    
    movwf tmp2 ;     tmp2
    andwf tmp1,w ;        
    movwf tmp3
    comf tmp3,w ;    
    andlw line_mask ;    
    andwf tmp2,w ;      
            ;  ,     = 0
    movwf tmp3 ;   tmp3
    comf tmp2,w ;      
    andwf tmp1,w ;      
    iorwf tmp3,w ;    ,
		            ;   , 
		iorlw lvk_mask ;    
		andlw inp_mask ;   ,    
		movwf GPIO ;   
		movwf tmp0 ;    
   bcf flags,wr_pg_dis
test3
    movlw 0x0B
		movwf cnte0 ; 6*16~100 
econt1
    clrf cnte1 ;    
cont0
    btfss flags,tik_flag ;  
    goto cont0
    bcf flags,tik_flag
    movlw inp_mask
    andwf GPIO,w ;    W
    xorwf tmp0,w
    btfss STATUS,Z
    goto econt ;    (  ) = econt
    bcf flags,ersn_flag ;  error_flag
    goto test0a ;  -     (test0)
econt
    incfsz cnte1,f
    goto cont0
    btfss flags,wr_pg_dis
    call rewrit_dat
    decfsz cnte0,f
    goto econt1
error_wrk
  if active_outlevel == 1
    movlw lvk_mask ;      active_outlevel = 1
  else    ; active_outlevel = 0
    movlw cold_data ;      active_outlevel = 0
  endif
    movwf GPIO
    movwf tmp0
    bsf flags,ersn_flag
    goto test3 ;      ""