

 
 HIGHADDRESS      EQU    04H ; get high address
 LOWADDRESS       EQU    40H ; get LOW  address
 LOAD             EQU    00H ; LOAD COMMAND
 ERASE            EQU    68H ; ERASE COMMAND
 COUNT            EQU    64  ; NUMBER OF BYTES IN THE PAGE TO BE ERASED
 DATA_ERASE	  EQU	 00H ; 00 TO ERASE
 DATA_PROGRAM	  EQU	 32H ; VALUES TO BE WRITTEN (for example "32H")
 	
IAP_CODE:	
                CLR EA       	; INTERRUPTS DISABLED
		MOV R3,#COUNT	
		MOV R4,#HIGHADDRESS 
		MOV R5,#LOWADDRESS
		MOV FMCON,#LOAD
		MOV FMADRH,R4
		MOV FMADRL,R5			
LOAD_PAGE:	MOV FMDATA,#DATA_ERASE	; TO ERASE THE ADDRESSES		
                NOP                     ; BETWEEN 440H TO 480H
		DJNZ R3,LOAD_PAGE	; 64 BYTES ERASE			
		MOV FMCON,#ERASE
		MOV A,FMCON
		ANL A,#0FH				
		JNZ BAD
		CLR C				
		MOV R3,#COUNT
		MOV R4,#HIGHADDRESS    
		MOV R5,#LOWADDRESS
		MOV FMADRH,R4
		MOV FMADRL,R5	
LOAD_PAGEONE:	MOV FMDATA,#DATA_PROGRAM ; TO WRITE TO ADDRESSES
                NOP			 ; 440H TO 480H		
		DJNZ R3,LOAD_PAGEONE	 ; 64 BYTES WRITE			
                MOV FMCON,#ERASE
		MOV A,FMCON
		ANL A,#0FH				
		JNZ BADWRITE
		CLR C               ; CLEAR ERROR FLAG IF GOOD
		JMP SEND_FLASH_END	
BADWRITE:       SETB C           ; SET ERROR FLAG IF NOT WRITTEN
		JMP SEND_FLASH_END
BAD:       	SETB C
SEND_FLASH_END: SETB EA	      	; INTERRUPTS ENABLED			
		RET  

