mirror of
https://github.com/cc65/cc65.git
synced 2024-09-08 01:54:33 +00:00
The CIA TOD only stores the time but not the date. Therefore the date set by clock_settime() ist just stored inside the C library for retrieval via clock_gettime(). The "very special" handling of 12AM/PM is based on https://groups.google.com/d/msg/comp.sys.cbm/ysVYSX4AMbc/vHrXCWEhCOUJ saying: ========== 24hr: Wr => Rd => Nx -------------------- 0 : 92 => 12 => 01 <= Switch from 00 to 01 (24-hour notation) 1 : 01 => 01 => 02 2 : 02 => 02 => 03 11 : 11 => 11 => 92 12 : 12 => 92 => 81 <= Switch from 12 to 13 (24-hour notation) 13 : 81 => 81 => 82 14 : 82 => 82 => 83 23 : 91 => 91 => 12 1. column ("24hr"): hour to be tested (decimal) 2. column ("Wr"): hour written to TOD register (BCD) 3. column ("Rd"): hour read from TOD register (BCD) immediately after writing the value in column 2 to see the conversion between AM/PM, if any 4. column ("Nx"): next hour (BCD) after the hour switch ========== Thanks Paul!
84 lines
1.9 KiB
ArmAsm
84 lines
1.9 KiB
ArmAsm
;
|
|
; Stefan Haubenthal, 27.7.2009
|
|
; Oliver Schmidt, 14.8.2018
|
|
;
|
|
; int clock_gettime (clockid_t clk_id, struct timespec *tp);
|
|
;
|
|
|
|
.include "time.inc"
|
|
.include "c128.inc"
|
|
|
|
.importzp sreg, tmp1, tmp2
|
|
.import pushax, pusheax, tosmul0ax, steaxspidx, incsp1, return0
|
|
.import TM, load_tenth
|
|
|
|
|
|
;----------------------------------------------------------------------------
|
|
.code
|
|
|
|
.proc _clock_gettime
|
|
|
|
jsr pushax
|
|
jsr pushax
|
|
|
|
lda CIA1_TODHR
|
|
sed
|
|
tax ; Save PM flag
|
|
and #%01111111
|
|
cmp #$12 ; 12 AM/PM
|
|
bcc @L1
|
|
sbc #$12
|
|
@L1: inx ; Get PM flag
|
|
bpl @L2
|
|
clc
|
|
adc #$12
|
|
@L2: cld
|
|
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
|
|
jsr _mktime
|
|
|
|
ldy #timespec::tv_sec
|
|
jsr steaxspidx ; Pops address pushed by 2. pushax
|
|
|
|
jsr load_tenth
|
|
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
|
|
|
|
.endproc
|
|
|
|
;----------------------------------------------------------------------------
|
|
; dec = (((BCD>>4)*10) + (BCD&0xf))
|
|
|
|
.proc BCD2dec
|
|
|
|
tax
|
|
and #%00001111
|
|
sta tmp1
|
|
txa
|
|
and #%11110000 ; *16
|
|
lsr ; *8
|
|
sta tmp2
|
|
lsr
|
|
lsr ; *2
|
|
adc tmp2 ; = *10
|
|
adc tmp1
|
|
rts
|
|
|
|
.endproc
|