Reobne писал(а):
Я вот тоже не понимаю, зачем от человека прятать то, что он должен настроить?
Ну с этим всё просто. Сперва человек пишет как бы на ZX Basic, не парясь режимом прерываний. Потом, узнав что есть режим IM 2, человек задаётся вопросом: как его использовать? И узнаёт это. Для библиотеки Basic этого более чем достаточно, это даже больше, чем есть в ZX Basic. А для более изощрённых применений не используем библиотеку Basic, пишем свою с другой логикой.
Смысл конфигурирования внешним конфигуратором, вынесенным из исходника, открывается когда тебе нужно сгладить различия платформ. Чтобы исходник выглядел одинаково для всех платформ, а отличались только специфические конфигураторы. Так устроена игра Dark Woods. И, возможно, в библиотеке Basic смысл выделять режим прерываний в конфигуратор и сомнителен, поскольку Basic чётко машинно-зависимая, то уж в библиотеке Console его намного больше, потому что этот модуль относительно кроссплатформенный. Если брать Console в качестве хост-модуля (вместо Basic) — выбор режима прерываний не нужен для платформы Windows, но, если в этой же программе используется и музыка, он нужен для ZX.
Reobne писал(а):
Если прерывания не нужны, нет ни музыки, ни таймера, ни паузы, ни стандартного опроса клавиатуры, то отключить их совсем.
Пауза может разрешать прерывания, отрабатывать и опять запрещать. Так работает внутренняя процедура Basic_PAUSE_DI.
Reobne писал(а):
Если нужен опрос клавиатуры, или пауза, то генерируется "IM 1"
А если нужен опрос клавиатуры и пауза в режиме IM 2 (для музыки в фоне)?
Reobne писал(а):
Если-же Некоторое количество модулей хотят сами повисеть на прерываниях,
Вах, дарагой.

Не пойму твоего упорства всё время представлять это с такой стороны: “модуль регистрирует обработчик и наслаждается своей автономностью”. Это из мира событийного программирования. Если некоторое количество модулей хотят повисеть на прерывании, пусть экспортируют свою внутреннюю процедуру-обработчик RunMe50Hz. А диспетчер будет сам дёргать эти обработчики. И напишет его сам юзер, не тратя лишних тактов. Так будет намного эффективнее для ZX. Лучше здесь просто не придумаешь. Централизованное сохранение регистров, вызов именно в нужном порядке (например, сначала опрос клавиш, потом музыка). И так будет относительно кроссплатформенно. Ты просто опишешь диспетчер IM 2 в ядре, отличающемся для разных платформ. И это ядро будет маленьким, оно будет только помогать сгладить платформенные различия.
Reobne писал(а):
например вызывают:
ZX_Interrupt.StaticReg(MyProc,0(* приоритет *),ZX_Interrupt.NeedPush_AFHL+ZX_Interrupt.NeedPush_BC+ZX_Interrupt.NeedPush_IX);
ZX_Interrupt - модуль отвечающий за спектрумовские прерывания
StaticReg,DynamicReg,UnReg - его функции регистрации обработчика.
Тогда формируется мощьный код, с формирование 257-байтной таблицы. Если вызывается DynamicReg, то по другому, и больше кода.
Да, можно сделать как ты предлагаешь. Я сделал как мне на тот момент казалось удобнее (или проще).
Ты хочешь сделать чтобы модуль мыши сам регистрировал обработчик, сам обрабатывал прерывания и всё это было бы достаточно локализованно, чтобы не влиять на работу других модулей? Это возможно, но это малоцелесообразно. Как я уже сказал, в ZX события не вызывают прерываний. Ты хочешь эту активность эмулировать, и пожалуйста, но меньше кода у тебя не будет.
Reobne писал(а):
Может модуль узнать, какие его вызовы есть, и с какими аргументами?
Модуль не может узнавать какие вызовы есть. Он просто может экспортировать наружу разные процедуры (вплоть до асмовых вставок), а уже сама процедура узнаёт какие вызовы есть, но только в рантайме конечно. Создав набор смартлинкуемых процедур можно добиться примерно того же эффекта, только будет не ZX_Interrupt.NeedPush_AFHL+ZX_Interrupt.NeedPush_BC+ZX_Interrupt.NeedPush_IX, а ZX_Interrupt.NeedPush_AFBCHLIX, ZX_Interrupt.NeedPush_AFBCDEHLIXIY и т.д. и т.п. Этого мусора будет там много, но другого способа сделать всё в compile-time я не знаю. И, опять же, всё это имело бы больше смысла если бы модуль для работы с мышью был кроссплатформенным. А так ориентация на Спек железная. Впрочем, я понимаю. Ты хотел бы просто прикрепить задачу к "активности" вызовом отдельной процедуры. И забыть про все проблемы. Но тогда нужна будет очередь вызова и действительно будет много мороки с описанием сохранения регистров. И в compile-time это можно сделать лишь каким-либо сишным препроцессором. Впрочем, надо подумать. Просто мне такое точно не нужно, надеюсь обойтись своим центральным обработчиком и вызовами в стиле RunMe50Hz. Ведь даже кроссплатформенный модуль для работы с мышью (его ZX-реализация) может экспортировать процедуру RunMe50Hz, о которой будет знать только ZX-ядро.