]> git.sur5r.net Git - cc65/blob - libsrc/atari/settime.s
Add test showing optimizer failure, OptUnusedLoads removes needed loads
[cc65] / libsrc / atari / settime.s
1 ;
2 ; Oliver Schmidt, 15.08.2018
3 ; Christian Groessler, 25.09.2018
4 ;
5 ; int __fastcall__ clock_settime (clockid_t clk_id, const struct timespec *tp);
6 ;
7
8         .import         __dos_type
9         .import         incsp1, return0
10         .import         sdxtry
11
12         .include        "time.inc"
13         .include        "zeropage.inc"
14         .include        "errno.inc"
15         .include        "atari.inc"
16
17 _clock_settime:
18
19 ; cleanup stack
20
21         jsr     incsp1          ; preserves AX
22
23 ; only supported on SpartaDOS-X >= 4.40
24
25         ldy     #SPARTADOS
26         cpy     __dos_type
27         bne     enosys
28         ldy     SDX_VERSION
29         cpy     #$44
30         bcc     enosys
31
32 ; create tm from tp (tv_sec) input parameter
33
34         .assert timespec::tv_sec = 0, error
35         jsr     _localtime
36         sta     ptr1
37         stx     ptr1+1
38
39 ; set date
40
41         ldy     #tm::tm_mday
42         lda     (ptr1),y        ; get day of month
43         sta     SDX_DATE        ; set day of month
44
45         ldy     #tm::tm_mon
46         lda     (ptr1),y        ; get month (0-based)
47         tax
48         inx                     ; move [0..11] to [1..12]
49         stx     SDX_DATE+1
50
51         ldy     #tm::tm_year
52         lda     (ptr1),y        ; get year (0 = year 1900)
53         cmp     #100
54         bcc     :+
55         sbc     #100
56 :       sta     SDX_DATE+2
57
58         ldy     #tm::tm_hour
59         lda     (ptr1),y        ; get hour
60         sta     SDX_TIME
61
62         ldy     #tm::tm_min
63         lda     (ptr1),y        ; get minutes
64         sta     SDX_TIME+1
65
66         ldy     #tm::tm_sec
67         lda     (ptr1),y        ; get seconds
68         sta     SDX_TIME+2
69
70 ; set new time/date (SD-X call)
71 ; SpartaDOS-X User's Guide (4.48) states at page 145:
72 ; "In the I_GETTD and I_SETTD procedures a set Carry-Flag means that the clock driver is
73 ; busy at the moment. You should call the routine again."
74 ; It goes on to mention that one should provide an upper limit on the number of calls,
75 ; in order not to "hang". We are doing this here...
76
77         lda     #0              ; init loop count (256)
78         sta     sdxtry
79
80 try_set:lda     #SDX_CLK_DEV    ; CLK device
81         sta     SDX_DEVICE
82         ldy     #SDX_KD_SETTD   ; SETTD function
83         jsr     SDX_KERNEL      ; do the call
84         bcc     done
85
86         dec     sdxtry
87         bne     try_set
88
89         lda     #EBUSY
90         bne     drcter          ; jump always
91
92 ; return success
93
94 done:   jmp     return0
95
96 ; load errno code
97
98 enosys: lda     #ENOSYS
99 drcter: jmp     __directerrno