Files
Sprinter-SDCC/libc/irq/_irq_ctc_tramp.c
T
snark13 8a952b99eb irq: Phase 2a — CTC-таймер на отдельном векторе 0x06 (Z84C015)
- irq_ctc_install(handler, div2, div3) / irq_ctc_remove: канал 2 CTC
  делит видеотакт 875 кГц (1 тик = 1 знакоместо), канал 3 считает от
  него и прерывает; f = 875000/(div2*div3), div 0 = 256. Пресет
  IRQ_CTC_VSYNC_DIV2/3 = 112*160 — точное начало кадра ~48.8 Гц БЕЗ
  примеси клавиатуры (вектор 0x06 отделён от общего 0xFF)
- CTC-трамплин: полный сейв -> handler -> EI/RETI; RETI обязателен
  (daisy chain Z84C015 снимает IUS только по опкоду RETI); к DSS не
  чейнится — личное прерывание
- общая IM2-таблица под счётчиком ссылок (_irq_table.c): кадровый и
  CTC-хендлеры независимы, последний unref возвращает I/IM 1;
  atexit-уборка глушит CTC обязательно (иначе кГц-прерывания душат
  шелл после выхода)
- порты/слова по docs/samples: CH0=0x10/CH2=0x12/CH3=0x13,
  0x57/0xD7/вектор в CH0, стоп 0x03
- irqtest: CTC-vsync параллельно с кадровым + произвольная частота;
  MAME: frame 48 Гц, ctc(vsync) 49 Гц (parallel frame жив),
  ctc(50x50) 350 Гц точно по формуле, remove/выход чистые

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 09:15:04 +03:00

56 lines
1.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_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;
}