SYMBiFACE II:RTC routines

From CPCWiki - THE Amstrad CPC encyclopedia!
Jump to: navigation, search

These are the SYMBiFACE II realtime clock routines of SymbOS, written by Prodatron. They show how to read and set the date and time of the RTC.

timrtcadr       equ #fd15

rtc_sec         equ #00     ;actual second (0-59)
rtc_sec_alarm   equ #01     ;alarm  second (0-59)
rtc_min         equ #02     ;actual minute (0-59)
rtc_min_alarm   equ #03     ;alarm  minute (0-59)
rtc_hour        equ #04     ;actual hour (0-23)
rtc_hour_alarm  equ #05     ;alarm  hour (0-23)
rtc_day_week    equ #06     ;day of the week
rtc_day         equ #07     ;day of the month (1-31)
rtc_month       equ #08     ;month (1-12)
rtc_year        equ #09     ;year (0-99)
rtc_status_a    equ #0a     ;Status A
rtc_status_b    equ #0b     ;Status B
rtc_status_c    equ #0c     ;Status C
rtc_memtest     equ #0f     ;ram test
rtc_mil         equ #32     ;millennium (19-20)

timadr  db rtc_status_b,rtc_sec,rtc_hour,rtc_min,rtc_month,rtc_day,rtc_year,rtc_mil,rtc_status_b
        db #87
timreg  ds 7
        db #07

;### TIMSET -> Updates SYMBiFACE II RTC
;### Input      A=seconds, B=minutes, C=hours, D=day (1-31), E=month (1-12), HL=year (1900-2099)
;### Destroyed  AF,BC,DE,HL,IY
timset  ld (timreg+0),a         ;*** realtime clock (CPC version)
        ld (timreg+1),bc
        ld (timreg+3),de
        call timset0
        ld bc,2000
        or a
        sbc hl,bc
        ld a,20
        jr nc,timset2
        ld bc,100
        add hl,bc
        ld a,19
timset2 ld h,a              ;L=year, H=millennium
        ld (timreg+5),hl
        ld bc,timrtcadr
        ld iy,timadr
        ld e,9
timset3 ld a,(iy+0)
        out (c),a
        dec c
        ld a,(iy+9)
        out (c),a
        inc c
        inc iy
        dec e
        jr nz,timset3
        ret

;### TIMGET -> Read SYMBiFACE II RTC
;### Output     CF=0 -> A=seconds, B=minutes, C=hours, D=day (1-31), E=month (1-12), HL=year (1900-2099)
;###            CF=1 -> time is currently been updated; please try again later
;### Destroyed  F,IY
timget  ld bc,timrtcadr         ;*** realtime clock (CPC version)
        ld a,rtc_status_a
        out (c),a
        dec c
        in a,(c)
        inc c
        rla
        ret c                   ;time is currently been updated -> abort
        ld iy,timadr+1
        ld e,7                  ;read 7 registers
timget3 ld a,(iy+0)
        out (c),a
        dec c
        in a,(c)
        inc c
        ld (iy+9),a
        inc iy
        dec e
        jr nz,timget3
        ld hl,(timreg+5)        ;calculate year
        ld a,h
        ld h,0
        ld bc,1900
        cp 19
        jr z,timget2
        ld bc,2000
timget2 add hl,bc
        ld a,(timreg+0)         ;get registers
        ld bc,(timreg+1)
        ld de,(timreg+3)
        or a
        ret

See also