--- /dev/null
+;
+; Oliver Schmidt, 15.08.2018
+;
+; int clock_getres (clockid_t clk_id, struct timespec *res);
+;
+
+ .import __dos_type
+ .import incsp1, return0
+
+ .include "time.inc"
+ .include "zeropage.inc"
+ .include "errno.inc"
+ .include "mli.inc"
+
+_clock_getres:
+ sta ptr1
+ stx ptr1+1
+
+ ; Cleanup stack
+ jsr incsp1
+
+ ; Check for ProDOS 8
+ lda __dos_type
+ beq enosys
+
+ ; Presume day resolution
+ ldx #<day_res
+ ldy #>day_res
+
+ ; Check for existing minutes or hours
+ lda TIMELO
+ ora TIMELO+1
+ beq :+
+
+ ; Switch to minute resolution
+ ldx #<min_res
+ ldy #>min_res
+
+ ; Copy timespec
+: stx ptr2
+ sty ptr2+1
+ ldy #.sizeof(timespec)-1
+: lda (ptr2),y
+ sta (ptr1),y
+ dey
+ bpl :-
+
+ ; Return success
+ jmp return0
+
+ ; Load errno code
+enosys: lda #ENOSYS
+
+ ; Set __errno
+ jmp __directerrno
+
+ .rodata
+
+min_res:.dword 60
+ .dword 0
+
+day_res:.dword 60 * 60 * 24
+ .dword 0
--- /dev/null
+;
+; 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