]> git.sur5r.net Git - cc65/blob - libsrc/atari/gettime.s
atari: split color.s into bordercolor.s and bgcolor.s
[cc65] / libsrc / atari / gettime.s
1 ;
2 ; Oliver Schmidt, 14.08.2018
3 ; Christian Groessler, 25.09.2018
4 ;
5 ; int __fastcall__ clock_gettime (clockid_t clk_id, struct timespec *tp);
6 ;
7
8         .import         pushax, steaxspidx, incsp1, incsp3, return0
9         .import         __dos_type
10         .import         sdxtry
11
12         .include        "time.inc"
13         .include        "zeropage.inc"
14         .include        "errno.inc"
15         .include        "atari.inc"
16
17 _clock_gettime:
18         jsr     pushax
19
20 ; clear tp
21
22         sta     ptr1
23         stx     ptr1+1
24         lda     #$00
25         ldy     #.sizeof(timespec)-1
26 :       sta     (ptr1),y
27         dey
28         bpl     :-
29
30 ; only supported on SpartaDOS-X >= 4.40
31
32         lda     #SPARTADOS
33         cmp     __dos_type
34         bne     notsupp
35         lda     SDX_VERSION
36         cmp     #$44
37         bcc     notsupp
38
39 ; get date/time from system (SD-X call)
40 ; see settime.s for reasons of using sdxtry
41
42         lda     #0              ; init loop count (256)
43         sta     sdxtry
44
45 try_get:lda     #SDX_CLK_DEV    ; CLK device
46         sta     SDX_DEVICE
47         ldy     #SDX_KD_GETTD   ; GETTD function
48         jsr     SDX_KERNEL      ; do the call
49         bcc     done
50
51         dec     sdxtry
52         bne     try_get
53
54         lda     #EBUSY
55         bne     errexit
56
57 ; fill timespec
58
59 ; date
60 done:   lda     SDX_DATE        ; mday
61         sta     TM + tm::tm_mday
62         ldx     SDX_DATE+1      ; month
63         dex
64         stx     TM + tm::tm_mon
65         lda     SDX_DATE+2      ; year
66         cmp     #79             ; 1979: the Atari 800 came out
67         bcs     :+
68         adc     #100            ; adjust century
69 :       sta     TM + tm::tm_year
70
71 ; time
72         lda     SDX_TIME
73         sta     TM + tm::tm_hour
74         lda     SDX_TIME+1
75         sta     TM + tm::tm_min
76         lda     SDX_TIME+2
77         sta     TM + tm::tm_sec
78
79 ; make time_t
80
81         lda     #<TM
82         ldx     #>TM
83         jsr     _mktime
84
85 ; store tv_sec into output tp struct
86
87         ldy     #timespec::tv_sec
88         jsr     steaxspidx
89
90 ; cleanup stack
91
92         jsr     incsp1
93
94 ; return success
95
96         jmp     return0
97
98 ; load errno code
99
100 notsupp:lda     #ENOSYS
101
102 ; cleanup stack
103
104 errexit:jsr     incsp3          ; Preserves A
105
106 ; set __errno
107
108         jmp     __directerrno
109
110 ; -------
111
112         .bss
113
114 TM:     .tag    tm