2 ; Oliver Schmidt, 15.08.2018
3 ; Christian Groessler, 25.09.2018
5 ; int __fastcall__ clock_settime (clockid_t clk_id, const struct timespec *tp);
9 .import incsp1, return0
13 .include "zeropage.inc"
21 jsr incsp1 ; preserves AX
23 ; only supported on SpartaDOS-X >= 4.40
32 ; create tm from tp (tv_sec) input parameter
34 .assert timespec::tv_sec = 0, error
42 lda (ptr1),y ; get day of month
43 sta SDX_DATE ; set day of month
46 lda (ptr1),y ; get month (0-based)
48 inx ; move [0..11] to [1..12]
52 lda (ptr1),y ; get year (0 = year 1900)
59 lda (ptr1),y ; get hour
63 lda (ptr1),y ; get minutes
67 lda (ptr1),y ; get seconds
70 ; set new time/date (SD-X call)
71 ; SpartaDOS-X User's Guide (4.48) states at page 145:
72 ; "In the I_GETTD and I_SETTD procedures a set Carry-Flag means that the clock driver is
73 ; busy at the moment. You should call the routine again."
74 ; It goes on to mention that one should provide an upper limit on the number of calls,
75 ; in order not to "hang". We are doing this here...
77 lda #0 ; init loop count (256)
80 try_set:lda #SDX_CLK_DEV ; CLK device
82 ldy #SDX_KD_SETTD ; SETTD function
83 jsr SDX_KERNEL ; do the call
90 bne drcter ; jump always
99 drcter: jmp __directerrno