As part of a simulation of received data, I'm copying a text block from flash to RAM, then searching it for strings. There are 6 blocks of 150-odd bytes, each stored at 0x2800 + X*0x100, where X is block number 0 to 5 inclusive I'm not clear exactly how = works. It does, because I get what I wanted. Looking at txt_add in a Watch Window shows the address 2800 and the value 0007. txt_add is not mentioned in CBLOCK or anywhere else, only in this statement below. Address 2800 in Program Memory still shows the ASCII char "54" that was loaded with the .hex file, RAM location 0007 is 00 Anybody know ? Not overly important, just curious. Is it a "virtual" value that can't be seen directly ? ================= txt_add=0x002800 ;text base address clrf tab_os ;table offset, add to source base address copy_x lfsr fsr0,0x100 ;target RAM address movlw upper(txt_add) ;source base address, 0x002800 movwf tblptru movfw tab_os ;add X * 0x100 block offset addlw high(txt_add) movwf tblptrh movlw low(txt_add) movwf tblptrl incf tab_os ;increment for next block copy ;do copy ============================================== Research is what I'm doing when I don't know what I'm doing - Wernher von Braun -- http://www.piclist.com hint: PICList Posts must start with ONE topic: [PIC]:,[SX]:,[AVR]: ->uP ONLY! [EE]:,[OT]: ->Other [BUY]:,[AD]: ->Ads