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.
|
|
|
|
|
|
|
|
|
|
|