/* * _irq.h — внутренности IM2-модуля (НЕ публичный заголовок). * * Механика (docs/im2_isr_design.md): * - таблица векторов: 257 байт с выравниванием 256 внутри статического * буфера 513 байт (_irq_state.c), заполняется байтом H = старший * байт её же адреса; CPU по вектору V читает адрес (H<<8|H) — * трёхбайтовый `jp _irq_tramp` лежит ВНУТРИ таблицы по смещению H * (безопасно: Sprinter шлёт только V=0xFF, а H < 0xC0); * - трамплин (_irq_tramp.c): AF-пробник портов 0x19/0xFE; кадровое * прерывание → полный save → user handler → restore; затем ВСЕГДА * jp на старый обработчик DSS (SMC-операнд, патчится при install) — * EI/RETI делает DSS; * - install: I := H, IM 2; remove: I := старое, IM 2. */ #ifndef _IRQ_INTERNAL_H #define _IRQ_INTERNAL_H #include #include /* Буфер под таблицу: 256 (выравнивание) + 257 (таблица). */ #define _IRQ_VEC_BUF_SIZE (256 + 257) extern uint8_t _irq_vec_buf[_IRQ_VEC_BUF_SIZE]; extern isr_t _irq_user; /* NULL = не установлен */ extern uint8_t _irq_old_i; /* I до install */ /* Вход трамплина (asm, _irq_tramp.c). */ void _irq_tramp(void); /* SMC-операнд `jp` на старый DSS-обработчик — метка внутри трамплина, * пишется из irq_install (16-битный адрес). */ extern uint16_t _irq_dss_target; #endif