/* * _irq_ctc_tramp — вход прерывания CTC-канала 3 (вектор 0x06, IM 2). * * Полный сейв обоих наборов + IX/IY, вызов _irq_ctc_user, restore, * EI/RETI. RETI ОБЯЗАТЕЛЕН: периферия Z84C015 в daisy chain снимает * своё «interrupt under service» только увидев опкод RETI на шине — * с обычным RET следующее прерывание от CTC не придёт (см. * docs/samples/sprinterIntLib.asm). К DSS НЕ чейнимся — это наше * личное прерывание, не системное. */ #include "_irq.h" void _irq_ctc_tramp(void) __naked { __asm push af push bc push de push hl .db 0x08 ; ex af,af (теневой AF) push af exx push bc push de push hl push ix push iy ld hl, (__irq_ctc_user) ld a, h or a, l jr Z, _ictc_skip call _ictc_call_hl _ictc_skip: pop iy pop ix pop hl pop de pop bc exx pop af .db 0x08 ; ex af,af (теневой AF) pop hl pop de pop bc pop af ei reti _ictc_call_hl: jp (hl) __endasm; }