; Code to count a new average value
; of new value and last average value.
; By PEK  '2000


.include "8515def.inc"


; ************************************
; * Register and Constant Definitions             
; ************************************
.def	temp	=R16


; ************************************
; * SRAM Allocations
; ************************************
.dseg
speed:	.BYTE	2			; New speed
av_spd:	.BYTE	6			; Average speed


; ************************************
; * Start of Code                    
; ************************************
.cseg
.org 0

Start:
	ldi	temp,low(RAMEND)
	out	SPL,temp		; Set stack pointer to last internal RAM location
	ldi	temp,high(RAMEND)
	out	SPH,temp

AVS_Main_Loop:
	lds	XL,speed		; X = New speed
	lds	XH,speed+1
	lds	YL,av_spd		; Z:Y = All speeds together
	lds	YH,av_spd+1
	lds	ZL,av_spd+2
	lds	ZH,av_spd+3

	ldi	temp,0			; Add X to Z:Y
	add	YL,XL
	adc	YH,XH
	adc	ZL,temp
	adc	ZH,temp

	lds	XL,av_spd+4		; X = Number of values in Z:Y
	lds	XH,av_spd+5
	adiw	X,1			; Increase X

	sts	av_spd,YL		; Store everything in SRAM again
	sts	av_spd+1,YH
	sts	av_spd+2,ZL
	sts	av_spd+3,ZH
	sts	av_spd+4,XL
	sts	av_spd+5,XH
	rjmp	AVS_Main_Loop
