.include "m8def.inc"

.def 	temp = r20
.def 	null = r2
.def	eins= r23
.def 	highByte = r18
.def 	channel = r19
.def	drem8u	=r15		;remainder
.def	dres8u	=r16		;result
.def	dd8u	=r16		;dividend
.def	dv8u	=r17		;divisor
.def    Zehner =r21
.def 	Einer =r22	

	
.org 0x000
	rjmp main
.org  adccaddr
	rjmp datenverarbeitung
	
main:
	ldi temp,((1<<SE)|(1<<SM0))
	out mcucr,temp
	sei
	
	ldi temp , low(ramend) ; Stackpointer initialisieren
	out spl, temp
	ldi temp, High(ramend)
	out sph,temp	
	
	clr null
	
	ldi temp, 0xFF	; Port D als Ausgang
	out DDRD, temp
	out PORTD, temp
	ldi temp, 0xff
	
	out ddrb, temp	; Port B als Ausgang (multiplex)
	ldi temp, 0x00
	out portb,temp
	
	ldi channel, ((1<<REFS0)|(1<<ADLAR)|(1<<MUX0))			;(aenderung durchgefuehrt refs0 gesetzt)
	out ADMUX, channel										; Kanal einstellen und nur auf adch lesen

	ldi temp, ((1<<ADEN)|(1<<ADSC)|(1<<ADIE)) + 7 ; ADC initialisieren mit "ohne free Run" und Vorteiler 128:
	out ADCSR, temp
;	sbi ADCSR, ADIF 						; logisch "1" löscht ADIF flag !
;wait2: 										;  neuen ADC-Wert lesen
;	sbis ADCSR, ADIF
;	rjmp wait2

rjmp main


Datenverarbeitung:
	sbis adcsr,adif
	in highByte, ADCH 						; ADC einlesen:

	mov temp, highbyte


	ldi zl,low(tabelle*2)
	ldi zh,high(tabelle*2)
	add zl,temp
	adc zh,null
	lpm temp,z
	
	mov dd8u,temp
	ldi dv8u,0b00001010
	
	
	

										;dividierroutine



div8u:	sub	drem8u,drem8u	;clear remainder and carry				
	
	rol	dd8u		;shift left dividend
	rol	drem8u		;shift dividend into remainder
	sub	drem8u,dv8u	;remainder = remainder - divisor
	brcc	d8u_1		;if result negative
	add	drem8u,dv8u	;    restore remainder
	clc			;    clear carry to be shifted into result
	rjmp	d8u_2		;else
d8u_1:	sec			;    set carry to be shifted into result

d8u_2:	rol	dd8u		;shift left dividend
	rol	drem8u		;shift dividend into remainder
	sub	drem8u,dv8u	;remainder = remainder - divisor
	brcc	d8u_3		;if result negative
	add	drem8u,dv8u	;    restore remainder
	clc			;    clear carry to be shifted into result
	rjmp	d8u_4		;else
d8u_3:	sec			;    set carry to be shifted into result

d8u_4:	rol	dd8u		;shift left dividend
	rol	drem8u		;shift dividend into remainder
	sub	drem8u,dv8u	;remainder = remainder - divisor
	brcc	d8u_5		;if result negative
	add	drem8u,dv8u	;    restore remainder
	clc			;    clear carry to be shifted into result
	rjmp	d8u_6		;else
d8u_5:	sec			;    set carry to be shifted into result

d8u_6:	rol	dd8u		;shift left dividend
	rol	drem8u		;shift dividend into remainder
	sub	drem8u,dv8u	;remainder = remainder - divisor
	brcc	d8u_7		;if result negative
	add	drem8u,dv8u	;    restore remainder
	clc			;    clear carry to be shifted into result
	rjmp	d8u_8		;else
d8u_7:	sec			;    set carry to be shifted into result

d8u_8:	rol	dd8u		;shift left dividend
	rol	drem8u		;shift dividend into remainder
	sub	drem8u,dv8u	;remainder = remainder - divisor
	brcc	d8u_9		;if result negative
	add	drem8u,dv8u	;    restore remainder
	clc			;    clear carry to be shifted into result
	rjmp	d8u_10		;else
d8u_9:	sec			;    set carry to be shifted into result

d8u_10:	rol	dd8u		;shift left dividend
	rol	drem8u		;shift dividend into remainder
	sub	drem8u,dv8u	;remainder = remainder - divisor
	brcc	d8u_11		;if result negative
	add	drem8u,dv8u	;    restore remainder
	clc			;    clear carry to be shifted into result
	rjmp	d8u_12		;else
d8u_11:	sec			;    set carry to be shifted into result

d8u_12:	rol	dd8u		;shift left dividend
	rol	drem8u		;shift dividend into remainder
	sub	drem8u,dv8u	;remainder = remainder - divisor
	brcc	d8u_13		;if result negative
	add	drem8u,dv8u	;    restore remainder
	clc			;    clear carry to be shifted into result
	rjmp	d8u_14		;else
d8u_13:	sec			;    set carry to be shifted into result

d8u_14:	rol	dd8u		;shift left dividend
	rol	drem8u		;shift dividend into remainder
	sub	drem8u,dv8u	;remainder = remainder - divisor
	brcc	d8u_15		;if result negative
	add	drem8u,dv8u	;    restore remainder
	clc			;    clear carry to be shifted into result
	rjmp	d8u_16		;else
d8u_15:	sec			;    set carry to be shifted into result

d8u_16:	rol	dd8u		;shift left dividend

	ldi temp,0xff
	
	mov zehner,dres8u
	mov einer ,drem8u

	ldi r29 ,0x00
	ldi r28 ,0xff

jump1:


	ldi eins, 0x01
	ldi zl,low(tabelle*2)
	ldi zh,high(tabelle*2)
	add zl,zehner
	adc zh,eins
	ldi r24,0x02
	out portb,r24
	lpm temp,z
	out portd,temp

; ============================= 
;   Warteschleifen-Generator 
;     1000 Zyklen:
; ----------------------------- 
; warte 999 Zyklen:
          ldi  R30, $03
WGLOOP0:  ldi  R31, $6E
WGLOOP1:  dec  R31
          brne WGLOOP1
          dec  R30
          brne WGLOOP0
; ----------------------------- 
; warte 1 Zyklus:
          nop
; ============================= 



	ldi eins ,0x01
	ldi zl,low(tabelle*2)
	ldi zh,high(tabelle*2)
	add zl,einer
	adc zh,eins
	ldi r24,0x04
	out portb,r24
	lpm temp,z
	out portd,temp
	
; ============================= 
;   Warteschleifen-Generator 
;     1000 Zyklen:
; ----------------------------- 
; warte 999 Zyklen:
          ldi  R30, $03
WGLOOP3:  ldi  R31, $6E
WGLOOP4:  dec  R31
          brne WGLOOP4
          dec  R30
          brne WGLOOP3
; ----------------------------- 
; warte 1 Zyklus:
          nop
; ============================= 
	
	dec r28
	cpse r28,r29
	rjmp jump1



reti




tabelle:																;Tabelle
.db 3,3 ;2
.db 3,3	;4
.db 4,4	;6
.db 4,4	;8
.db 4,4	;10
.db 4,4	;12
.db 4,4	;14
.db 4,4	;16
.db 4,4	;18
.db 4,4	;20
.db 4,4	;22
.db 4,4	;24
.db 4,4	;26
.db 5,5	;28
.db 5,5	;30
.db 5,5	;32
.db 5,5	;34
.db 5,5	;36
.db 5,5	;38
.db 5,5	;40
.db 5,5	;42
.db 5,6	;44
.db 6,6	;46
.db 6,6	;48
.db 6,6	;50
.db 6,6	;52
.db 6,6	;54
.db 6,6	;56
.db 6,6	;58
.db 6,6	;60
.db 7,7	;62
.db 7,7	;64
.db 7,7	;66
.db 7,7 ;68
.db 7,8 ;70
.db 8,8	;72
.db 8,8	;74
.db 8,8	;76
.db 8,8 ;78
.db 8,8 ;80
.db 8,8	;82
.db 8,8 ;84
.db 9,9 ;86
.db 9,9 ;88
.db 9,9 ;90
.db 9,9 ;92
.db 9,9 ;94
.db 9,9 ;96
.db 9,10;98
.db 10,10;100
.db 10,10;102
.db 10,10;104
.db 10,10;106
.db 10,10;108
.db 10,10;110
.db 10,10;112
.db 11,11;114
.db 11,11;116
.db 11,11;118
.db 11,11;120
.db 11,11;122
.db 11,12;124
.db 12,12;126
.db 12,12;128
.db 13,13;130
.db 13,13;132
.db 13,13;134
.db 13,13;136
.db 13,13;138
.db 13,13;140
.db 14,14;142
.db 14,14;144
.db 14,15;146
.db 15,15;148
.db 15,15;150
.db 15,16;152
.db 16,16;154
.db 16,16;156
.db 17,17;158
.db 17,17;160
.db 17,17;162
.db 18,18;164
.db 18,18;166
.db 19,19;168
.db 19,19;170
.db 19,19;172
.db 19,19;174
.db 19,20;176
.db 21,21;178
.db 21,21;180
.db 22,22;182
.db 22,23;184
.db 23,23;186
.db 23,24;188
.db 24,25;190
.db 25,26;192
.db 26,26;194
.db 27,27;196
.db 27,27;198
.db 27,28;200
.db 29,29;202
.db 29,29;204
.db 29,29;206
.db 30,30;208
.db 30,31;210
.db 31,32;212
.db 32,34;214
.db 34,34;216
.db 35,35;218
.db 35,36;220
.db 36,36;222
.db 37,37;224
.db 38,38;226
.db 38,38;228
.db 40,41;230
.db 43,43;232
.db 44,44;234
.db 45,46;236
.db 47,47;238
.db 48,48;240
.db 49,50;242
.db 50,55;244
.db 58,58;246
.db 58,59;248
.db 61,62;250
.db 63,66;252
.db 66,67;254
.db 74,74;256
.db 0b00000011	,0b10011111		;	0	und	1		'7- Segment Code
.db	0b00100101  ,0b00001101		;	2	und 3
.db	0b10011001	,0b01001001		;	4	und	5
.db 0b11000001	,0b00011111		;	6	und 7
.db 0b00000001	,0b00011001		;	8	und	9


