ldy #len
loop:
lda source-1,y ; memory accesses: loads opcode, address, value
sta dest-1,y ; memory accesses: loads opcode, address, stores value
dey ; memory accesses: loads opcode
bne loop ; memory accesses: loads opcode, offset
So 4 instructions and a minimum of 9 memory accesses per byte copied, more if not in the zero page. Even unrolling the loop gets you down to 6.Compare this to the 8086:
mov cx, len
mov si, source
mov di, dest
rep movsb ; memory accesses: read the opcodes, then 1 load and 1 store per byte
Even forgetting about word moves, you're down to 2 memory accesses per byte. No instruction opcode or branching overhead.