;
; 2018-08-18, Oliver Schmidt
; 2018-08-19, Greg King
;
; int __fastcall__ clock_settime (clockid_t clk_id, const struct timespec *tp);
;

        .include        "time.inc"
        .include        "cbm610.inc"
        .include        "extzp.inc"

        .importzp       sreg, ptr1
        .import         pushax, pusheax, ldax0sp, ldeaxidx
        .import         sys_bank, restore_bank
        .import         tosdiveax, incsp3, return0
        .import         TM, load_tenth


;----------------------------------------------------------------------------
.code

.proc   _clock_settime

        jsr     pushax

        .assert timespec::tv_sec = 0, error
        jsr     _localtime
        sta     ptr1
        stx     ptr1+1
        ldy     #.sizeof(tm)-1
@L1:    lda     (ptr1),y
        sta     TM,y
        dey
        bpl     @L1

        jsr     sys_bank
        lda     TM + tm::tm_hour
        jsr     dec2BCD
        tax                     ; Force flags
        bne     @L2
        lda     #$92            ; 12 AM
        bne     @L3
@L2:    cmp     #$13            ; 1 PM
        bcc     @L3
        sed
        sbc     #$12
        cld
        ora     #%10000000
@L3:    ldy     #CIA::TODHR
        sta     (cia),y
        lda     TM + tm::tm_min
        jsr     dec2BCD
        ldy     #CIA::TODMIN
        sta     (cia),y
        lda     TM + tm::tm_sec
        jsr     dec2BCD
        ldy     #CIA::TODSEC
        sta     (cia),y
        jsr     restore_bank

        jsr     ldax0sp
        ldy     #3+timespec::tv_nsec
        jsr     ldeaxidx
        jsr     pusheax
        jsr     load_tenth
        jsr     tosdiveax

        jsr     sys_bank
        ldy     #CIA::TOD10
        sta     (cia),y
        jsr     restore_bank

        lda     #$00
        tax
        jmp     incsp3

.endproc

;----------------------------------------------------------------------------
; Just sum up the value in BCD mode.
; http://forum.6502.org/viewtopic.php?p=7629#p7629

.proc   dec2BCD

        tax
        dex
        bmi     @L9
        lda     #0
        clc
        sed
@L1:    adc     #1
        dex
        bpl     @L1
        cld
@L9:    rts

.endproc
