]> git.sur5r.net Git - cc65/blobdiff - libsrc/c128/gettime.s
Replaced _systime with clock_gettime.
[cc65] / libsrc / c128 / gettime.s
diff --git a/libsrc/c128/gettime.s b/libsrc/c128/gettime.s
new file mode 100644 (file)
index 0000000..b597891
--- /dev/null
@@ -0,0 +1,119 @@
+;
+; Stefan Haubenthal, 27.7.2009
+; Oliver Schmidt, 14.8.2018
+;
+; int clock_gettime (clockid_t clk_id, struct timespec *tp);
+;
+
+        .include        "time.inc"
+        .include        "c128.inc"
+        .include        "get_tv.inc"
+
+        .constructor    inittime
+        .importzp       sreg, tmp1, tmp2
+        .import         pushax, pusheax, tosmul0ax, steaxspidx, incsp1, return0
+        .import         _get_tv
+
+
+;----------------------------------------------------------------------------
+.code
+
+.proc   _clock_gettime
+
+        jsr     pushax
+        jsr     pushax
+
+        lda     CIA1_TODHR
+        bpl     AM
+        and     #%01111111
+        sed
+        clc
+        adc     #$12
+        cld
+AM:     jsr     BCD2dec
+        sta     TM + tm::tm_hour
+        lda     CIA1_TODMIN
+        jsr     BCD2dec
+        sta     TM + tm::tm_min
+        lda     CIA1_TODSEC
+        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
+        lda     CIA1_TOD10
+        ldx     #>$0000
+        jsr     tosmul0ax
+
+        ldy     #timespec::tv_nsec
+        jsr     steaxspidx      ; Pops address pushed by 1. pushax
+
+        jsr     incsp1
+        jmp     return0
+
+.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
+
+;----------------------------------------------------------------------------
+; Constructor that writes to the 1/10 sec register of the TOD to kick it
+; into action. If this is not done, the clock hangs. We will read the register
+; and write it again, ignoring a possible change in between.
+.segment "ONCE"
+
+.proc   inittime
+
+        lda     CIA1_TOD10
+        sta     CIA1_TOD10
+        jsr     _get_tv
+        cmp     #TV::PAL
+        bne     @60Hz
+        lda     CIA1_CRA
+        ora     #$80
+        sta     CIA1_CRA
+@60Hz:  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