Files
Sprinter-SDCC/libc/irq/irq_remove.c
T
snark13 5184415fc4 irq: фикс Phase 1 после отладки — DSS работает в IM 1, чейн всегда на 0x0038
Первая версия висла на первом прерывании. Две причины (verified по
docs/samples/sprinterIntLib.asm, SIO_CTC_KEY.asm и исходникам MAME):

- DSS работает в IM 1 (обработчик 0x0038); I=0x3F — наследие Spectrum
  ROM, НЕ таблица: чтение [I<<8|0xFF] давало мусор (0x00BF) и прыжок в
  никуда. Чейн из трамплина теперь ВСЕГДА jp 0x0038 (interrupted-PC на
  стеке = имитация RST 38); irq_remove безусловно восстанавливает IM 1
- CBL-фильтр по биту 7 порта 0xFE убран: при выключенном CBL бит
  подтянут к 1 (MAME kbd_fe_r: data |= 0xE0) — каждый кадр ложно
  уходил в чейн, user-handler не вызывался бы. Вернуть в Phase 2
  вместе с поддержкой CBL

Попутно подтверждено: порт 0x19 = SIO-A RR0 (Z84C015), бит 0 = Rx
Available; вектора встроенной периферии SIO 0x10..0x1E / CTC 0x06
(заливка 257×H ловит любые); внешний вектор 0xFF.

irqtest: диагностика I до установки + фаза без ESTEX; прогон в MAME:
~49 Гц, клавиатура жива, remove останавливает тики, чистый выход.

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

31 lines
910 B
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_remove — снять user-handler и вернуть систему в штатный режим
* DSS: I := сохранённое значение (наследие Spectrum ROM, обычно 0x3F)
* и ВСЕГДА IM 1 — DSS работает в IM 1, его обработчик на 0x0038
* (так же делают сэмплы сообщества: sprinterIntLib.asm
* intRestoreDefaultInterrupt, SIO_CTC_KEY.asm). Идемпотентно;
* вызывается и из atexit.
*/
#include "_irq.h"
static void irq_restore(uint8_t i_val) __naked
{
(void)i_val;
__asm
;; A = старое I (только регистр; режим DSS всегда IM 1).
ld i, a
im 1
ret
__endasm;
}
void irq_remove(void)
{
if (!_irq_user) return;
IRQ_DISABLE();
_irq_user = 0;
irq_restore(_irq_old_i);
IRQ_ENABLE();
}