 
 ; Pins:
 ;                     +----+
 ;                Vdd -|1  8|- Vss
 ;                RA5 -|2  7|- RA0/ICSPDAT ESUART TX
 ;                RA4 -|3  6|- RA1/ICSPLCK ESUART RX
 ;           RA3/MCLR -|4  5|- RA2
 ;                     +----+
 ;
#include "p12f1572.inc"
    __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF
    __CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_ON & _BORV_LO & _LPBOREN_OFF & _LVP_OFF

    ;radix dec
 
    errorlevel - 302
    cblock  0x20
LOOP1
LOOP2    
flag    
PROG_DATA_LO
PROG_DATA_HI
PROG_ADDR_LO    
PROG_ADDR_HI    
DATA_ADDR   
    endc
    cblock 0x70
ADDRH
ADDRL 
    endc 
data_lo   equ  05h
data_hi   equ  04h  
   
#DEFINE      WR_OK LATA,2   ;????????? ??????     
#DEFINE      SPD   LATA,4   ; ????????? ?????????? ?????? ?????? ? ?????? 
#DEFINE      key   PORTA,3   ; ?????? ?????? ? ?????? EEPROM ?????? ???????? 

RESET_VECT CODE        0x0000
    PAGESEL     START
    Goto        START
ISR        CODE        0x0004
    Retfie
START    
;----------------????????????? ????????????????---------
    ;banksel     OPTION_REG
    ;clrf        OPTION_REG
    banksel     OSCCON
    Movlw	    b'01101011'     ; 4 Mhz ???????
    Movwf	    OSCCON	       ;
    banksel     PORTA
    Movlw       b'00001011'
    Movwf       PORTA          
    banksel     LATA
    Clrf        LATA
    banksel     ANSELA
    Movlw       b'00000000'  
    Movwf       ANSELA 
    banksel     TRISA  
    Movlw       b'00001011'   ; // RA0 == AN0, RA1 = in_uart   
    Movwf       TRISA 
    ;banksel     PMDATL
    ;Clrf        PMDATL
    ;Clrf        PMDATH 
     
;****************************************************************
;------------???????? ????-----------------
;****************************************************************
CYCLE 
   
    ;Call        ERASE 
    
    movlw       data_hi
    movwf       HIGH DATA_ADDR
    movlw       data_lo
    movwf       LOW DATA_ADDR
    Call        WRITE_MEM
    
    bsf         WR_OK
    call        DELAY_250
    call        DELAY_250
    bcf         WR_OK
    
    Call        READ_MEM
    Call        COMPARISON
    btfss       flag, 7
    goto        m0
    btfss       flag, 6
    goto        m0
    bsf         SPD
    goto        CYCLE
m0
    bcf         SPD
    goto        CYCLE

;********************* ???????????? ********************   
;-----????????? ???????? ? ????????? ? ????????? ?????????------  
COMPARISON
    BANKSEL     PROG_DATA_LO
    Movf        PROG_DATA_LO,W 
    BANKSEL     flag
    Xorlw       data_lo     
    bnz         m1s
    
    Bsf         flag, 7              ; ??????????
    goto        m0s
m1s
    Bcf         flag, 7             
m0s    
    BANKSEL     PROG_DATA_HI
    Movf        PROG_DATA_HI,W 
    BANKSEL     flag
    Xorlw       data_hi
    bnz         m2s
    Bsf         flag, 6                ; ??????????
    Return
m2s
    Bcf         flag, 6   
    Return
;--------------------------------------------------------------------
WRITE_MEM
;*****************************************************************************
;32 ????? ?????? ?????????, ?????????? ?? ?????? ? DATA_ADDR;
;?????? ????? ??????, ??????? ????? ?????????? ??????? ?? ???? ??????? ?????? 
;? DATA_ADDR,; ??????????? ? ????????? endian ?????? 
;?????????? ?????? ?????? ( ???????? ???????? ???? = 00000), ???????? ? ADDRH:ADDRL;
;ADDRH ? ADDRL ??????????? ? ???????????? ?????? ?????? 0x70 - 0x7F (????? ???)
;*****************************************************************************    
    BCF     INTCON,GIE  ; Disable ints so required sequences will execute properly
    BANKSEL PMADRH      ; Bank 3
    MOVF    ADDRH,W     ; Load initial address
    MOVWF   PMADRH      ;
    MOVF    ADDRL,W     ;
    MOVWF   PMADRL      ;
    MOVLW   LOW DATA_ADDR ; Load initial data address
    MOVWF   FSR0L       ;
    MOVLW   HIGH DATA_ADDR ; Load initial data address
    MOVWF   FSR0H       ;
    BCF     PMCON1,CFGS ; Not configuration space
    BSF     PMCON1,WREN ; Enable writes
    BSF     PMCON1,LWLO ; Only Load Write Latches
LOOP
    MOVIW   FSR0++      ; Load first data byte into lower
    MOVWF   PMDATL      ;
    MOVIW   FSR0++      ; Load second data byte into upper
    MOVWF   PMDATH      ;
    MOVF    PMADRL,W    ; Check if lower bits of address are '00000'
    XORLW   0x1F        ; Check if we're on the last of 16 addresses
    ANDLW   0x1F        ;
    BTFSC   STATUS,Z    ; Exit if last of 16 words,
    GOTO    START_WRITE ;
    MOVLW   55h         ; Start of required write sequence:
    MOVWF   PMCON2      ; Write 55h
    MOVLW   0AAh        ;
    MOVWF   PMCON2      ; Write AAh
    BSF     PMCON1,WR   ; Set WR bit to begin write
    NOP                 ; NOP instructions are forced as processor
                        ; loads program memory write latches
    NOP                 ;
    INCF    PMADRL,F    ; Still loading latches Increment address
    GOTO    LOOP        ; Write next latches
START_WRITE
    BCF     PMCON1,LWLO ; No more loading latches - Actually start Flash program
                        ; memory write
    MOVLW   55h         ; Start of required write sequence:
    MOVWF   PMCON2      ; Write 55h
    MOVLW   0AAh        ;
    MOVWF   PMCON2      ; Write AAh
    BSF     PMCON1,WR   ; Set WR bit to begin write
    NOP                 ; NOP instructions are forced as processor writes
                        ; all the program memory write latches simultaneously
    NOP                 ; to program memory.
                        ; After NOPs, the processor
                        ; stalls until the self-write process in complete
                        ; after write processor continues with 3rd instruction
    BCF     PMCON1,WREN ; Disable writes
    BSF     INTCON,GIE  ; Enable interrupts 
    Return
    ;-----------------------------------------------------------------------------------------
READ_MEM
;******************************************************************************
;???? ??????? ???? ????????? 1 ????? ?????????
;?????? ?? ?????? ??????:PROG_ADDR_HI : PROG_ADDR_LO
;?????? ????? ?????????? ? ?????????? PROG_DATA_HI, PROG_DATA_LO
;******************************************************************************    
        BANKSEL PMADRL      ; Select Bank for PMCON registers
        MOVLW PROG_ADDR_LO  ;
        MOVWF PMADRL        ; Store LSB of address
        MOVLW PROG_ADDR_HI  ;
        MOVWF PMADRH        ; Store MSB of address
        BCF PMCON1,CFGS     ; Do not select Configuration Space
        BSF PMCON1,RD       ; Initiate read
        NOP 
        NOP 
        MOVF PMDATL,W       ; Get LSB of word
        MOVWF PROG_DATA_LO  ; Store in user location
        MOVF PMDATH,W       ; Get MSB of word
        MOVWF PROG_DATA_HI  ; Store in user location
        Return

;------------------------------------------------------------------------------
KEY_ON
    banksel    flag
    Bcf        flag, 5
    Btfsc      key           ; ???????? ??????
    Return                       
    Call       DELAY_005
    Call       DELAY_005
    Call       DELAY_005
    Btfsc      key
    Return
    Bsf        flag, 5      ; ???? ??????, ?? ???????? ???? ??????         
    Return  
;-----------------------------------------------------------------------
ERASE
;**************************************************************************
; ?????????? ????? ? ???????? ??????? ???????? ???????? ? ADDRH:ADDRL 
; ADDRH ? ADDRL ??????????? ? ???????????? ?????? ; ?????? 0x70 - 0x7F (????? R??)
;**************************************************************************    
    BCF     INTCON,GIE  ; ?????? ??????????
    BANKSEL PMADRL
    MOVF    ADDRL,W     ; Load lower 8 bits of erase address boundary
    MOVWF   PMADRL
    MOVF    ADDRH,W     ; Load upper 6 bits of erase address boundary
    MOVWF   PMADRH
    BCF     PMCON1,CFGS ; Not configuration space
    BSF     PMCON1,FREE ; Specify an erase operation
    BSF     PMCON1,WREN ; Enable writes
    MOVLW   55h         ; Start of required sequence to initiate erase
    MOVWF   PMCON2      ; Write 55h
    MOVLW   0AAh        ;
    MOVWF   PMCON2      ; Write AAh
    BSF     PMCON1,WR   ; Set WR bit to begin erase
    NOP                 ; NOP instructions are forced as processor starts
    NOP                 ; row erase of program memory.
                        ;
                        ; The processor stalls until the erase process is complete
                        ; after erase processor continues with 3rd instruction
    BCF     PMCON1,WREN ; Disable writes
    BSF     INTCON,GIE  ; Enable interrupts
    Return
 ;------------------------------------------------------------ 
DELAY_N_MS
    Movwf 	LOOP1
OUTTER:
    Movlw   .110     		 ; ???????? 1 ??
    Movwf   LOOP2
INNER:
    Nop
    Nop
    Nop
    Nop
    Nop
    Nop
    Decfsz  LOOP2, F
    Goto 	INNER
    Decfsz  LOOP1, F
    Goto 	OUTTER
    Return
;-----------------------------------------------------------------	
DELAY_005                        ; 5??
    Movlw     .5
    Call      DELAY_N_MS
    Return
    
;-------------------------------------------
DELAY_150:
    Movlw 	.150   		 ; 150??
    Call     DELAY_N_MS
    Return        
;-------------------------------------------
DELAY_250:
    Movlw 	.250   		 ; 250??
    Call     DELAY_N_MS
    Return
;------------------------------------------------------------
TIC_WR
    Bsf      SPD             ;???????? ??? ????      
    Call     DELAY_150
    Bcf      SPD
    Call     DELAY_250
    
    Bsf      SPD
    Call     DELAY_250
    Bcf      SPD
    Call     DELAY_150
    
    Bsf      SPD
    Call     DELAY_150
    Bcf      SPD
    Call     DELAY_250
    
    Bsf      SPD
    Call     DELAY_250
    Bcf      SPD
    Call     DELAY_150
    Return
;----------------------------------------------
 
 
    end                         ;????? ???? ?????????
	      
  ;bsf         WR_OK
    ;call        DELAY_250
    ;call        DELAY_250
    ;bcf         WR_OK
    ;bsf         SPD
    ;call        DELAY_250
    ;call        DELAY_250
    ;bcf         SPD
    
	      
	      
	      

