/* * irq_remove — снять user-handler и вернуть IM2-таблицу DSS * (I := сохранённое значение). Идемпотентно; вызывается и из atexit. * Если DSS был в IM 1 (old_i == 0) — восстанавливаем IM 1. */ #include "_irq.h" static void irq_restore(uint8_t i_val) __naked { (void)i_val; __asm ;; A = старое I. 0 → DSS работал в IM 1. ld i, a or a, a jr Z, _irqr_im1 im 2 ret _irqr_im1: im 1 ret __endasm; } void irq_remove(void) { if (!_irq_user) return; IRQ_DISABLE(); _irq_user = 0; irq_restore(_irq_old_i); IRQ_ENABLE(); }