Optron #06
09 января 1998

NMI/INT и другие - О проблемах работы c прерываниями по NMI.

      ╔════────
      ║
      │    /NMI, /INT и другие    │
                                  ║
                          ────════╝

From: Klimov Vassili (#z80, nick BACbKA)

(C) Климов Василийблеме прерыва-
ния  работы  по  /NMI  и всему, что с этим
связано.
  Долго  распинаться не буду и поэтому пе-
рейду  сразу  к  делу.  Итак, я бы выделил
следующие  проблемы, возникающие при обра-
ботке немаскируемых прерываний:

  1) сохранение основных регистров;
  2) определение IFF (триггер прерываний);
  3) корректная работа с регистром R;
  4) определение режима прерываний  (IM 0,
1, 2);
  5) недопустимость порчи ячеек памяти;
  6) возможность определить номер включен-
ной страницы;
  7)  синронизация с маскируемыми прерыва-
ниями (тут же и номер экрана);
  8) восстановление всего запомненного вы-
ше и запуск;

  Теперь обо всем по подробней. Пункты с 1
по 4 решаются не сложно поэтому речь здесь
пойдет  об остальных. Чтобы не портить па-
мять, достаточно при обращении к процедуре
обработки  NMI включать вместо ПЗУ теневое
ОЗУ  (как и предлагал Сергей Тятин), тогда
программа будет иметь примерно такой вид:

        org     #0066
        ld      (Stack),SP
        ld      SP,Stack
        push    AF
        ld      A,I
        push    AF
        ...             ; обычное сохране-
        ...             ; ние регистров
        ...             ; через стек и оп-
        ...             ; ределение режима
        ...             ; прерываний
        defs    NNNN
Stack   defw    0

  Но  и  это  еще  не все. Дело в том, что
после  прихода NMI и подтверждения (/M1 OR
/IORQ)=0  на стек заносится адрес возврата
в  прерванную  программу.  Сергей говорит,
что  ее решить довольно сложно. Я же пред-
лагаю записывать адрес не на стек, а в па-
ру  8  разрядных регистров (сделать это не
составляет труда, но с паяльником побегать
придется :-)) (Рашпиль: не мог бы ты напи-
сать поконкретнее, как именно надо бегать,
а то я себе это представляю только в общих
чертах  и  изобретать  велосипед  не очень
охота).
  Теперь о портах расширения. Судя по все-
му, раз Пентагон объявлен стандартом, то и
расширение памяти до 512кб следует поддер-
живать  пентагоновское  (для  тех,  кто не
знает:  через  биты 6 и 7 порта #7ffd). Но
поскольку  реально существуют машины с па-
мятью больше 512кб (у меня, например, Про-
фи),  то необходимо срочно куда-нибудь за-
сунуть  этот  не  кстати  (??) появившийся
бит.  У  кого  есть идеи пишите. (Рашпиль:
есть одна идея: использовать 5-й бит порта
#7ffd,  блокировка порта #7ffd не очень-то
и  нужна - прогрммы Only 48K не плохо идут
через,  так называемый, USR 0.) Далее, ес-
тественно, необходим порт для чтения #7ffd
(а  если вы считывете адрес возврата, то и
для него тоже необходим порт). Здесь я мо-
гу  предложить  (всех  достал уже наверно)
порт #XXfd так, чтобы не конфликтовал с AY
(Рашпиль: если программа использует какое-
нибудь  виртуальное  ПЗУ или ОЗУ, то можно
сделать  порты,  доступные  только из этой
виртуальной  памяти, например так, как это
сделано  в  контроллере  Beta Disk). В ка-
честве  замечания  скажу, что в Скорпионах
системные порты можно читать через AY (хо-
тя  в ранних версиях, по-моему, стояло ду-
бовое определение страниц путем их сравне-
ния).
  Теперь  поговорим  об INT'е. В принципе,
тут  и говорить-то нечего, просто, по-мое-
му,  это  нигде  не  используется (имеется
ввиду в теневых мониторах). Просто опреде-
ляем число тактов между приходом /INT'а, а
при  вызове  /NMI считаем такты до прихода
маскируемых прерываний (вместе с этим мож-
но  организовать  определение  их типа). О
запуске  см.ниже.  У  вас может возникнуть
вопрос:  а  зачем это нужно? А я скажу: не
знаю :). Но сделать это не плохо бы... Да,
чуть  не  забыл,  можно сделать так, чтобы
прервать  CPU по /NMI через несколько так-
тов  после /INT: уменьшится число вычисле-
ний, и программу перезапускать будет лег-
че.
  Ну  а  теперь о последнем пункте (честно
говоря, запарился  я  уже  это писать пора
закругляться).  Ну  не  знаю я как это де-
лать,  не знаю :( . Дело все в память упи-
рается,  скорее всего, будет нельзя преры-
вать программу, выполняющуюся в ПЗУ (а BA-
SIC48 только там и работает), а при запус-
ке из теневого ОЗУ заменять его на ПЗУ. На
этом  мои  идеи  в данном разделе исчерпа-
лись.
  Теперь  пару  слов  о "многозадачности".
Вообще-то, под многозадачностью подразуме-
вается  параллельное  (в смысле последова-
тельное  переключение между ними) выполне-
ние  нескольких  программ (об этом см. ни-
же).  На  деле же мы имеем несколько прог-
рамм,  сидящих в памяти, с небольшим драй-
вером  переключения  между  ними  (MagOS).
Сделать  более "крутой" MagOS на Спектруме
нам помогут идеи, приведенные выше.
  А на счет многозадачности, то дело здесь
в "железе". Можно, в принципе, сделать тот
же  MagOS,  но сигнал /NMI будет генериро-
ваться  таймером  и не будет переключаться
экран  (как  это сделать - другой вопрос).
Но это все в будущем (а будет ли оно...).
  Ну  и  в заключении скажу, что все идеи,
приведенные выше, можно свободно использо-
вать,  но с единственным условием: необхо-
димо все стандартизировать, иначе ...
  Всем пока, до встречи на #Z80 (также жду
вопросов/ответов на страницах газеты).
  Всем,  кто  считает вышесказанное бредом
могу, посоветовать нажать на кнопку RESET.

  P.S. 09.12.97 Пермь.

  P.P.S.    KEEP SPECCY ALIVE!!

              ──══════════──





Другие статьи номера:

NMI/INT и другие - О проблемах работы c прерываниями по NMI.

Лит. страничка - Ночная смена (продолжение).

Письма читателей - SunLion о газете. Псевдо ПЗУ.

Реклама - Реклама и объявления...

Так кто же первый? - Когда и как появился Первый Отечественный Спектрум?..

Четыре килобайта - Модернизация оболочки.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Этюды - Печать символа, увеличенного в 8 раз. Программа "наливания" экрана. Процедура гашения экрана по точкам. Очистка экрана как в Terminator'е. Поиск последовательности символов в памяти. Система перекодировки символьного набора.
Крышу снесло - DI:HALT не всегда вызывает зависание...Santa Claus.
Мысли - Навеяные MSF: АнтиПроАмерику.

В этот день...   20 октября