Optron
#04
21 ноября 1997 |
|
Программирование - о неизвестном (внутреннем) регистре Z80.
╔════──── ║ │ Так сколько же регистров в Z80? │ ║ ────════╝ (C) Тятин Сергей Речь пойдет о неизвестном регистре Z80 (Рашпиль: я бы назвал его не просто ре- гистром, а внутренним регистром, поскольку работа с ним напрямую программными средствами не возможна). Неизвестным нас- только, что на его существование нет даже намека ни в одной известной мне литерату- ре. И в этом нет ничего удивительного, поскольку используется он только при вызо- ве немаскируемых прерыванй. Как известно Z80 имеет три режима обработки маскируемых прерыванй, которые устанавливаются коман- дами IM 0, IM 1, IM 2. Можно предположить, что внутри Z80 находится регистр, который хранит номер текущего режима маскируемых прерыванй, назовем этот регистр IMR. Из документации по Z80, на IMR влияют: - сигнал /RESET ;IMR=0; - команды IM 0, IM 1, IM 2 И! Кроме этого на IMR влияют сигнал /NMI и команда RETN! Дело в том ,что на самом деле в Z80 два регистра хранящих режим маскируемых прерыванй IMR1 и IMR2. IMR1 действительно хранит режим маскируемых прерыванй, а IMR2 используется для времен- ного хранения IMR1 при обработке немаски- руемых прерыванй. Так вот, о регистре IMR2 нигде, до сих пор не упоминалось. A рабо- тает он следующим образом (далее идут мои соображения по этому поводу). По приходу сигнала /NMI в IMR1 записывается то ли 0, то ли 1 (все-же скорее 0) что впрочем одно и тоже при стабильной шине данных. A ре- гистр IMR2 хранит значение IMR1 пока не закончится выполнение процедуры немаскиру- емого прерываня. При выполнении команды RETN IMR1 восстанавливается из IMR2, прерванная прога продолжает работать как ни в чем не бывало. Все вышесказанное можно свести к одной табличке: ┌────────────────────────┬──────┬──────┐ │ Действие │ IMR1 │ IMR2 │ ├────────────────────────┼──────┼──────┤ │ Сигнал /RESET │ 0 │ 0 │ │ Команда IM х │ х │ х │ │ Сигнал /NMI │ 0 │ IMR1 │ │ Команда RETN │ IMR2 │ - │ └────────────────────────┴──────┴──────┘ Все это очень похоже на триггер IFF и у меня есть глубокое подозрение, что IFF и IMR хранятся где-то рядом, но это уже ли- рика... Мне пришлось столкнуться с этим феноменом (то есть IMR), когда я писал те- невой монитор. Внутри монитора я пытался определить режим немаскируемого прерываня, но к моему величайшему удивлению (и сколько же я намучился пока разобрался в чем дело) не определялся второй тип преры- ваний. Корректно определить режим прерыва- ния можно таким образом: NMI_SR ; Точка входа в п/п ; обработки NMI PUSH AF ; Стандартное начало PUSH ВС ........... DI LD HL,IRUPT ; Установка LD (#ЧOFF),HL; вектора ; (Пример довольно грубый :-) LD A,#40 LD I,A LD A,#56 ; По умолчанию LD (ТУРЕ),A ; IM 1 ; Установка настоящего режима LD HL,TMP1 PUSH HL RETN TMP1 ; Теперь можно определять режим EI HALT ;Если было IM 2, ;выполнится IRUPT ........... ; Востановление режима IM 1 ; здесь хранится ТУРЕ EQU $-1; режим ............ ; Выход РОР AF RETN ;можно просто RET IRUPT LD A,#5E ; IM 2 LD (ТУРЕ),A RET Мне интересно было бы узнать, как спра- вились с этой проблемой авторы монитора для SCORPION (если они не знали о IMR ?). Вообще при использовании NMI открываются заманчивые возможности. Например написание 'надежных' MAGIC, теневых мониторов, мно- гозадачных операционных систем. Например, я написал теневой монитор, который распо- лагается в верхней памяти и по приходу NMI лагается в верхней памяти и по приходу NMI эта страничка отворачивается на место ПЗУ. Затем монитор распихивает все 128К по верхней памяти, сохраняет все регистры, режимы, в общем полностью состояние компьютера, так что даже перегрузив компьютер можно вернутся на прерванное место. A далее в #17 странчку закидывается Stalker monitor и можно работать с полным комфортом. Единственный глюк возникает когда прерываемая програма выполняет пере- мещение блоков данных стеком, но от этого просто так не избавиться. Но это все к де- лу не относится... если будут вопросы пи- шите, звоните. Еще меня можно найти на irc.funet.fi на канале #Z80 под nick Z8OST. 21:39:29 7-10-97 Тятин Сергей Email: s9415519@polynet.lviv.иа Phone: (0322) 679210 ──══════════──
Другие статьи номера:
Похожие статьи:
В этот день... 10 декабря