]> git.sur5r.net Git - cc65/blobdiff - libsrc/apple2/settime.s
Added clock_getres() / clock_settime() for the Apple II.
[cc65] / libsrc / apple2 / settime.s
diff --git a/libsrc/apple2/settime.s b/libsrc/apple2/settime.s
new file mode 100644 (file)
index 0000000..a71e113
--- /dev/null
@@ -0,0 +1,70 @@
+;
+; Oliver Schmidt, 15.08.2018
+;
+; int clock_settime (clockid_t clk_id, const struct timespec *tp);
+;
+
+        .import         __dos_type
+        .import         incsp1, return0
+
+        .include        "time.inc"
+        .include        "zeropage.inc"
+        .include        "errno.inc"
+        .include        "mli.inc"
+
+_clock_settime:
+
+        ; Cleanup stack
+        jsr     incsp1          ; Preserves A
+
+        ; Check for ProDOS 8
+        ldy     __dos_type
+        beq     enosys
+
+        ; Check for existing minutes or hours
+        tay                     ; Save A
+        lda     TIMELO
+        ora     TIMELO+1
+        bne     erange
+        tya                     ; Restore A
+
+        ; Get tm
+        jsr     _localtime
+        sta     ptr1
+        stx     ptr1+1
+
+        ; Set date
+        ldy     #tm::tm_mon
+        lda     (ptr1),y
+        clc
+        adc     #$01            ; Move [0..11] to [1..12]
+        asl
+        asl
+        asl
+        asl
+        asl
+        php                     ; Save month msb
+        ldy     #tm::tm_mday
+        ora     (ptr1),y
+        sta     DATELO
+        ldy     #tm::tm_year
+        lda     (ptr1),y
+        cmp     #100            ; Year since 1900 < 100?
+        bcc     :+              ; Yes, leave alone
+        sbc     #100            ; Move 20xx to 19xx
+:       plp                     ; Restore month msb
+        rol
+        sta     DATELO+1
+
+        ; Return success
+        jmp     return0
+
+        ; Load errno code
+enosys: lda     #ENOSYS
+        bne     errno           ; Always
+
+        ; Load errno code
+erange: lda     #ERANGE
+
+        ; Set __errno
+errno:  jmp     __directerrno