Files
Sprinter-SDCC/libc/irq/_irq_tramp.c
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

73 lines
2.4 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_tramp — вход IM2-прерывания (вектор 0xFF, все источники).
*
* До выяснения источника трогаем только AF: клавиатура (бит 0 порта
* 0x19) и CBL (бит 7 порта 0xFE) уходят напрямую в DSS. Кадровое
* прерывание: полный сейв обоих наборов + IX/IY, вызов user-handler'а,
* симметричный restore. В конце ВСЕГДА jp на старый обработчик DSS
* (он делает свой save/restore и завершает EI/RETI) — клавиатурный
* FIFO, SYSTIME и курсор мыши продолжают обслуживаться.
*
* Операнд финального jp (_irq_dss_target) — SMC, патчится из
* irq_install; модуль в _CODE (RAM на Sprinter, W2 в tiny/big).
*/
#include "_irq.h"
void _irq_tramp(void) __naked
{
__asm
push af
in a, (#0x19)
rrca ; бит 0 клавиатурный байт принят?
jr C, _irq_chain
in a, (#0xFE)
rlca ; бит 7 запрос сэмпла CBL?
jr C, _irq_chain
;; --- кадровое прерывание ---
push bc
push de
push hl
ld hl, (__irq_user)
ld a, h
or a, l
jr Z, _irq_pop3 ; handler не установлен
;; Сохранить теневой набор и индексные user-код клобберит всё.
.db 0x08 ; ex af,af (теневой AF)
push af
exx
push bc
push de
push hl
push ix
push iy
ld hl, (__irq_user)
call _irq_call_hl
pop iy
pop ix
pop hl
pop de
pop bc
exx
pop af
.db 0x08 ; ex af,af (теневой AF)
_irq_pop3:
pop hl
pop de
pop bc
_irq_chain:
pop af
;; Всегда к DSS EI/RETI за ним.
.db 0xC3 ; jp nn
__irq_dss_target::
.dw 0x0038 ; патчится в irq_install
_irq_call_hl:
jp (hl)
__endasm;
}