Optron #06
09 января 1998

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

<b>NMI/INT и другие</b> - О проблемах работы 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 о газете. Псевдо ПЗУ.

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

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

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


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

Похожие статьи:
Новости - Hippiman/Conscience выпустил новогоднюю игру Dizzy Rescues Santa, Польский культуролог Пётр Марецки прислал большой опросник для будущей книги, Сергей Смирнов (Gogin) возродил свой проект по портированию игры Super Mario для Спектрума.
Новости - О новинках ПО: A Last Hero of the Light, Gambit, Пыль звездных дорог, Dimond Mail Editor, ZX-Power 3, Oberon 5, Voyager 2.
События - демопати CC999.999.
Железо - Покупатели дают высокие оценки модемам фирмы Наyes за возможность быстрого сжатия.
Комиксы, мультролики - Компьютерный комикс "Чудо шляпа" с участием утенка Дональда.

В этот день...   15 марта