; ************************************
; * PEK's Running Lights  '2000
; * My first program.. =)
; *
; * The program also show how simple
; * external interrupts is.
; *
; * Running lights : Pin 0 - 7, Port B
; * Reset : Pin 2 low, Port D
; ************************************


.include "8515def.inc"


; ************************************
; * Variable Definitions             
; ************************************
.equ	RIGHT	=1
.equ	LEFT	=0

.def	direc	=R16
.def	temp	=R17


; ************************************
; * Start of Code                    
; ************************************
.cseg
.org 0
	rjmp	start
	rjmp	button_int		; External ISR
	reti
	reti


start:	ldi	temp,low(RAMEND)
	out	SPL,temp		; Set stack pointer to last internal RAM location
	ldi	temp,high(RAMEND)
	out	SPH,temp
	
	ldi	direc,LEFT		; Direction = Left	

	ldi	XL,0xFB
	out	DDRD,XL			; Port D, Pin 7 as input and
	ldi	XL,0x04			; enable Pull-Up
	out	PORTD,XL	
	
	ldi	XL,0x40			; Enable INT0
	out	GIMSK, XL
	cli				; Disable global interrupts

	ldi	XL,0xFF
	out	DDRB,XL			; Port B as output 

	ldi	XL,0x02			; Second pin  
	clc				; Avoid Carry when shift

	sei				; Enable global interrupts
	
loop:	out	PORTB,XL		; Out to Port B

	rcall	half_sec_delay		; Delay ca 0,5 sec

	sbrs	direc,0			; If direction is Left
	rol	XL

	sbrc	direc,0			; If direction is Right
	lsr	XL

	sbrc	XL,0			; Change direction to left ?
	ldi	direc,LEFT

	sbrc	XL,7			; Change direction to Right ?
	ldi	direc,RIGHT

	rjmp	loop


button_int:				; External ISR
	ldi	XL,2			; Restart
	reti


half_sec_delay:				; A small delay
	ldi	r20, 3
	ldi	r21, 255
	ldi	r22, 255
delay:	dec	r22
	brne	delay
	dec	r21
	brne	delay
	dec	r20
	brne	delay
	ret
