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>
This commit is contained in:
+27
-2
@@ -53,8 +53,33 @@
|
||||
- irq_remove вешается на atexit (выход без снятия = IM 2/I указывают в
|
||||
память умершего процесса = крах шелла); восстановление — всегда IM 1.
|
||||
|
||||
Phase 2 (CBL/COVOX handler, ISA, цепочка нескольких хендлеров) — ниже
|
||||
по плану, не реализовано.
|
||||
## Phase 2a — CTC-таймер (РЕАЛИЗОВАН 2026-07-07)
|
||||
|
||||
`irq_ctc_install(handler, div2, div3)` / `irq_ctc_remove()` — вектор
|
||||
0x06, ОТДЕЛЬНЫЙ от кадрового 0xFF (решает проблему «кадр и клавиатура
|
||||
неразличимы»). Механика (по docs/samples/sprinterIntLib.asm и
|
||||
SIO_CTC_KEY.asm):
|
||||
|
||||
- CTC Z84C015: канал 2 тактируется видеотактом **875 кГц (1 тик =
|
||||
1 знакоместо)** и работает делителем; канал 3 считает от канала 2 и
|
||||
прерывает. f = 875000/(div2*div3), div 0 = 256;
|
||||
- пресет IRQ_CTC_VSYNC_DIV2/3 = 112×160 (2 пикс. линии × 160 = 320
|
||||
линий) — точное начало кадра ~48.8 Гц;
|
||||
- порты: CH0=0x10, CH2=0x12, CH3=0x13; control-слова 0x57 (ch2:
|
||||
counter, int off) / 0xD7 (ch3: counter, int on); базовый вектор
|
||||
блока пишется в CH0 (0 → вектор ch3 = 0x06); стоп = 0x03 (reset);
|
||||
- **RETI обязателен** в CTC-трамплине: daisy chain Z84C015 снимает IUS
|
||||
только по опкоду RETI — с RET следующее прерывание не придёт;
|
||||
- CTC-путь НЕ чейнится к DSS (личное прерывание); кадровые/клавиатурные
|
||||
0xFF идут своим путём параллельно;
|
||||
- общая IM2-таблица под счётчиком ссылок (_irq_table.c): кадровый и
|
||||
CTC-хендлеры ставятся/снимаются независимо, последний возвращает
|
||||
I/IM 1; atexit-уборка глушит CTC ОБЯЗАТЕЛЬНО (иначе после выхода
|
||||
прерывания кГц-частоты душат шелл).
|
||||
|
||||
Phase 2b (CBL/COVOX handler — вернуть фильтр 0xFE.7 при активном CBL,
|
||||
sample-буфер; фундамент Audio API), ISA-вектора, цепочки нескольких
|
||||
хендлеров — не реализовано.
|
||||
|
||||
Этот документ собирает всё, что мы знаем о прерываниях Sprinter и план реализации user-задаваемых ISR через Z80 IM 2 mode. Когда возьмёмся за реализацию — читать этот файл, чтобы не повторять research.
|
||||
|
||||
|
||||
@@ -161,6 +161,8 @@ font[row*256+char]).
|
||||
|---|---|
|
||||
| `int irq_install(isr_t h)` | h зовётся ~50 Гц на кадровых прерываниях; DSS-обработчик чейнится всегда (клавиатура/SYSTIME/мышь живы). 0 / -1+errno (EBUSY повтор, EINVAL — код не в W2: только tiny/big) |
|
||||
| `void irq_remove(void)` | вернуть таблицу DSS; идемпотентно; висит на atexit |
|
||||
| `int irq_ctc_install(h, div2, div3)` | периодический таймер CTC (вектор 0x06): f = 875000/(div2×div3), div 0=256; пресет кадра IRQ_CTC_VSYNC_DIV2/3 (112×160, ~48.8 Гц); независим от кадрового; трамплин завершает RETI |
|
||||
| `void irq_ctc_remove(void)` | глушит CTC (обязательно; atexit подстрахует) |
|
||||
| `IRQ_DISABLE()/IRQ_ENABLE()` | di/ei — скобки для чтения shared-переменных из main |
|
||||
|
||||
Handler'у нельзя: ESTEX/BIOS-вызовы, gfx_*/своп окон, акселератор,
|
||||
|
||||
@@ -23,7 +23,7 @@ gfx_mous 5542
|
||||
gfx_text 2560
|
||||
hello 4176
|
||||
hello2 4251
|
||||
irqtest 4818
|
||||
irqtest 5834
|
||||
ls 4919
|
||||
malloc 4462
|
||||
mdview 19122
|
||||
|
||||
|
Reference in New Issue
Block a user