;***************************************************************************
;* UP2016.ASM: Upcounter 0 - 99 with the SLO2016
;*
;* Copyright ©2002 Rob's ElectroSoft
;*
;* RES can be reached by email: at90s2313@europe.com
;* Website: http://www.attiny.com
;*
;* Version           :1.0
;* Target MCU        :AT90S1200-12PI@4MHz
;* Date		     :04-06-2002
;***************************************************************************

.device AT90S1200
.include "1200def.inc"

		rjmp	RESET		;reset handle



;* long delay (50 msec)

;* Register variables

	.def  T1	= r1
	.def  T2	= r2
	.def  tmp	= r16

;* Defines

;* Code

longDelay:      
	clr   T1			;T1 used as delay 2nd count
	clr   T2			;T2 used as delay 3d count
delay_1:    
	dec   T2
	brne  delay_1            
	dec   T1
	brne  delay_1           
	dec   tmp			;tmp must be preset as 
	brne  delay_1			; delay master count
	ret                     



;* Pinning defenitions AT90S1200 -> SLO2016

;* Defines

	.equ	BL       = 7		;Blanking at PB7
	.equ	D6	 = 6		;D6 Data at PB6
	.equ	D5	 = 5		;D5 Data at PB5
	.equ	D4	 = 4		;D4 Data at PB4
	.equ	D3	 = 3		;D3 Data at PB3
	.equ	D2	 = 2		;D2 Data at PB2
	.equ	D1	 = 1		;D1 Data at PB1
	.equ	D0	 = 0		;D0 Data at PB0
	.equ	A1	 = 6		;A1 Address at PD6
	.equ	A0	 = 5		;A0 Address at PD5
	.equ	WR	 = 4		;WR Write at PD4
	.equ	CLR	 = 3		;CLR Clear at PD3

;* Register variables

	.def	temp	 = r17		;temporary data
	.def	units	 = r18		;units
	.def	tens	 = r19		;tens




;* Show displays (when first shown also second is shown -> by WR)

;* Code

showFirst:
	cbi	PORTD, A0		;activate digit0
	ldi	temp, 0x30		;start from char '0' in ROM
	add	temp, units
	out	PORTB, temp		;set data on digit3
	sbi	PORTB, BL		;displays On
	ret

showSec:
	sbi	PORTD, A0		;activate digit1
	ldi	temp, 0x30		;start from char '0' in ROM
	add	temp, tens
	out	PORTB, temp		;put data on digit3
	sbi	PORTB, BL		;displays On
	ret



;* Main program (includes RESET)

;* 1st all settings and init SLO2016

;* Code

RESET:	ser	temp			;all outputs
	out	DDRB, temp		;at Port B
	cbi	PORTB, BL		;displays Off first
	out	DDRD, temp		;at Port D
	cbi	PORTD, A0		;start with digit0
	cbi	PORTD, A1		;A1 stays lo al the time
	sbi	PORTD, CLR		;Clear high
	cbi	PORTD, WR		;WR low

;* Reset digits -> show [  00] on display

start:	ldi	temp, 0x30		;zero digit ('0' = 0x30 in ROM)
	out	PORTB, temp		; (see ASCII table datasheet)
	sbi	PORTD, A0		;activate digit1
	out	PORTB, temp
	sbi	PORTB, BL		;display On
	ldi	tmp, 5			;wait for 0.25 secs
	rcall	longDelay
	clr	units			;zero 'units'
	clr	tens			;zero 'tens'

;* start counting process

incUnits:
	inc	units			;start counting
	cpi	units, 10		;if 10 -> inc tens
	breq	incTens
	rcall	showFirst		;countup digit3
	ldi	tmp, 5			;wait 0.25 secs
	rcall	longDelay
	cbi	PORTB, BL		;displays Off
	rjmp	incUnits
incTens:
	clr	units			;reset units
	inc	tens			;count tens one upwards
	cpi	tens, 10		;after 10 times -> restart program 
	breq	start
	rcall	showSec			;countup digit2
	rcall	showFirst		;also show first
	ldi	tmp, 5			;wait 0.25 secs
	rcall	longDelay
	cbi	PORTB, BL		;displays Off
	rjmp	incUnits
