Last modified on 15 April 2015, at 07:44

SYMBiFACE II:RTC routines

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