2009-07-27 18:44:37 +00:00
|
|
|
;
|
|
|
|
; Stefan Haubenthal, 27.7.2009
|
2018-08-15 15:59:11 +02:00
|
|
|
; Oliver Schmidt, 14.8.2018
|
2009-07-27 18:44:37 +00:00
|
|
|
;
|
2018-08-15 15:59:11 +02:00
|
|
|
; int clock_gettime (clockid_t clk_id, struct timespec *tp);
|
2009-07-27 18:44:37 +00:00
|
|
|
;
|
|
|
|
|
|
|
|
.include "time.inc"
|
|
|
|
.include "c128.inc"
|
2013-05-09 13:56:54 +02:00
|
|
|
.include "get_tv.inc"
|
2009-07-27 18:44:37 +00:00
|
|
|
|
2018-08-15 15:59:11 +02:00
|
|
|
.constructor inittime
|
|
|
|
.importzp sreg, tmp1, tmp2
|
|
|
|
.import pushax, pusheax, tosmul0ax, steaxspidx, incsp1, return0
|
2013-05-09 13:56:54 +02:00
|
|
|
.import _get_tv
|
2009-07-27 18:44:37 +00:00
|
|
|
|
2009-09-24 19:40:36 +00:00
|
|
|
|
|
|
|
;----------------------------------------------------------------------------
|
2009-07-27 18:44:37 +00:00
|
|
|
.code
|
|
|
|
|
2018-08-15 15:59:11 +02:00
|
|
|
.proc _clock_gettime
|
|
|
|
|
|
|
|
jsr pushax
|
|
|
|
jsr pushax
|
2013-05-09 13:56:54 +02:00
|
|
|
|
|
|
|
lda CIA1_TODHR
|
|
|
|
bpl AM
|
|
|
|
and #%01111111
|
|
|
|
sed
|
|
|
|
clc
|
|
|
|
adc #$12
|
|
|
|
cld
|
|
|
|
AM: jsr BCD2dec
|
|
|
|
sta TM + tm::tm_hour
|
|
|
|
lda CIA1_TODMIN
|
|
|
|
jsr BCD2dec
|
|
|
|
sta TM + tm::tm_min
|
|
|
|
lda CIA1_TODSEC
|
|
|
|
jsr BCD2dec
|
|
|
|
sta TM + tm::tm_sec
|
|
|
|
lda #<TM
|
|
|
|
ldx #>TM
|
2018-08-15 15:59:11 +02:00
|
|
|
jsr _mktime
|
|
|
|
|
|
|
|
ldy #timespec::tv_sec
|
|
|
|
jsr steaxspidx ; Pops address pushed by 2. pushax
|
|
|
|
|
|
|
|
lda #<(100 * 1000 * 1000 / $10000)
|
|
|
|
ldx #>(100 * 1000 * 1000 / $10000)
|
|
|
|
sta sreg
|
|
|
|
stx sreg+1
|
|
|
|
lda #<(100 * 1000 * 1000)
|
|
|
|
ldx #>(100 * 1000 * 1000)
|
|
|
|
jsr pusheax
|
|
|
|
lda CIA1_TOD10
|
|
|
|
ldx #>$0000
|
|
|
|
jsr tosmul0ax
|
|
|
|
|
|
|
|
ldy #timespec::tv_nsec
|
|
|
|
jsr steaxspidx ; Pops address pushed by 1. pushax
|
|
|
|
|
|
|
|
jsr incsp1
|
|
|
|
jmp return0
|
2009-07-27 18:44:37 +00:00
|
|
|
|
2018-08-15 15:59:11 +02:00
|
|
|
.endproc
|
|
|
|
|
|
|
|
;----------------------------------------------------------------------------
|
2009-07-27 18:44:37 +00:00
|
|
|
; dec = (((BCD>>4)*10) + (BCD&0xf))
|
2018-08-15 15:59:11 +02:00
|
|
|
|
|
|
|
.proc BCD2dec
|
|
|
|
|
|
|
|
tax
|
2013-05-09 13:56:54 +02:00
|
|
|
and #%00001111
|
|
|
|
sta tmp1
|
|
|
|
txa
|
2009-07-27 18:44:37 +00:00
|
|
|
and #%11110000 ; *16
|
|
|
|
lsr ; *8
|
|
|
|
sta tmp2
|
|
|
|
lsr
|
|
|
|
lsr ; *2
|
|
|
|
adc tmp2 ; = *10
|
|
|
|
adc tmp1
|
|
|
|
rts
|
|
|
|
|
|
|
|
.endproc
|
|
|
|
|
2009-09-24 19:40:36 +00:00
|
|
|
;----------------------------------------------------------------------------
|
|
|
|
; Constructor that writes to the 1/10 sec register of the TOD to kick it
|
|
|
|
; into action. If this is not done, the clock hangs. We will read the register
|
|
|
|
; and write it again, ignoring a possible change in between.
|
2016-03-06 21:26:22 +01:00
|
|
|
.segment "ONCE"
|
2009-09-24 19:40:36 +00:00
|
|
|
|
2018-08-15 15:59:11 +02:00
|
|
|
.proc inittime
|
2009-09-24 19:40:36 +00:00
|
|
|
|
|
|
|
lda CIA1_TOD10
|
|
|
|
sta CIA1_TOD10
|
2013-05-09 13:56:54 +02:00
|
|
|
jsr _get_tv
|
|
|
|
cmp #TV::PAL
|
|
|
|
bne @60Hz
|
|
|
|
lda CIA1_CRA
|
|
|
|
ora #$80
|
|
|
|
sta CIA1_CRA
|
|
|
|
@60Hz: rts
|
2009-09-24 19:40:36 +00:00
|
|
|
|
|
|
|
.endproc
|
|
|
|
|
|
|
|
;----------------------------------------------------------------------------
|
|
|
|
; TM struct with date set to 1970-01-01
|
|
|
|
.data
|
|
|
|
|
2013-05-09 13:56:54 +02:00
|
|
|
TM: .word 0 ; tm_sec
|
2009-09-24 19:40:36 +00:00
|
|
|
.word 0 ; tm_min
|
|
|
|
.word 0 ; tm_hour
|
|
|
|
.word 1 ; tm_mday
|
|
|
|
.word 0 ; tm_mon
|
|
|
|
.word 70 ; tm_year
|
|
|
|
.word 0 ; tm_wday
|
|
|
|
.word 0 ; tm_yday
|
|
|
|
.word 0 ; tm_isdst
|