]> git.sur5r.net Git - cc65/blobdiff - libsrc/cbm610/gettime.s
Replaced _systime with clock_gettime.
[cc65] / libsrc / cbm610 / gettime.s
diff --git a/libsrc/cbm610/gettime.s b/libsrc/cbm610/gettime.s
new file mode 100644 (file)
index 0000000..3022621
--- /dev/null
@@ -0,0 +1,108 @@
+;
+; Stefan Haubenthal, 2009-07-27
+; Ullrich von Bassewitz, 2009-09-24
+; Oliver Schmidt, 2018-08-14
+;
+; int clock_gettime (clockid_t clk_id, struct timespec *tp);
+;
+
+        .include        "time.inc"
+        .include        "cbm610.inc"
+        .include        "extzp.inc"
+
+        .import         pushax, pusheax, tosmul0ax, steaxspidx, incsp1
+        .import         sys_bank, restore_bank
+        .importzp       sreg, tmp1, tmp2
+
+
+;----------------------------------------------------------------------------
+.code
+
+.proc   _clock_gettime
+
+        jsr     sys_bank
+        jsr     pushax
+        jsr     pushax
+
+        ldy     #CIA::TODHR
+        lda     (cia),y
+        bpl     AM
+        and     #%01111111
+        sed
+        clc
+        adc     #$12
+        cld
+AM:     jsr     BCD2dec
+        sta     TM + tm::tm_hour
+        ldy     #CIA::TODMIN
+        lda     (cia),y
+        jsr     BCD2dec
+        sta     TM + tm::tm_min
+        ldy     #CIA::TODSEC
+        lda     (cia),y
+        jsr     BCD2dec
+        sta     TM + tm::tm_sec
+        lda     #<TM
+        ldx     #>TM
+        jsr     _mktime
+
+        ldy     #timespec::tv_sec
+        jsr     steaxspidx      ; Pops address pushed by 2. pushax
+
+        lda     #<(100 * 1000 * 1000 / $10000)
+        ldx     #>(100 * 1000 * 1000 / $10000)
+        sta     sreg
+        stx     sreg+1
+        lda     #<(100 * 1000 * 1000)
+        ldx     #>(100 * 1000 * 1000)
+        jsr     pusheax
+        ldy     #CIA::TOD10
+        lda     (cia),y
+        ldx     #>$0000
+        jsr     tosmul0ax
+
+        ldy     #timespec::tv_nsec
+        jsr     steaxspidx      ; Pops address pushed by 1. pushax
+
+        jsr     incsp1
+
+        lda     #0
+        tax
+        jmp     restore_bank
+
+.endproc
+
+;----------------------------------------------------------------------------
+; dec = (((BCD>>4)*10) + (BCD&0xf))
+
+.proc   BCD2dec
+
+        tax
+        and     #%00001111
+        sta     tmp1
+        txa
+        and     #%11110000      ; *16
+        lsr                     ; *8
+        sta     tmp2
+        lsr
+        lsr                     ; *2
+        adc     tmp2            ; = *10
+        adc     tmp1
+        rts
+
+.endproc
+
+;----------------------------------------------------------------------------
+; TM struct with date set to 1970-01-01
+.data
+
+TM:     .word           0       ; tm_sec
+        .word           0       ; tm_min
+        .word           0       ; tm_hour
+        .word           1       ; tm_mday
+        .word           0       ; tm_mon
+        .word           70      ; tm_year
+        .word           0       ; tm_wday
+        .word           0       ; tm_yday
+        .word           0       ; tm_isdst
+