/* * irq_remove — снять user-handler и вернуть систему в штатный режим * DSS: I := сохранённое значение (наследие Spectrum ROM, обычно 0x3F) * и ВСЕГДА IM 1 — DSS работает в IM 1, его обработчик на 0x0038 * (так же делают сэмплы сообщества: sprinterIntLib.asm * intRestoreDefaultInterrupt, SIO_CTC_KEY.asm). Идемпотентно; * вызывается и из atexit. */ #include "_irq.h" static void irq_restore(uint8_t i_val) __naked { (void)i_val; __asm ;; A = старое I (только регистр; режим DSS — всегда IM 1). ld i, a im 1 ret __endasm; } void irq_remove(void) { if (!_irq_user) return; IRQ_DISABLE(); _irq_user = 0; irq_restore(_irq_old_i); IRQ_ENABLE(); }