;**** A P P L I C A T I O N N O T E A V R 1 0 2 ************************
;*
;* Title: Block Copy Routines
;* Version: 1.1
;* Last updated: 97.07.04
;* Target: AT90Sxx1x (Devices with SRAM)
;*
;* Support E-mail: avr@atmel.com
;*
;* DESCRIPTION
;* This Application Note shows how to copy a block of data from Program
;* memory to SRAM and from one SRAM area to another
;*
;***************************************************************************
.include "8515def.inc"
rjmp RESET ;reset handle
;***************************************************************************
;*
;* "flash2ram"
;*
;* This subroutine copies a block of data from the Program memory (Flash)
;* to the internal SRAM. The following parameters must be set up prior to
;* calling the subroutine:
;* Z-pointer: Flash block start address x 2 (WORD oriented code segment)
;* Y-pointer: ram block start address
;* romsize: block size
;*
;* Number of words :5 + return
;* Number of cycles :10 x block size + return
;* Low Registers used :1 (r0)
;* High Registers used :1 (flashsize)
;* Pointers used :Y, Z
;*
;***************************************************************************
;***** Subroutine Register variables
.def flashsize=r16 ;size of block to be copied
;***** Code
flash2ram:
lpm ;get constant
st Y+,r0 ;store in SRAM and increment Y-pointer
adiw ZL,1 ;increment Z-pointer
dec flashsize
brne flash2ram ;if not end of table, loop more
ret
;***************************************************************************
;*
;* "ram2ram"
;*
;* This subroutine copies one block of data from one SRAM area to another.
;* The following parameters must be set up prior to calling the subroutine:
;*
;* Z-pointer: start of RAM area to copy from
;* Y-pointer: start of RAM area to copy to
;* ramsize : size of block to copy
;*
;* Number of words :4 + return
;* Number of cycles :6 x block size + return
;* Low Registers used :1 (ramtemp)
;* High Registers used :1 (ramsize)
;* Pointers used :Y, Z
;*
;***************************************************************************
;***** Subroutine Register variables
.def ramtemp =r1 ;temporary storage register
.def ramsize =r16 ;size of block to be copied
;***** Code
ram2ram:
ld ramtemp,Z+ ;get data from BLOCK1
st Y+,ramtemp ;store data to BLOCK2
dec ramsize ;
brne ram2ram ;if not done, loop more
ret
;****************************************************************************
;*
;* Test Program
;*
;* This program copies 20 bytes of data from the Program memory to the SRAM
;* area beginning at location BLOCK1. It then makes a second copy to the
;* area beginning at location BLOCK2.
;*
;****************************************************************************
.equ BLOCK1 =$60 ;start address of SRAM array #1
.equ BLOCK2 =$80 ;start address of SRAM array #2
;***** Main Program Register variables
.def temp =r16 ;temporary storage variable
;***** Code
RESET:
ldi temp,low(RAMEND)
out SPL,temp ;init Stack Pointer
ldi temp,high(RAMEND)
out SPH,temp
;***** Copy 20 bytes ROM -> RAM
ldi ZH,high(F_TABLE*2)
ldi ZL,low(F_TABLE*2);init Z-pointer
ldi YH,high(BLOCK1)
ldi YL,low(BLOCK1) ;init Y-pointer
ldi flashsize,20
rcall flash2ram ;copy 20 bytes
;***** Copy 20 bytes RAM -> RAM
ldi ZH,high(BLOCK1)
ldi ZL,low(BLOCK1) ;init Z-pointer
ldi YH,high(BLOCK2) ;(not necessary in this specific case)
ldi YL,low(BLOCK2) ;init Y-pointer
ldi ramsize,20
rcall ram2ram ;copy 20 bytes
forever:rjmp forever ;eternal loop
F_TABLE:
.db 0,1 ;start of table (20 bytes)
.db 2,3
.db 4,5
.db 6,7
.db 8,9
.db 10,11
.db 12,13
.db 14,15
.db 16,17
.db 18,19