;*******************************************************************************
;*
;*	Titel:	Push un Pop auf dem Stapel beobachten
;*		(B102_test_stack_push_pop_2.asm)
;*
;*	Datum:	30/08/07	Version:	0.1	
;*	Autor:	WEIGU
;*
;*	Simulation:
;*	Prozessor:	ATmega32
;*	
;*	Informationen zur Funktionsweise:
;*	
;*	Der Stapel wird mit Studio 4 beobachtet.
;*			
;*******************************************************************************

;-------------------------------------------------------------------------------
;	Assembler Direktiven (u.a. Definitionsdatei einbinden)
;-------------------------------------------------------------------------------
.NOLIST				;List-Output ausschalten
.INCLUDE "m32def.inc"		;AVR-Definitionsdatei einbinden
.LIST				;List-Output wieder einschalten
.CSEG				;was ab hier folgt kommt in den Flash-Speicher

;-------------------------------------------------------------------------------
;	Startadresse 0x0000 und ueberspringe ISR Vektoren
;-------------------------------------------------------------------------------
.ORG	0x0000			;Programm beginnt an der SRAM-Adresse 0h
RESET:	rjmp	INIT		;springe nach INIT

;-------------------------------------------------------------------------------
;	Sprungadressen fuer die Interrupts organisieren (ISR VECTORS)	
;-------------------------------------------------------------------------------
.ORG	INT_VECTORS_SIZE	;Platz fuer ISR Vektoren lassen

;-------------------------------------------------------------------------------
;	Initialisierungen und eigene Definitionen
;-------------------------------------------------------------------------------
INIT:
.DEF	Tmp1 = r16		;Register 16 dient als erster Zwischenspeicher

	;Stapel initialisieren (fuer Unterprogramme bzw. Interrupts)
	ldi	Tmp1,HIGH(RAMEND);RAMEND (SRAM) ist in der Definitions-
	out	SPH,Tmp1	 ;datei festgelegt	
	ldi	Tmp1,LOW(RAMEND)
	out	SPL,Tmp1

;-------------------------------------------------------------------------------
;	Hauptprogramm
;-------------------------------------------------------------------------------
MAIN:	ldi	r17,0x11	;Register 17 initialisieren
	ldi	r18,0x22	;Register 18 initialisieren
	rcall	SR1		;Unterprogramm aufrufen
	nop			;no operation
	rjmp	MAIN		;Weiter

;-------------------------------------------------------------------------------
;	Unterprogramme
;-------------------------------------------------------------------------------
SR1:	push	r17		;Verwendeten Register retten
	push	r18
	ldi	r17,0x33	;Register 17 fuer lokale Verwendung SR1 init.
	rcall	SR2		
	pop	r18		;Verwendete Register wiederherstellen		
	pop	r17
	ret			;Zuruek ins Hauptprogramm
SR2:	push	r17		;Verwendeten Register retten
	ldi	r17,0x44	;Register 17 fuer lokale Verwendung SR2 init.
	pop	r17		;Verwendete Register wiederherstellen		
	ret			;Zuruek ins Hauptprogramm


;-------------------------------------------------------------------------------
.EXIT				;Ende des Quelltextes
