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