/*
 * irq_ctc_remove — остановить CTC-таймер (мягкий reset канала 3 —
 * control-слово 0x03: reset без TC) и отпустить IM2-таблицу.
 * Обязателен перед выходом (atexit-уборка зовёт сама): без остановки
 * CTC продолжит дёргать INT после возврата в шелл.  Идемпотентно.
 */

#include "_irq.h"

static void ctc_stop(void) __naked
{
    __asm
        ld    a, #0x03              ; CH3: soft reset, прерывание выкл
        out   (#_IRQ_CTC_CH3), a
        ld    a, #0x03              ; CH2: остановить и делитель
        out   (#_IRQ_CTC_CH2), a
        ret
    __endasm;
}

void irq_ctc_remove(void)
{
    if (!_irq_ctc_user) return;
    IRQ_DISABLE();
    ctc_stop();
    _irq_ctc_user = 0;
    /* Слоты вектора 0x06 — назад в заливку H (чейн на 0x0038). */
    uint8_t *table = _irq_table();
    uint8_t  h     = (uint8_t)((uint16_t)table >> 8);
    table[0x06] = h;
    table[0x07] = h;
    IRQ_ENABLE();
    _irq_table_unref();
}
