/*
 * irq_remove — снять ВСЮ кадровую цепочку и отпустить IM2-таблицу
 * (последний пользователь возвращает I/IM 1 — штатный режим DSS).
 * Идемпотентно; вызывается и из atexit-уборки, поэтому обязано снимать
 * всё разом (exit не знает про отдельные слоты).  Для точечного снятия
 * одного обработчика — irq_chain_remove.
 */

#include "_irq.h"

void irq_remove(void)
{
    if (_irq_chain_n == 0) return;

    IRQ_DISABLE();
    for (uint8_t i = 0; i < IRQ_CHAIN_MAX; i++)
        _irq_chain[i] = 0;
    _irq_chain_n = 0;
    IRQ_ENABLE();

    /* Цепь держала РОВНО одну ссылку на таблицу (взята при первом
     * слоте) — отпускаем её один раз. */
    _irq_table_unref();
}
