diff --git a/asminc/time.inc b/asminc/time.inc index 5783232c7..6064b4ba3 100644 --- a/asminc/time.inc +++ b/asminc/time.inc @@ -64,7 +64,5 @@ .global _clock_getres .global _clock_gettime .global _clock_settime +.global _localtime .global _mktime - - - diff --git a/libsrc/apple2/getres.s b/libsrc/apple2/getres.s new file mode 100644 index 000000000..777a5df3f --- /dev/null +++ b/libsrc/apple2/getres.s @@ -0,0 +1,63 @@ +; +; 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 + + ; Check for existing minutes or hours + lda TIMELO + ora TIMELO+1 + beq :+ + + ; Switch to minute resolution + ldx #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 diff --git a/libsrc/apple2/settime.s b/libsrc/apple2/settime.s new file mode 100644 index 000000000..a71e113c5 --- /dev/null +++ b/libsrc/apple2/settime.s @@ -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