Программирование в машинных кодах и на языке ассемблера 1993 г.

Прерывания - описание системы прерываний процессора Z80.


5.18. Команды прерывания

 

Команды прерываний позволяют с помощью внешних сигналов прерывать последовательность исполнения команд в процессоре. Процессор Z-80 имеет три режима прерываний - режимы 0,1 и 2. Сразу оговоримся, что не все они реализованы в «Спектруме», хотя мы осветим все.

Когда процессор получает прерывание, то если оно разрешено, нормальный ход исполнения программы прерывается и управление передается в специальную программу обработки прерываний. Место расположения этой обрабатывающей программы зависит от того, какой режим прерывания включен. Программа обработки прерывания прекращает свою работу, когда встречает специальную команду возврата, после чего управление вновь передается той программе, которая была прервана.

В этой группе всего 7 команд и мы последовательно их рассмотрим.

 

Команда EI.

Код FB. Назначение - разрешение прерывания. После прохождения этой команды обработка прерываний разрешена.

 

Команда DI.

Код - F3. Назначение - запрет прерываний. Она запрещает прерывания до тех пор, пока не пройдет команда EI.

 

Команда IM0.

Код - ED 46. Назначение - включение прерываний в режиме 0. О режимах прерываний см. несколько ниже.

 

Команда IM1.

Код - ED 56. Назначение - включение режима прерываний первого типа (см. ниже).

 

Команда IM2.

Код - ED 5E. Назначение - включение режима прерываний второго рода (см. ниже).

 

Команда RET I.

Код - ED 4D. Эта команда аналогична команде RET (возврат после вызова подпрограммы), но выполняет двойную функцию:

·         возврат из подпрограммы, обслуживающей маскируемое прерывание;

·         разрешение маскированного прерывания (ведь во время работы обслуживающей программы оно запрещалось, иначе новое прерывание могло бы прервать обработку прерывания и т.д.).

 

Команда RET N.

Код - ED 45. Она аналогична команде RET I, но обеспечивает возврат при выходе из обработки немаскированного прерывания.

 

Прерывания в «Спектруме» и их использование

По своей архитектуре микропроцессор Z-80 имеет возможность обработки двух видов прерываний - маскируемых и немаскируемых. Маскируемые прерывания делятся на три типа - прерывания типа 0, 1 и 2. Тип маскируемого прерывания устанавливается с помощью команд Ассемблера:

      IM 0 - код ED 46H

      IM 1 - код ED 56H

      IM 2 - код ED 5EH

IM - аббревиатура от английского Interrupt mode (тип прерывания.)

Z-80 имеет два входа для сигналов запроса прерываний - входы «INT» и «NMI».

На входе линии запроса прерывания «INT» (16 ножка микросхемы) внешнее устройство формирует сигнал низкого уровня, обращая «внимание» микропроцессора на этот сигнал. В СПЕКТРУМЕ сигнал «INT» формируется 50 раз в секунду. Если флаг прерывания сброшен (лог. «0»), запрос воспринимается, и микропроцессор прерывает обычную обработку и переходит к выполнению необходимой процедуры прерывания. Реакция на запрос прерывания определяется флагом прерывания, поэтому прерывание может быть замаскировано. В программу вводятся команды, которые устанавливают или сбрасывают флажок прерывания и, следовательно, разрешают или запрещают его обработку. В Z-80 таких команд две:

      DI (Disable interrupts) - запрещение прерываний.

      EI (Enable interrupts) - разрешение прерываний.

Такой способ позволяет гибко реагировать на прерывания - мы сами определяем, воспринимать их или игнорировать.

Однако, в некоторых ситуациях требуется, чтобы прерывания обслуживались независимо от текущих действий микропроцессора. Для этих целей предусмотрена отдельная линия немаскируемого прерывания «NMI».Когда на ней появляется сигнал низкого уровня, то по фронту этого сигнала выполнение программы прерывается независимо от состояния флага прерываний, т.e. независимо от того, разрешены прерывания или запрещены. При этом микропроцессор Z-80 начинает обработку процедуры с адреса 0066Н.

К сожалению, в ПЗУ «СПЕКТРУМА» в процедуре обработки немаскируемого прерывания «NMI» содержится грубая ошибка (кто знает - случайна ли она?), благодаря которой обработка «NMI» или приводит к рестарту компьютера с нулевого адреса, или не дает никаких результатов, производя обычный возврат в точку, откуда было вызвано прерывание.

Однако если Вы работаете или в дальнейшем собираетесь работать с измененным или теневым ПЗУ, то можете с адреса 0066Н поместить свою программу обработки «NMI» или исправить ошибку в стандартной программе. Для этого необходимо по адресу 006DH заменить код 020Н (JP NZ,) на код 028H (JP Z,). В этом случае программа будет проверять системную переменную «NMIADD» (адреса 23728 и 23729 - 5CB0H и 5CB1H) и, если там не ноль, то будет произведен переход по адресу, содержащемся в этой переменной. Таким образом, Вы сможете расположить свою программу обработки «NMI» по любому необходимому адресу.

Если Вы хотите работать с «NMI», Вам необходимо будет произвести небольшую доработку компьютера. Дело в том, что на вход «NMI» (17 ножка) Z-80 в «СПЕКТРУМЕ» постоянно подано +5В (если, конечно, у Вас не подключен контроллер дисковода, где этот вход уже используется кнопкой «MAGIC»). Вам необходимо будет отрезать вход «NMI» от +5В и подключить его к своему внешнему устройству (в самом простом варианте - это будет кнопка), с помощью которого Вы в нужное время будете подавать сигнал низкого уровня на этот вход и включать, тем самым, свою процедуру обработки немаскируемого прерывания.

Обычно запросы  «NMI» используются для прерывания работы микропроцессора при «катастрофических» событиях, требующих немедленной реакции, таких, как аварийное пропадание питания, обнаружение ошибки памяти и т.д. Однако все зависит еще и от Вашей фантазии. Так, например, нередко делают с помощью «NMI» распечатку любой понравившейся картинки на принтере.

Для возврата из программы обработки немаскируемого прерывания используйте команду Ассемблера - RETN (Return from non maskable interrupts) - код ED 45H.

Теперь рассмотрим виды маскируемых прерываний, обрабатываемых по запросу на линии «INT».

 

«IM 0».

Прерывания нулевого типа. В «СПЕКТРУМЕ» этот тип прерывания не реализован вообще. Поэтому мы рассмотрим его вкратце.

С помощью режима  «IM 0» возможно аппаратное переключение вектора прерывания, т.е. адреса программы обработки прерываний. Для этого вводится контроллер прерываний, который отсутствует в «СПЕКТРУМЕ». Такое устройство несложно организовать на основе БИС КР580ИК14 или КР580ВН59, которые по сути являются уже готовыми контроллерами прерываний. Как это организовать, Вы можете узнать из литературы по микропроцессорному комплекту КР580.

Всего векторов прерываний обычно восемь, в стандартном варианте, при использовании адресных линий А0-А2 эти вектора попадают на адреса рестартов процессора, т.e. на «RST0 - RST38H», которые уже задействованы в ПЗУ «СПЕКТРУМА», причем одна процедура «RST38H» служит для обработки прерываний. Xотя, конечно, можно это и обойти, используя другие адресные линии.

Кстати, без контроллера прерываний включение «IM  0» равносильно включению «IM 1».

 

«IM 1».

После включения питания в «СПЕКТРУМЕ» устанавливается режим прерываний 1. «IM 1» - называется маскируемым прерыванием первого типа и выполняет обращение по адресу 0038Н, что обеспечивает сканирование клавиатуры и изменение встроенного системного таймера, но если подключено ПЗУ контроллера дисководов или интерфейса микродрайва, то все, что делается при включении прерывания- это немедленный возврат без сканирования клавиатуры или каких-либо других действий, т.е. по адресу 0038Н в этих ПЗУ записан код возврата из прерывания «RETI» (eturn from interrupt) - ED 4DH.

Поскольку «IM 1» использует «RST38H», а программа, находящаяся по адресу 0038Н, уже хорошо сформирована и вряд ли требует каких-либо изменений и дополнений, то и интерес к прерываниям первого типа носит, скорее всего, познавательный характер.

Наиболее интересными являются прерывания второго типа.

Но прежде, чем перейти к прерываниям второго типа, мы немного отвлечемся в сторону и поговорим о формировании телевизионного изображения в «СПЕКТРУМЕ».

Все нижеописанное справедливо для фирменного «СПЕКТРУМА», т.к. речь пойдет о контроллере дисплея на микросхеме «ULA», но, по-видимому, должно представлять интерес для всех поклонников «СПЕКТРУМА», интересующихся этим режимом прерываний. Независимо от того, какой версией компьютера они пользуются, ведь во всех версиях есть контроллеры дисплея, собранные на дискретных элементах, ПЗУ или ПЛМ. Это, во-первых. А во-вторых, владение этими знаниями, возможно, поможет стандартизации отечественного программного обеспечения.

При инициализации «СПЕКТРУМА» в регистре прерываний I помещается число 63 (03FH) и устанавливается первый тип прерываний. В принципе, задавать регистр «I» необязательно, т.к. режим «IM 1» его не использует, потому что любые прерывания идут через «RST38H». Но регистр I в фирменном «СПЕКТРУМЕ» дополнительно участвует в формировании телевизионного сигнала. «ULA» задействует биты 6 и 7 регистра «I».

При каждом цикле машинных команд Z-80 обращается к ячейке памяти, адресуемой регистром I, выводя его, в старшие восемь битов адресной шины, а линия запроса памяти «MREQ» активизируется. «ULA» генерирует прерывания каждый раз, когда необходимо изменить содержимое экрана. Это заставляет Z-80 запустить программу обработки прерываний, при условии, что прерывания подключены.

Когда программа обработки прерываний выполнена, процессор возвращается в точку, в которой он был при прерывании. Если это команды считывания/записи в память между 16384 (4000H) и 32767 (7FFFH), что «ULA» проверяет, просматривая две старшие линии адресной шины и линию «MREQ», то «ULA» приостанавливает микропроцессор до окончания изменения экрана.

Если старший бит регистра I сброшен, а бит 6 активизирован, то «ULA» может запутаться из-за регенерации динамической памяти. Активизируется линия «MREQ», и регистр I помещается в старшие восемь битов адресной шины. Далее «ULA» думает, что процессор производит запись или считывание в эту область ОЗУ, и при попытке это предотвратить, «ULA» пропускает свое собственное обращение для изменения дисплея, что приводит к развалу картинки. Поэтому в регистре I не должно содержаться любое число от 64 до 127 (040H  до 07FH) включительно, т.е. c двумя старшими битами, установленными вышеописанным образом.

Скорее всего, это справедливо и для других версий компьютеров с разделением поля памяти на 16К и 32К (см. «ZX-РЕВЮ» N1, 1991г.). По крайней мере, при записи в регистр I чисел из запрещенного интервала на компьютерах версий «НОВОСИБИРСК», «БАЛТИКА», «ЛЕНИНГРАД» развала картинки не наблюдалось. Но, по-видимому, все-таки лучше придерживаться указанных ограничений, если Вы хотите, чтобы ваши программы могли работать и на других версиях «СПЕКТРУМА», особенно, если Вы разрабатываете коммерческое программное обеспечение.

 

«IM 2».

Путем установки «IM 2» Вы можете использовать прерывания для Ваших собственных целей. Тут уже все зависит только от Вас.

С помощью «IM 2» возможно менять вектор прерываний как программно, так и аппаратно.

Режим «IM 2» сложен. При получении прерывания по линии «INT» процессор запоминает адрес следующей команды программы на машинном стеке, затем просматривает ячейку, указанную шиной данных плюс 256, умноженное на содержимое регистра I и передает управление к адресу, содержащемуся в этой ячейке плюс (256, умноженное на содержимое следующей ячейки). Вообще-то, считается дурным тоном иметь бит ноль на шине данных активированным в качестве указателя в режиме «IM 2», т.к. указатель всегда будет стартовать с адреса, пронумерованного четным числом, но, к сожалению, в «СПЕКТРУМЕ» нет выбора.

Пример 1.

В регистре I содержится число 10 (0AH), а на шине данных выставлено число 255 (0FFH). При этом :

      10*256=2560

      2560+255=2815.

Этот адрес находится в ПЗУ «СПЕКТРУМА», поэтому точка, к которой будет сделан переход, возьмется из содержимого адреса 2815+(256, умноженное на число по адресу 2816). В ячейке 2815 содержится 34, а в 2816 - 128. В этом можно убедиться с помощью оператора PEEK. Таким образом, адрес перехода равен :

      34+(256*128)=32802.

 

Пример 2.

Регистр I содержит 200, шина данных 255.

      200*256=51200

      51200+255=51455.

Переход будет сделан по адресу, который Вы поместите в ячейки 51455 и 51456.

Гораздо проще все выглядит в шестнадцатеричном виде. Тут уже не надо вычислять адрес, откуда брать точку для перехода. Просто шина данных формирует младший байт адреса, а регистр I - старший байт. По этому адресу берется точка перехода на программу обработки прерываний, где опять-таки данный адрес содержит младший байт, а следующий за ним - старший байт адреса программы.

Все это можно представить, как косвенную адресацию по содержимому регистровой пары, причем регистровую пару на этот раз составляет шина данных и регистр I. Это своего рода команда CALL (I+ШД). Но, т.к. такой команды не существует, и она не может разместить собственный адрес возврата, то адрес после последней выполненной команды кладется процессором на машинный стек, и к нему будет осуществлен возврат после выполнения программы обработки прерываний.

Как Вы видите, программное изменение вектора прерываний задается с помощью перезаписи регистра I, а аппаратное - благодаря шине данных.

Обычно в момент прерывания на шине данных содержится - 255 ( 0FFH ), но если Вы подключите внешнее устройство, изменяющее в этот момент состояние шины данных, то Вы можете, не переписывая регистр I, менять в небольших пределах адрес программы обработки «IM 2». Порой такое необходимо при подключении нескольких периферийных устройств, чтобы процессор знал, какое из них ему обслуживать на данный момент. Вдобавок ко всему, Вы можете еще перехватывать управление линией «INT» для аппаратного включения или выключения прерываний в необходимый момент времени. Именно так и делает контроллер дисковода.

С «IM 2» есть одна проблема при использовании прерываний при подключенном контроллере дисковода или микродрайва. Дело в том, что при переключении на теневое ПЗУ контроллера эти ПЗУ меняют указатель регистра I. Поэтому, по всей видимости, до включения «IM 2» необходима проверка на то, какое ПЗУ подключено на данный момент. Хорошо еще, что в распространенной версии контроллера «TR-DOS» предусмотрено, что Вы можете изменить указатель в регистре I.

Дополнительная проблема возникает при использовании указателей из ПЗУ при создании коммерческого ПО, т.к. любые изменения и дополнения в ПЗУ могут сделать вашу программу неработающей.

При размещении в регистре I чисел от 0 до 63 (03FH), все адреса точек переходов по прерыванию «IM 2» лежат в области ПЗУ. Список указателей для фирменной версии ПЗУ «СПЕКТРУМА» приведен в «Справочнике» (ч.III данной книги).

Типичное использование «IM 2» в играх - управление спрайтами и звуковым сопровождением программы. Зная, с какой частотой генерируются прерывания, легко рассчитать скорость перемещения спрайта или задать ритм мелодии. Они будут независимы от любых других операций внутри программы. Еще раз напомним, что прерывания генерируются с частотой 50 раз в секунду.

Есть несколько правил написания программ обработки прерываний «IM 2».

1.                            Перед выполнением программы необходимо запретить прерывания с помощью команды DI. Причина состоит в том, чтобы гарантировать, что программа не зациклит петлю, если процедура обработки прерываний выполняется дольше, чем пауза между двумя прерываниями.

2.                            После выполнения программы обработки «IM 2» включите прерывания командой EI. Для возврата в основную программу используйте команду RETI.

3.                            Когда бы ни использовались программы прерываний, очень важно, чтобы все регистры микропроцессора, используемые программой обработки прерывания, сохранялись на входе и восстанавливались перед возвращением.

4.                            Не должно быть попыток пересылки данных через регистры в программу обработки прерываний или из нее.

5.                            Помните, что если Вы не используете «RST 38H» в прерывающей программе, то Вам необходимо сбрасывать режим «IM 2» и включать «IM 1» до возвращения в БЕЙСИК.

И еще совет. Если Вам необходимо, чтобы таймер системы обновлялся, а клавиатура сканировалась, если, например, Вы работаете в БЕЙСИКЕ со включенным прерыванием второго типа, то в конце вашей программы обработки «IM 2» восстановите содержимое регистров (см. П.3 правил) и сделайте переход JP 0038H. Программа «RST38H» сама подключит прерывания и сделает возврат в основную программу. Это позволит Вам сократить время обработки прерывания.

Вам в своей работе надо также учитывать то обстоятельство, что есть операторы БЕЙСИКА, которые на время своего выполнения запрещают прерывания. Это операторы : LOAD, SAVE, BEEP.

Для полноты картины нам следует также ознакомиться с примерами написания программ в машинных кодах, использующих прерывания процессора в режиме «IM 2». Желающих разобрать эти примеры мы отсылаем ко второй части данной книги.

 




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



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

Похожие статьи:
Фантастика - Сергей Лукъяненко. Лабиринт отражений. Прoдoлженuе, нaчaлo в PLUТОNIUМ 10 - 1.5
Событие - Итоги Фестиваля компьютерного искусства Chaos Construction 1999.
Творчество - Все.
Эпилог - крах ENLIGHT'97.
Обмен опытом - процедура вывода окна с рамкой.

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