 
 ; 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
	;
             UDATA_OVR
LOOP1        RES          .1
LOOP2        RES          .1
flag         RES          .1
PROG_DATA_LO RES          .1
PROG_DATA_HI RES          .1
PROG_ADDR_LO RES          .1
PROG_ADDR_HI RES          .1
;DATA_ADDR    RES         .1


    
             UDATA_SHR
ADDRH        RES          .1
ADDRL        RES          .1
REG1	RES	.1
T.REG1	RES	.1 

data_lo      equ          05h
data_hi      equ          04h
	;
ST.ADR.RAM.BUF	EQU	0x120
ST.ADR.WR.FLASH	EQU	0x0710
;   
             #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 
;****************************************************************
;------------???????? ????-----------------
;****************************************************************
CYCLE 
             BANKSEL      0H
	MOVLW	.32
	MOVWF	T.REG1
	CLRF	REG1
	;
	MOVLW	LOW ST.ADR.RAM.BUF
	MOVWF	FSR1L
	MOVLW	HIGH ST.ADR.RAM.BUF
	MOVWF	FSR1H
	;
CYC.IT1	MOVF	REG1,W
	MOVWI	FSR1++
	INCF	REG1,F
	DECFSZ	T.REG1,F
	BRA	CYC.IT1
	;
	NOP
	
	
	
	

             Call         WRITE_MEM
WM1	NOP
	NOP
	NOP
	BRA	WM1
    
             BANKSEL      0H
             ;
             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
	;
             MOVLW	HIGH ST.ADR.WR.FLASH
             MOVWF        PMADRH    ;
             MOVLW	LOW ST.ADR.WR.FLASH
             MOVWF        PMADRL    ;
	;
             MOVLW        LOW ST.ADR.RAM.BUF ; Load initial data address
             MOVWF        FSR0L     ;
             MOVLW        HIGH ST.ADR.RAM.BUF ; Load initial data address
             MOVWF        FSR0H     ;
	;
	CLRF	PMCON1
             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
	ANDLW	0FH
	XORLW	0FH
	BTFSC	STATUS,Z
	BCF          PMCON1,LWLO
	
WRF.IT2      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                                   ; loads program memory write latches
             NOP                    ;
             INCF         PMADRL,F  ; Still loading latches Increment address
	BTFSC	PMCON1,LWLO
             GOTO         LOOP      ; Write next latches              
             ;
             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
    
        
        
        

