I need to save a 32 bit variable to the flash. I am using the In Application Programming.I wrote a code starting from the function "program data byte" (in my case I made program_data_dword). The problem is that I receive the Warning: "REFERENCE MADE TO UNRESOLVED EXTERNAL", which means that the cpompiler does not find the code. I use the registers R4 to R7 to receive the long int value and R3 and R2 to save the address. Can anyone explain what I doing wrongly? Thanks. Amilcar Here is the code: ; ********************************************************************** ; function: iap_program_data_byte ; prototype: unsigned char iap_program_data_byte(unsigned char val, unsigned int addr); ; description: programs a dword in the flash. passed is the byte and the ; 16-bit address. zero is returned for success, non zero is returned for ; failiure. ; ********************************************************************** RSEG ?PR?_iap_program_data_dword?IAP _iap_program_data_dword: PUSH IE ; disable interrupts CLR EA MOV A,CMOD MOV R2,A ; store copy of CMOD JNB ACC.6,?IAPTWDOG ; if watchdog enabled then disable ANL CMOD,#0BFH ?IAPTWDOG: ORL AUXR1,#020H ; enable bootrom MOV R0,iap_freq ; osc frequency MOV R1,#02H MOV DPH,R2 ; address to program MOV DPL,R3 MOV A ,R4 ; data to write CALL 0FFF0H ; call iap routine MOV R7,A ; id in accumulator INC DPTR MOV A,R5 ; data to write CALL 0FFF0H ; call iap routine MOV R7,A ; id in accumulator INC DPTR MOV A,R6 ; data to write CALL 0FFF0H ; call iap routine MOV R7,A ; id in accumulator INC DPTR MOV A ,R7 ; data to write CALL 0FFF0H ; call iap routine MOV R7,A ; id in accumulator ANL AUXR1,#0DFH ; disable bootrom MOV CMOD,R2 ; restore CMOD (restore watchdog state) POP IE ; restore interrupts to initial state RET ; end of iap_program_data_dword