Files
Sprinter-SDCC/libc/irq/_irq.h
T
snark13 a6fe50e247 libc: IM2 user-ISR, Phase 1 — libc/irq (irq_install/irq_remove) + irqtest
Проще исходного плана (docs/im2_isr_design.md обновлён): отдельный
--memory im2 не понадобился.

- <irq.h>: irq_install(handler) — вызов ~50 Гц только на КАДРОВЫХ
  прерываниях (клавиатура bit0:0x19 и CBL bit7:0xFE отфильтровываются);
  штатный обработчик DSS чейнится ВСЕГДА (SMC-jp, адрес из старой
  IM2-таблицы по регистру I) — клавиатура/SYSTIME/мышь живут
- вектор-таблица: 513 Б BSS + runtime-выравнивание; Sprinter шлёт
  только вектор 0xFF, поэтому jp-заглушка лежит внутри самой таблицы
  по смещению H — без linker-областей и правок crt0
- трамплин: полный сейв обоих наборов+IX/IY вокруг user-handler'а
  (ex af,af' как .db 0x08 — апостроф ломает препроцессор SDCC)
- tiny/big: работает (код в W2); small/huge: EINVAL по проверке
  адресов; irq_remove идемпотентен и висит на atexit (выход без
  снятия = I в памяти умершего процесса = крах шелла); old_I==0 → IM1
- tests/irqtest: тики за 3 с против time() (~50 Гц), живая клавиатура
  под handler'ом, остановка после remove, чистый выход
- docs: im2_isr_design (статус+дельты), libc-reference (<irq.h>), TODO

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 21:21:16 +03:00

37 lines
1.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* _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 <stdint.h>
#include <irq.h>
/* Буфер под таблицу: 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