]> cloudbase.mooo.com Git - avrcpm.git/blobdiff - avr/timer.asm
* avr/timer.asm
[avrcpm.git] / avr / timer.asm
index 2c8e2651c44be912981ad0d0f0d54a43cbf0ca9c..80e9fca44fafaa6077b007cc9a4d91a1ed87f9d8 100644 (file)
@@ -43,9 +43,15 @@ uptime:
 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 ---------------
@@ -93,27 +99,82 @@ syscl_t2n:
        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
@@ -121,6 +182,12 @@ syscl_end:
        pop     zl
        reti
 
+; days per month
+
+dayspm_tab:
+       .db     31,28,31,30,31,30
+       .db     31,31,30,31,30,31
+
 ; ----------------------------------------------
 ;      delay
 ;
@@ -140,22 +207,20 @@ dly_loop:
 
 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
@@ -165,57 +230,119 @@ clkget_l:
        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