Hi Rob, this macro may help. It breaks down a 3-byte number into 3 RAM bytes. ptr_low, ptr_high, ptr_upper are bytes in RAM (in that order). The disadvantage of a macro is the space it uses, but you didn't say why you wanted an alternative (fed up typing or short of space) You could make the macro a call instead, and get the 3-byte number back from a 1-byte table address. Or use two FSRs to store TBLPTR as you go, rather than having a temporary array, but movff is probably just as quick or quicker than another FSR HTH load_ptr macro litval,ptr_low clrf fsr0h movlw ptr_low ;fsr0 = first byte of array movwf fsr0l movlw litval & H'FF' ;get / mask literal -> LSB movwf indf0 ;store in ptr_low movlw litval >> D'08' & H'FF' ;get / mask next byte -> NSB incf fsr0l ;point to ptr_high movwf indf0 ;store movlw litval >> D'16' & H'FF' ;get / mask next byte -> MSB incf fsr0l ;point to ptr_upper movwf indf0 ;store movff ptr_upper,tblptru ;retrieve movff ptr_high,tblptrh movff ptr_low,tblptrl ENDM To use it, eg load_ptr 0x123456,ptr_low will make TBLPTR = 0x123456 or name the string start addresses, eg txt1 set 0x013789 txt2 set 0x007814 load_ptr txt1,ptr_low will make TBLPTR = 0x013789 and so on -- http://www.piclist.com PIC/SX FAQ & list archive View/change your membership options at http://mailman.mit.edu/mailman/listinfo/piclist