;first.asm
			; copia para RAM um vetor de caracteres ASCII terminado pelo valor binário 0,
			; e incrementa cada elemento do vetor na RAM: A vira B, B vira C e assim por diante;
			; o vetor está inicialmente armazenado na memória de programa, após as instruções
			; MC404 - Prof. Célio Guimarães
			; Criado em 17 Ago 2007 Atualizado em 12/03/2008.
;**********************************************************************************************************************************************
.nolist
.include "m88def.inc"
.list
.def    r	=r16		; usado na inicialização dos apontadores da pilha e iinicio da RAM
start:
	rjmp	RESET		; salta sobre eventuais vetores de interrupção
	; se tivermos rotinas de interrupção os vetores (saltos para as rotinas) estariam aqui
	; vetor 1
    	; etc
;********************************************************************************

RESET:				; início do programa
	ldi	r,low(RAMEND)	;fim da RAM: definido em m88def.inc
	out	SPL,r		;inicializa Stack Pointer		
	ldi	r,high(RAMEND)
	out	SPH, r
	ldi yh, high(SRAM_START)	; Area de RAM onde será colocado o vetor de caracters ASCII
	ldi yl, low(SRAM_START)

	ldi zh, high(vetor*2)	; Z aponta para o inicio do vetor com valores ASCII
	ldi zl, low(vetor*2)
	
loop:				; copia o vetor para o início da RAM
	lpm			; r0 recebe um byte do vetor na area de programa
   	st	y+,r0		; transfere para RAM, y aponta para próximo byte
	or	r0,r0		; chegamos ao final do vetor?
	breq passo2		; sim, proximo passo, 
	adiw zh:zl,1		; não, incrementa Z (16 bits) p/ apontar para o próx elemento 
	rjmp loop		; volta ao laço

passo2:
 	ldi yh, high(SRAM_START)	; inicio da area de RAM onde foi colocado o vetor ASCII
	ldi yl, low(SRAM_START)
loop2:				; laço para  percorrer o vetor e alterá-lo
    ld r0, y		; r0 recebe um elemento do vetor	
	or r0,r0		; chegamos ao final do vetor?
	breq done		; sim, terminamos
	inc r0			; não, incrementa o byte lido (A passa a ser B, etc),
	st y+,r0		; e poe de volta na memória RAM, faz y aponta para próximo elemento,
	rjmp loop2		; volta ao laço
done:
    	rjmp done		; fim: não fazemos mais nada (laço infinito)

vetor:				; vetor na memórisa de programa contendo os caracteres ASCII A até Z
	.db 	'A','B'
	.db 	'C','D'
	.db	'E','F'
	.db	'G','H'
	.db	'I','J'
	.db	'K','L'
	.db	'M','N'
	.db	'O','P'
	.db	'Q','R'
	.db	'S','T'
	.db	'U','V'
	.db	'W','X'
	.db	'Y','Z'
 	.db	 0		; marcador de fim do vetor de caracteres (como na linguagem C)
