Передала система управления с помощью JP [IX/IY] (с двойным префиксом) или завершила прерывание по RETI/RETN - выключился системный режим. Пришло прерывание - включился системный режим. Вызвала несистемная программа RST XX - тоже включился. Всё.
Некоторая тонкость возникает при реентерабельных прерываниях и вообще про прерываниях в системном режиме. Получается, что он включится ещё раз (это вроде не беда), но при окончании - выключится, хотя не должен был. Это как-то не очень хорошо.
Подразумевавшееся ранее решение - сделать бит принудительной системности в системном порту, при которой всё работает не так и из которой можно выйти только этот бит сбросив. Но теперь я вообще сомневаюсь, что системный порт вообще нужен, хотелось бы отказаться и от этого бита, тем более, что для многоуровневой реентерабельности прерываний его и не хватит.
Первое решение - вообще не допускать прерываний в системном режиме, а для длинных задач (например, копирование памяти или вывод большого текста на экран) запускать условно прикладной процесс, давая ему требуемые страницы памяти. Реентерабельные прерывания идут лесом, но так как обработчики вообще будут короткими, то и ладно. Недостатки - нельзя использовать немаскируемые прерывания и в системном режиме HALT.
Второе решение - в системном режиме не допускать прерываний, не переключив таблицу векторов на другую - тем прерываниям не надо будет сохранять/восстанавливать контекст прикладной программы и указатель стека, они будут за счёт этого значительно быстрее, можно будет использовать HALT. Потребуется второй режим прерываний и запретить прикладным программам его переключать и менять регистр I (что обдумывалось с самого начала)... вопрос про немаскируемые...
И тут возникло (вот прямо в процессе написания прошлого абзаца, поскольку вся эта запись - аналог размышления вслух) такое решение - а обработчик немаскируемого прерывания может сам узнать, в каком режиме он работает - в системном или нет - просто прочитав значение регистра I. Дальше уже можно оставаться в системном или переключаться в него по обстоятельствам.
Получается, системный порт вообще не нужен, а признаком системности будет значение регистра I. Вероятно выходить из системного режима нужно будет не по просто RETI/RETN, а с префиксом.