timer_top:
.equ timer_size = timer_top - timer_base
-.equ clkofs = cnt_1ms-cntms_out
+.equ utofs = cnt_1ms-cntms_out
.equ timerofs = cnt_1ms-timer_ms
+clk_out:
+ .byte 6 ;
+clock:
+ .byte 6 ;Format (bin): Y M D H M S
+.equ clkofs = clock-clk_out
+
.cseg
; ------------- system timer 1ms ---------------
cpi zl,low(1000)
ldi zl,high(1000) ;doesn't change flags
cpc zh,zl
- brlo syscl_end
-
+ brge syscl_utime
+ rjmp syscl_end
+
+syscl_utime:
sts cnt_1ms,_0
sts cnt_1ms+1,_0
lds zl,uptime+0
inc zl
sts uptime+0,zl
- brne syscl_end
+ brne syscl_clk
lds zl,uptime+1
inc zl
sts uptime+1,zl
- brne syscl_end
+ brne syscl_clk
lds zl,uptime+2
inc zl
sts uptime+2,zl
- brne syscl_end
+ brne syscl_clk
lds zl,uptime+3
inc zl
sts uptime+3,zl
-
+
+syscl_clk:
+ lds zl,clock+5 ;sec
+ inc zl
+ sts clock+5,zl
+ cpi zl,60
+ brlo syscl_end
+ sts clock+5,_0
+ lds zl,clock+4 ;min
+ inc zl
+ sts clock+4,zl
+ cpi zl,60
+ brlo syscl_end
+ sts clock+4,_0
+ lds zl,clock+3 ;hour
+ inc zl
+ sts clock+3,zl
+ cpi zl,24
+ brlo syscl_end
+ sts clock+3,_0
+ push temp
+
+ ldiw z,dayspm_tab*2 - 1
+ lds temp,clock+1 ;month
+ add zl,temp
+ adc zh,_0
+ lpm zh,z ;days this month
+ cpi temp,2
+ brne syscl_clknf ;february, may be leap year
+ lds zl,(clock+0) ;year
+ andi zl,0xfc
+ brne syscl_clknl
+ inc zh ;leap year
+syscl_clknl:
+syscl_clknf:
+ lds zl,clock+2 ;day
+ inc zl
+ sts clock+2,zl
+ cp zh,zl
+ brsh syscl_clke
+ ldi zl,1
+ sts clock+2,zl
+ inc temp ;month
+ sts clock+1,temp
+ cpi temp,13
+ brlo syscl_clke
+
+ sts clock+1,zl
+ lds zl,clock+0 ;year
+ inc zl
+ sts clock+0,zl
+
+syscl_clke:
+ pop temp
syscl_end:
pop zh
pop zl
pop zl
reti
+; days per month
+
+dayspm_tab:
+ .db 31,28,31,30,31,30
+ .db 31,31,30,31,30,31
+
; ----------------------------------------------
; delay
;
clockget:
ldi temp,0xFF
- subi temp2,TIMER_MSECS
+ subi temp2,CLOCKPORT
brcs clkget_end ;Port number in range?
- ldiw z,cntms_out
+ ldiw z,clk_out
breq clkget_copy ;lowest byte requestet, latch clock
cpi temp2,6
brsh clkget_end ;Port number to high?
add zl,temp2
- brcc PC+2
- inc zh
+ adc zh,_0
ld temp,z
clkget_end:
ret
-
-
+
clkget_copy:
ldi temp2,6
cli
dec temp2
brne clkget_l
sei
- lds temp,cntms_out
+ lds temp,clk_out
;req. byte in temp
ret
clockput:
- subi temp2,TIMERPORT
+ subi temp2,CLOCKPORT
brcs clkput_end ;Port number in range?
- brne clkput_1
+
+ ldiw z,clk_out
+ breq clkput_copy ;lowest byte requestet, latch clock
+ cpi temp2,6
+ brsh clkput_end ;Port number to high?
+
+ add zl,temp2
+ adc zh,_0
+ st z,temp
+clkput_end:
+ ldiw z,clk_out
+ ret
+
+clkput_copy:
+ st z,temp
+ ldi temp2,6
+ cli
+clkput_l:
+ ld temp,z+
+ std z+clkofs-1,temp
+ dec temp2
+ brne clkput_l
+ sei
+ ldiw z,clk_out
+ ret
+
+; ----------------------------------------------
+;
+
+utimeget:
+ ldi temp,0xFF
+ subi temp2,TIMER_MSECS
+ brcs utimget_end ;Port number in range?
+ ldiw z,cntms_out
+ breq utimget_copy ;lowest byte requestet, latch clock
+ cpi temp2,6
+ brsh utimget_end ;Port number to high?
+
+ add zl,temp2
+ adc zh,_0
+ ld temp,z
+utimget_end:
+ ret
+
+
+
+utimget_copy:
+ ldi temp2,6
+ cli
+utimget_l:
+ ldd temp,z+utofs
+ st z+,temp
+ dec temp2
+ brne utimget_l
+ sei
+ lds temp,cntms_out
+ ;req. byte in temp
+ ret
+
+utimeput:
+ subi temp2,TIMERPORT
+ brcs utput__end ;Port number in range?
+ brne utput__1
; clock control
cpi temp,starttimercmd
breq timer_start
cpi temp,quitTimerCmd
- breq timer_quit
+ breq utput_quit
cpi temp,printTimerCmd
breq timer_print
cpi temp,uptimeCmd
- brne cp_ex
+ brne utcp_ex
rjmp uptime_print
-cp_ex:
+utcp_ex:
ret
-timer_quit:
+utput_quit:
rcall timer_print
rjmp timer_start
-clkput_1:
+utput__1:
dec temp2
ldiw z,cntms_out
- breq clkput_copy ;lowest byte requestet, latch clock
+ breq utput__copy ;lowest byte requestet, latch clock
cpi temp2,6
- brsh clkput_end ;Port number to high?
+ brsh utput__end ;Port number to high?
add zl,temp2
brcc PC+2
inc zh
st z,temp
-clkput_end:
+utput__end:
ret
-clkput_copy:
+utput__copy:
st z,temp
adiw z,5
ldi temp2,6
cli
-clkput_l:
- ldd temp,z+clkofs
+utput__l:
+ ldd temp,z+utofs
st z+,temp
dec temp2
- brne clkput_l
+ brne utput__l
sei
ret