mirror of
https://github.com/cc65/cc65.git
synced 2024-12-23 19:29:37 +00:00
95 lines
2.1 KiB
ArmAsm
95 lines
2.1 KiB
ArmAsm
;
|
|
; Oliver Schmidt, 14.08.2018
|
|
;
|
|
; int __fastcall__ clock_gettime (clockid_t clk_id, struct timespec *tp);
|
|
;
|
|
|
|
.import pushax, steaxspidx, incsp1, incsp3, return0
|
|
|
|
.include "time.inc"
|
|
.include "zeropage.inc"
|
|
.include "errno.inc"
|
|
.include "mli.inc"
|
|
|
|
_clock_gettime:
|
|
jsr pushax
|
|
|
|
; Clear tv_nsec (+ tv_sec)
|
|
sta ptr1
|
|
stx ptr1+1
|
|
lda #$00
|
|
ldy #.sizeof(timespec)-1
|
|
: sta (ptr1),y
|
|
dey
|
|
bpl :-
|
|
|
|
; Update date + time
|
|
lda #GET_TIME_CALL
|
|
ldx #GET_TIME_COUNT
|
|
jsr callmli
|
|
bcs oserr
|
|
|
|
; Get date
|
|
lda DATELO+1
|
|
lsr
|
|
php ; Save month msb
|
|
cmp #70 ; Year < 70?
|
|
bcs :+ ; No, leave alone
|
|
adc #100 ; Move 19xx to 20xx
|
|
: sta TM + tm::tm_year
|
|
lda DATELO
|
|
tax ; Save day
|
|
plp ; Restore month msb
|
|
ror
|
|
lsr
|
|
lsr
|
|
lsr
|
|
lsr
|
|
beq erange ; [1..12] allows for validity check
|
|
tay
|
|
dey ; Move [1..12] to [0..11]
|
|
sty TM + tm::tm_mon
|
|
txa ; Restore day
|
|
and #%00011111
|
|
sta TM + tm::tm_mday
|
|
|
|
; Get time
|
|
lda TIMELO+1
|
|
sta TM + tm::tm_hour
|
|
lda TIMELO
|
|
sta TM + tm::tm_min
|
|
|
|
; Make time_t
|
|
lda #<TM
|
|
ldx #>TM
|
|
jsr _mktime
|
|
|
|
; Store tv_sec
|
|
ldy #timespec::tv_sec
|
|
jsr steaxspidx
|
|
|
|
; Cleanup stack
|
|
jsr incsp1
|
|
|
|
; Return success
|
|
jmp return0
|
|
|
|
; Load errno code
|
|
erange: lda #ERANGE
|
|
|
|
; Cleanup stack
|
|
jsr incsp3 ; Preserves A
|
|
|
|
; Set __errno
|
|
jmp ___directerrno
|
|
|
|
; Cleanup stack
|
|
oserr: jsr incsp3 ; Preserves A
|
|
|
|
; Set ___oserror
|
|
jmp ___mappederrno
|
|
|
|
.bss
|
|
|
|
TM: .tag tm
|