Michael, the first problem is the consecutive loading of W at the end of the example routine. Reading EEDAT is pointless as W just gets written over in the next instruction. It's a routine they've been publishing ever since the F877 and probably before that. Sigh I use this on an F877 and it works OK get_mem bank0 movf addhigh,w ;address high bank2 movwf eeadrh bank0 movf addlow,w ;address low bank2 movwf eeadr bank3 bsf eecon1,eepgd ;program memory bsf eecon1,rd bank2 movf eedata,w bank0 movwf lo ;store data low byte bank2 movf eedath,w bank0 movwf hi ;store data high byte return These are the macros for banking, but you could use banksel instead (eg banksel addhigh and so on) bank0 macro bcf status,rp0 bcf status,rp1 bcf status,irp endm bank1 macro bsf status,rp0 bcf status,rp1 bcf status,irp endm bank2 macro bcf status,rp0 bsf status,rp1 bcf status,irp endm bank3 macro bsf status,rp0 bsf status,rp1 bcf status,irp endm -- http://www.piclist.com PIC/SX FAQ & list archive View/change your membership options at http://mailman.mit.edu/mailman/listinfo/piclist