/*
 * getdatetime — чтение RTC через ESTEX SYSTIME ($21).
 *
 *   $21 SYSTIME → D=day E=month IX=year H=hour L=min B=sec C=dow
 *
 * Раскладка структуры (datetime_t, 8 байт):
 *   +0 day, +1 month, +2..3 year, +4 hour, +5 min, +6 sec, +7 dow
 *
 * Пишет прямо в *dt — без статического скретча.  Ключевой трюк —
 * `ex (sp), hl` после RST: в HL час:мин, на вершине стека dt —
 * один байт меняет их местами, дальше идём по структуре через HL.
 */

#include <time.h>

void getdatetime(datetime_t *dt) __naked
{
    (void)dt;
    __asm
        push  ix                    ; save caller IX (BIOS clobbers it)
        push  hl                    ; stash dt across RST (clobbers HL)
        ld    c, #0x21              ; ESTEX SYSTIME
        rst   #0x10
        ;; Returns: D=day E=month IX=year H=hour L=min B=sec C=dow

        ;; ex (sp), hl: TOS<->HL.  Now HL = dt, TOS = hour:min stash.
        ex    (sp), hl
        ld    (hl), d               ; +0 day
        inc   hl
        ld    (hl), e               ; +1 month
        inc   hl
        push  ix                    ; year → stack
        pop   de                    ; DE = year
        ld    (hl), e               ; +2 year low
        inc   hl
        ld    (hl), d               ; +3 year high
        inc   hl
        pop   de                    ; D = hour, E = min (from earlier ex(sp))
        ld    (hl), d               ; +4 hour
        inc   hl
        ld    (hl), e               ; +5 min
        inc   hl
        ld    (hl), b               ; +6 sec
        inc   hl
        ld    (hl), c               ; +7 dow
        pop   ix                    ; restore caller IX
        ret
    __endasm;
}
