Hi, Here are some snippets that might work :) ** define buffer size, most effective is power of 2 sizes ( 2,4,8,16 etc ) ; rx buffer for serial communication RX_BUFFER_SIZE EQU 16 ; serial receive buffer allocation ( best when power of 2 ) ** declare buffer and pointers CBLOCK 0x020 RX_Buffer:RX_BUFFER_SIZE ; buffer for receving ; serial buffer RX and TX pointers, buffers located in bank1 RX_Buffer_InPtr:1 ; where to put next incomming byte RX_Buffer_OutPtr:1 ; where to get next ( first ) byte RX_Buffer_Count:1 ; how many we have in buffer ** how to add an byte ( in this case byte is in RCREG ) RX_CHECK_BUFFER MOVF RX_Buffer_Count,W ; test if we have room XORLW RX_BUFFER_SIZE BTFSC STATUS,Z GOTO RX_BUFFER_FULL MOVF RX_Buffer_InPtr,W ; get adress for indirect dressing MOVWF FSR ; setup fsr MOVF RCREG,W ; get received byte MOVWF INDF ; and store it in buffer INCF RX_Buffer_Count,F ; inc buffer counter ; update pointers INC_BUFFER RX_Buffer_InPtr,RX_Buffer,RX_BUFFER_SIZE RETURN RX_BUFFER_FULL ; no room handle accordingly ** how to check buffer and get byte if there are any ; *********************************************************************** ; ; RX_GET_BUFFER - Gets one byte from in serial rx buffer, if available ; If no bytes in buffer zero flag is set else zero flag is cleared ; ; RX_GET_BUFFER MOVF RX_Buffer_Count,F ; check if anything available ? BTFSC STATUS,Z ; RETURN ; nope, nothing there, NOTE zero flag set ! ; get pointer MOVF RX_Buffer_OutPtr,W MOVWF FSR ; setup FSR ; update buffer pointers INC_BUFFER RX_Buffer_OutPtr,RX_Buffer,RX_BUFFER_SIZE ; get byte to W MOVF INDF,W ; decrement counter DECF RX_Buffer_Count,F BCF STATUS,Z ; make sure zero flag is clear RETURN ** and the allmighty macro that performs the pointer 'wrapping' ;+++++ ; INC_BUFFER advance buffer pointers wrap if necessary ; ; If buffer size is power of two, and buffer is aligned ; on an multiple of twice it size, this macro generates ; two instructions, Otherwise it generates six instructions. ; Originator: Eric Smith, eric@brouhaha.com for non-comercial use. INC_BUFFER MACRO Pointer, Base, Size LOCAL POWER_OF2, ALIGNED,BIT,VALUE POWER_OF2 SET !(Size&(Size-1)) ; calculate if power of 2 ALIGNED SET POWER_OF2&&((Base&(Size-1))==0) ; calculate if aligned IF ALIGNED VALUE SET Size BIT SET 0 WHILE VALUE>1 BIT SET BIT+1 VALUE SET VALUE>>1 ENDW ENDIF INCF Pointer,F ; increase pointer IF ALIGNED&&!(Base&(1<