PROCESSOR 18F4550
#include <xc.inc>

PSECT mycode

    ; ---- Step 1: put 5 data bytes in the source block (20H-24H) ----
    LFSR    0, 020H         ; FSR0 -> 20H
    MOVLW   011H
    MOVWF   POSTINC0, a     ; 20H = 11H, FSR0 -> 21H
    MOVLW   022H
    MOVWF   POSTINC0, a     ; 21H = 22H
    MOVLW   033H
    MOVWF   POSTINC0, a     ; 22H = 33H
    MOVLW   044H
    MOVWF   POSTINC0, a     ; 23H = 44H
    MOVLW   055H
    MOVWF   POSTINC0, a     ; 24H = 55H

    ; ---- Step 2: set up pointers and counter ----
    LFSR    0, 020H         ; FSR0 -> source start (20H)
    LFSR    1, 040H         ; FSR1 -> destination start (40H)
    MOVLW   5
    MOVWF   30H, a          ; counter = 5 bytes, kept at 30H

    ; ---- Step 3: copy loop ----
COPY_LOOP:
    MOVF    POSTINC0, W, a  ; W = source byte, FSR0++
    MOVWF   POSTINC1, a     ; destination = W, FSR1++
    DECFSZ  30H, F, a       ; counter--, skip next if counter = 0
    BRA     COPY_LOOP       ; repeat until all bytes are copied

HERE:
    GOTO    HERE
