Added clock_settime() for some CBMs.

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!
This commit is contained in:
Oliver Schmidt
2018-08-18 01:13:02 +02:00
parent cb7ec508f6
commit eb9872c684
12 changed files with 573 additions and 130 deletions

View File

@@ -7,12 +7,10 @@
.include "time.inc"
.include "c64.inc"
.include "get_tv.inc"
.constructor inittime
.importzp sreg, tmp1, tmp2
.import pushax, pusheax, tosmul0ax, steaxspidx, incsp1, return0
.import _get_tv, _get_ostype
.import TM, load_tenth
;----------------------------------------------------------------------------
@@ -50,12 +48,7 @@
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 load_tenth
jsr pusheax
lda CIA1_TOD10
ldx #>$0000
@@ -88,40 +81,3 @@
rts
.endproc
;----------------------------------------------------------------------------
; 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.
.segment "ONCE"
.proc inittime
lda CIA1_TOD10
sta CIA1_TOD10
jsr _get_tv
cmp #TV::PAL
bne @60Hz
jsr _get_ostype
cmp #$43
beq @60Hz
lda CIA1_CRA
ora #$80
sta CIA1_CRA
@60Hz: rts
.endproc
;----------------------------------------------------------------------------
; TM struct with date set to 1970-01-01
.data
TM: .word 0 ; tm_sec
.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