*=$C000 ; Generic memcpy optimized for speed. No overlapping ; fcatrin@gmail.com ; ; Copy operation is divided in two parts. N is the total length ; * memcpyLong for N / 256 blocks ; * memcpyShort for N % 256 remaining bytes memcpySrc = $E0 memcpyDst = $E2 memcpyLen = $E4 ; set for characters lda #$95 sta memcpySrc lda #$35 sta memcpySrc+1 lda #$00 sta memcpyDst lda #$04 sta memcpyDst+1 lda #$E8 sta memcpyLen lda #$03 sta memcpyLen+1 jsr memcpy ; set for attributes lda #$95 sta memcpySrc lda #$39 sta memcpySrc+1 lda #$00 sta memcpyDst lda #$d8 sta memcpyDst+1 lda #$E8 sta memcpyLen lda #$03 sta memcpyLen+1 jsr memcpy rts memcpy ldy #0 ldx memcpyLen+1 beq memcpyShort ; We need only the short version for <1 pages memcpyLoopLong ; Copy X pages lda (memcpySrc),y ; Loop unrolling can be done with confidence here sta (memcpyDst),y ; any power of 2 will work iny bne memcpyLoopLong dex beq memcpyShort inc memcpySrc+1 ; Go to the next page inc memcpyDst+1 jmp memcpyLoopLong memcpyShort ; Copy remaining bytes ldx memcpyLen beq memcpyEnd memcpyLoopShort ; Copy X bytes lda (memcpySrc),y sta (memcpyDst),y iny dex bne memcpyLoopShort memcpyEnd rts