;számolás és kijelzés 00-99 ig
;****kiindulás s1-9.asm-ből***********
.include <m8def.inc>
;az a progi egy 7 szegmenses kijelzőn számol eccere 
;a két digiten.
;folyamatosan 0-tól 9-ig, a 8 bit a portC0-5ig és aB4
;a b5 a pont B0-3-ig a segmensek vezérlésére van
;az időzitést a Timer1 adja 1024-es előosztóval
;az r16 az idő számláló regiszter, figyelni alsó és felső
;4 biten a 1001-et
	.org	$0000
	rjmp	ELEJE		;reset handle
		
	.org	$0008		;timer1 tulcsordulás
	rjmp	IDOZITT		;10 ms időzittéshez

	.org	$0009		;timer0 kezelés
	rjmp	SZLM		;számlálás

	.def alsomaszk=r3
	.def felsomaszk=r4
	.def incf4bit=r5	;felső 4 bit növelés eggyel 0x10

	ldi r16,0x0F		;alsó 4 bit
	mov alsomaszk,r16			;az r3-ba betölés
	ldi r16,0xF0		;felső 4 bit kimaszkolása
	mov felsomaszk,r16			;r4 -be
	ldi r16,0x10		;0x10 betöltése a r5-be 
	mov incf4bit,r16	;felső fél byte incrementhez

ELEJE:					;innen kell kezdeni reset után
	ldi r16,HIGH(RAMEND);stack pointer
	out SPH,r16			;
	ldi r17,LOW(RAMEND)	;
	out SPL,r17			;beállittása

	rcall T1_INI


T0_INI:			;időzités kezdeti beállitása
	ldi	r16,0x05;presclalar 1024=0x05 1 az leosztás mentesen
	out	TCCR0,r16
	ldi	r17,0x00		;ilyenkor még nem lehet int!
	out TCNT0,r17		;hogy tesztnél legyen azonnal mexakitás
	ldi r18,(1<<TOIE0)
	out TIMSK,r18		;az int engedve
	sei					;global int engedve
	clr r16			;figyelő regiszter törlés


;kimenet:portC0-5 és portB4-5, kijelzővezérlés portB0-3	
;azaz a kijelző bekapcsolása(2 digitnél B)
	ldi r18,0x3f		;a pont a legutolsó biten van
	out	DDRB,r18		;a B port kimenetnek állitani
	out DDRC,r18		;a C port kimenetnek állitani
;3x kell végig számlálni az r20at 0ig
;	ldi r20,0x4		;3x
	rjmp MEM_INI
;	rcall MEM_INI	;kiiratás modul

SZLM:	;számlálás
ldi	r17,0x00	;ilyenkor még nem lehet int! és 0ról kezggye
out TCNT0,r17
dec r20			;r20 csökken
sei
cpi r20,0		;ha az r20 nulla, letelt a várakozási idő
pop r6
pop r7
brne LOOP		;ha nem 0 akkor a hurokba
ldi r20,0x04	;ha r20 0 volt, akkor 4-re állit

;********** r16 növelése ************
mov r17,r16	;r16 áttöltése az r17-be kiiráshoz
and r16,alsomaszk	;alsó4bit leválasztása
cpi r16,9		;az r16 9?
breq FELSOBE	;ha r16 = 9, akkor ugrás
inc r16			;r16 növelése akkor, ha kisebb mint9
VISSZA:	;ide ér vissza ha a felső4 bit lekezelése után

;**********r16növelése*vége***********

;IDOZITT: ;ide csak teszt erejéig ugrás
	push r6			;
	push r7			;
;	brlo MEM_INI	;ha kisebb akkor ugrás kiiráshoz




LOOP:
	nop
	nop
	nop
	rjmp LOOP					

;***************************************
SZAMOK:
C:   .DB $30,$1d,$0f,$32,$2b,$3b,$0e,$3F,$2f,$3f
B:	 .DB $00,$20,$20,$20,$20,$20,$00,$20,$20,$00
;   	  1  2    3   4   5   6   7   8   9   0

FELSOBE:	;r16 növelése ha az alsó 4 bit > 9
;pop r16	;r16 eredeti értékét visszaállitani
cpi r16, 0x99 ;r16 99?
breq NULLA ;ha 99 akkor nullázása az r16-ank
add r16,incf4bit
	;az alsó 4-t nullázni
and r16, felsomaszk ;az r16 also 4 bit törlése
rjmp VISSZA
NULLA:
clr r16
rjmp VISSZA


MEM_INI:	;számok megjelenitése
	ldi r30,low(2*SZAMOK)	; Load Z register low
	ldi r31,high(2*SZAMOK)	; Load Z register high
;*****első számjegy kiirása***********
	mov r17,r16		;szám az r17-be tovább a kiiroshoz
	and r17,alsomaszk
	add r30,r17			;az offszet az r17
	lpm
	mov r18,r0
	out PORTC,r18	;Cportra kiirás
	adiw z,10		;10 memórihellel többet cimez meg
	ldi r19,0x04	;a kijelzés engedélyezve alsó Bporton
	lpm
	add r19,r0		;a B portra kiirandó adat
	out PORTB,r19
;10ms KÉSLELTETÉS
;	rjmp SZLM ez most nem kell mer a második számjegyet
;********második számjegy kiirása*******
	mov r17,r16		;szám az r17-be tovább a kiiroshoz
	and r17,felsomaszk
	;4 léptetés balra, hogy az offszet jó legyen
	lsr r17
	lsr r17
	lsr r17
	lsr r17
	add r30,r17			;az offszet az r17
	lpm
	mov r18,r0
	out PORTC,r18	;Cportra kiirás
	adiw z,10		;10 memórihellel többet cimez meg
	ldi r19,0x08	;a kijelzés engedélyezve alsó Bporton
	lpm
	add r19,r0		;a B portra kiirandó adat
	out PORTB,r19
;10ms KÉSLELTETÉS
;	rjmp SZLM 

;**********kiirás vége**************
IDOZITT:
T1_INI: ;10ms hoz beállitás és felfelé számolás
	sei
	ldi r21,0x01		;nincs orajel előosztás
	out TCCR1B,r21			;
	ldi r21,0xd8		;a Timer1 beállitása 10 000
	ldi r22,0xef		;és innen számol majd lefelé
	out TCNT1H,r21		;először a felső byte
	out TCNT1L,r22		;utána az alsó
	ldi r21,(1<<TOIE1)	;int engedéj
	out TIMSK,R21		;10000 lépés :-)
	reti
