╔════──── ║ │ /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!! ──══════════──