PICers, OK, thanks to James Cameron, Wayne H. et al for that advice about indexed addressing. I'm starting to see the light. Let's say you want to send 4 bytes of data to a serial tx routine. How I'd *now* go about it looks like so :- CBLOCK 0x0C data_0 data_1 data_2 data_3 txbuf ByteCount ENDC PAGE org 0x00 start goto main ;********************************************************* ;PROCEDURES SECTION ;********************************************************* clear clrw clrf FSR ;Start with null values clrf INDF ;for FSR & INDF. movlw 0x0fe ;Put some random values movwf data_0 ;in the data registers movlw 0x05a movwf data_1 movlw 0x032 movwf data_2 movlw 0x0dc movwf data_3 retlw 0x00 tx_out nop ;A dummy serial tx routine return ;******************************************************* ;Begin MAIN PROGRAMME ;******************************************************* main call clear ;Set up the registers movlw 0x04 ;Initialise the counter movwf ByteCount movlw data_3 ;Initialise the pointer movwf FSR loop movf INDF,0 ;Get [FSR], the current data byte movwf txbuf ;Load it and ... call tx_out ;... then send it. decf FSR,1 ;Point to next data item down decfsz ByteCount ;At end of the data count? goto loop ;No - loop around fin goto $ ;Yes - stop here. end This works OK, the 4 data bytes are sent to tx_out in proper order. I'm not too happy about using ByteCount to keep track of things but testing for when data_0 is reached involves AND comparisons and more code. What I REALLY don't get is how you use dt or db or whatever to feed a block of bytes to an indexed routine like this one. Could one of you guys please explain like *exactly* what goes on with DT/DB ? Would you define data_0,1,2,3 and then fill'em individually (mighty clumsy) or define a block of contents or what? Yeah, I read the MPASM User's Guide but it still don't make a lotta sense. Ian -- http://www.piclist.com hint: The list server can filter out subtopics (like ads or off topics) for you. See http://www.piclist.com/#topics