]> git.sur5r.net Git - cc65/blob - libsrc/cbm510/settime.s
Atari: clock_gettime() and clock_settime() implementations
[cc65] / libsrc / cbm510 / settime.s
1 ;
2 ; 2018-08-18, Oliver Schmidt
3 ; 2018-08-19, Greg King
4 ;
5 ; int clock_settime (clockid_t clk_id, const struct timespec *tp);
6 ;
7
8         .include        "time.inc"
9         .include        "cbm510.inc"
10         .include        "extzp.inc"
11
12         .importzp       sreg, ptr1
13         .import         pushax, pusheax, ldax0sp, ldeaxidx
14         .import         sys_bank, restore_bank
15         .import         tosdiveax, incsp3, return0
16         .import         TM, load_tenth
17
18
19 ;----------------------------------------------------------------------------
20 .code
21
22 .proc   _clock_settime
23
24         jsr     pushax
25
26         .assert timespec::tv_sec = 0, error
27         jsr     _localtime
28         sta     ptr1
29         stx     ptr1+1
30         ldy     #.sizeof(tm)-1
31 @L1:    lda     (ptr1),y
32         sta     TM,y
33         dey
34         bpl     @L1
35
36         jsr     sys_bank
37         lda     TM + tm::tm_hour
38         jsr     dec2BCD
39         tax                     ; Force flags
40         bne     @L2
41         lda     #$92            ; 12 AM
42         bne     @L3
43 @L2:    cmp     #$13            ; 1 PM
44         bcc     @L3
45         sed
46         sbc     #$12
47         cld
48         ora     #%10000000
49 @L3:    ldy     #CIA::TODHR
50         sta     (cia2),y
51         lda     TM + tm::tm_min
52         jsr     dec2BCD
53         ldy     #CIA::TODMIN
54         sta     (cia2),y
55         lda     TM + tm::tm_sec
56         jsr     dec2BCD
57         ldy     #CIA::TODSEC
58         sta     (cia2),y
59         jsr     restore_bank
60
61         jsr     ldax0sp
62         ldy     #3+timespec::tv_nsec
63         jsr     ldeaxidx
64         jsr     pusheax
65         jsr     load_tenth
66         jsr     tosdiveax
67
68         jsr     sys_bank
69         ldy     #CIA::TOD10
70         sta     (cia2),y
71         jsr     restore_bank
72
73         lda     #$00
74         tax
75         jmp     incsp3
76
77 .endproc
78
79 ;----------------------------------------------------------------------------
80 ; Just sum up the value in BCD mode.
81 ; http://forum.6502.org/viewtopic.php?p=7629#p7629
82
83 .proc   dec2BCD
84
85         tax
86         dex
87         bmi     @L9
88         lda     #0
89         clc
90         sed
91 @L1:    adc     #1
92         dex
93         bpl     @L1
94         cld
95 @L9:    rts
96
97 .endproc