1
0
mirror of https://github.com/cc65/cc65.git synced 2024-11-19 06:31:31 +00:00
cc65/libsrc/apple2/settime.s
Oliver Schmidt fe5af26f9f Express assumption about struct timespec.
We basically cast a struct timespec pointer to a time_t pointer when we pass the clock_settime() paramter to localtime(). Explicitly express that in the source code.
2018-08-18 01:29:40 +02:00

72 lines
1.7 KiB
ArmAsm

;
; 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
.assert timespec::tv_sec = 0, error
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