cseg ; time must be done from resident memory
?time:
inc c ;zero if ff
- ret nz ;nothing to do
-
ld c,3
+ jr z,time_set
+
+ ld a,(time_to)
+ or a
+ ret nz
+ dec c
+time_set:
b0call gs_rtc
+ ld a,0ffh
+ ld (time_to),a
ret
;----------------------------------------------------------------------
push hl
push de
- di
ld hl,(@date)
ld a,(@hour)
ld d,a
ld a,(@min)
ld e,a
ld a,(@sec)
- ei
ld b,a ;b = sec, c = subcommand
push hl ;2
push de ;4
pop de
pop hl
ld a,b
- di
ld (@sec),a
ld a,e
ld (@min),a
ld a,d
ld (@hour),a
ld (@date),hl
- ei
pop de
pop hl
ld hl,(f_cpu)
ld de,(f_cpu+2)
- ld bc,PRT_PRE * 100 ;1/100 s == 10 ms interrupt rate
+ ld bc,PRT_PRE * 800 ;1/800 s == 1,25 ms interrupt rate
call div32_16
out0 (tmdr0l),l
out0 (tcr),a
ret
+
;----------------------------------------------------------------------
; timer interrupt
;
-; 10 ms clock tick
+; 1,25 ms clock tick
cseg ;common!
in0 a,(tmdr0l)
in0 a,(tmdr0h)
- ld a,(counter_10ms) ;
- inc a
- cp 100 ;100 * 10ms ?
- jr nz,iprt_1
-
- ld a,(@sec)
- inc a
- daa
- cp 60h
- jr nz,iprt_2
-
- ld a,(@min)
- inc a
- daa
- cp 60h
- jr nz,iprt_3
-
- ld a,(@hour)
- inc a
- daa
- cp 24h
- jr nz,iprt_4
-
- push hl
- ld hl,(@date)
- inc hl
- ld (@date),hl
- pop hl
-
- xor a
-iprt_4:
- ld (@hour),a
- xor a
-iprt_3:
- ld (@min),a
- xor a
-iprt_2:
- ld (@sec),a
- xor a
+ push hl ;11
+ ld hl,uptime ; 9
+ inc (hl) ;10
+ jr nz,iprt_1 ;6/8 38
+ inc hl ; 4
+ inc (hl) ;10
+ jr nz,iprt_1 ;6/8 58
+ inc hl ; 4
+ inc (hl) ;10
+ jr nz,iprt_1 ;6/8
+ inc hl ; 4
+ inc (hl) ;10
iprt_1:
- ld (counter_10ms),a
+ pop hl ; 9
+ ld a,(time_to)
+ sub a,1
+ jr c,iprt_0
+ ld (time_to),a
+iprt_0:
pop af
ei
ret
-counter_10ms:
+uptime:
+ dw 0,0
+time_to:
db 0
end