/*
 * _irq_ctc_tramp — вход прерывания CTC-канала 3 (вектор 0x06, IM 2).
 *
 * Полный сейв обоих наборов + IX/IY, вызов _irq_ctc_user, restore,
 * EI/RETI.  RETI ОБЯЗАТЕЛЕН: периферия Z84C015 в daisy chain снимает
 * своё «interrupt under service» только увидев опкод RETI на шине —
 * с обычным RET следующее прерывание от CTC не придёт (см.
 * docs/samples/sprinterIntLib.asm).  К DSS НЕ чейнимся — это наше
 * личное прерывание, не системное.
 */

#include "_irq.h"

void _irq_ctc_tramp(void) __naked
{
    __asm
        push  af
        push  bc
        push  de
        push  hl
        .db   0x08                  ; ex af,af (теневой AF)
        push  af
        exx
        push  bc
        push  de
        push  hl
        push  ix
        push  iy

        ld    hl, (__irq_ctc_user)
        ld    a, h
        or    a, l
        jr    Z, _ictc_skip
        call  _ictc_call_hl
    _ictc_skip:

        pop   iy
        pop   ix
        pop   hl
        pop   de
        pop   bc
        exx
        pop   af
        .db   0x08                  ; ex af,af (теневой AF)
        pop   hl
        pop   de
        pop   bc
        pop   af
        ei
        reti

    _ictc_call_hl:
        jp    (hl)
    __endasm;
}
