/* * 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(); }