Soviet Union ZX Spectrum CommunityСуббота, 22.07.2017, 05:51
Вы вошли как Гость | Группа "Гости" | RSS
 [ · Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Soviet Union ZX Spectrum Community » ZX-строительство » Информация » Система аппаратных маскируемых прерываний (CPU-Z80)
Система аппаратных маскируемых прерываний (CPU-Z80)
HazarДата: Вторник, 25.08.2015, 04:02 | Сообщение # 1
80h
Группа: Пользователи
Сообщений: 227
Статус: Offline
Команды прерываний позволяют с помощью внешних электрических сигналов прерывать последовательность исполнения команд основной программы.

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

Запросы маскируемых прерываний поступают в микропроцессор по линии INT#. Внутренний триггер процессора IFF1 (Interrupt Flip Flop) используется для управления разрешением маскируемых прерываний Когда этот флаг сброшен, маскируемые прерывания запрещены.

При использовании прерываний следует различать и понимать разницу
между программными прерываниями и аппаратными.
В качестве программных прерываний используют так называемые команды
рестартов (с помощью этих команд выполняются переходы на часто используемые подпрограммы)

RST 0h, RST 8h, RST 10h, RST 18h, RST 20h, RST 28h, RST 30h
и RST 38h

Добавлено (21.08.2015, 02:56)
---------------------------------------------
при аппаратном прерывании также происходит переход, но причиной перехода является появление сигнала INT --->(RST XX h)--->( )

Для управления режимами прерываний в процессоре имеются также
4 Флага которые отвечают за работу прерываний. в частности
Флаги IMFa и IMFb определяют режим работы маскируемых прерываний. Комбинации их состояний образуют разные режимы работы:

– 00 – режим совместимости с процессором 8080 (режим 0);
– 01 – не используется в Z80 ;
– 10 – режим одиночного вектора (режим 1);
– 11 – режим векторов, предоставляемых устройствами (режим 2).

Установка режимов осуществляется с помощью команд:

Команда IM0.
Код - ED 46. включение прерываний в режиме 0.

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

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

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

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

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

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

Из документации -Z80.Instruction set (Zilog)
Description: This instruction is used at the end of a maskable interrupt service routine to:

• Restore the contents of the Program Counter (PC) (analogous to the
RET instruction)
The RETI instruction also facilitates the nesting of interrupts, allowing higher priority devices to temporarily suspend service of lower priority
service routines. However, this instruction does not enable interrupts
that were disabled when the interrupt routine was entered

Перевод –
Описание: Эта команда используется в конце процедуры обработки маскируемых прерываний.

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

Добавлено (21.08.2015, 02:56)
---------------------------------------------
При программировании следует учитывать неточности в самом процессоре.

В исполнении кристалла (Z80)по технологии NMOS в некоторых случаях триггер IFF2 неправильно отражает текущий статус прерываний.

При выполнении команд (LD A,R и LD A,I) происходит перезапись состояния триггера разрешения прерываний во флаг четности (P/V). Что позволяет определить статус прерываний . Если прерывание производится во время выполнения текущей команды (подразумевается, что прерывания разрешены), то флаг P/V будет очищен, что приведет к неправильному выводу о состоянии прерываний.

Использование прерываний в ZX Spectrum

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

Z-80 имеет два входа для сигналов запроса прерываний - входы «INT» и «NMI».
На входе линии запроса прерывания «INT» (16 вывод микросхемы) внешнее устройство формирует сигнал низкого уровня, обращая «внимание» микропроцессора на этот сигнал. В ZX Spectrum сигнал «INT» формируется 50 раз в секунду. Если прерывания разрешены то запрос воспринимается
микропроцессор прерывает обычную обработку и переходит к выполнению необходимой процедуры прерывания. Реакция на запрос прерывания определяется флагом прерывания, поэтому прерывание может быть замаскировано. В программу могут вводиться команды, которые устанавливают или сбрасывают флажок прерывания и, следовательно, разрешают или запрещают его обработку. Что позволяет гибко реагировать на прерывания.

Добавлено (21.08.2015, 02:57)
---------------------------------------------
Описание режимов работы прерываний

Режим «IM 0». “Прерывания нулевого типа” - соответствует механизму обработки прерываний микропроцессора i8080. В этом режиме используются инструкции (RST 0…..38 Hex) в качестве вектора прерывания, факт подтверждения прерывания определяется по сигналам M1/ и IORQ/ .

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

Добавлено (21.08.2015, 02:58)
---------------------------------------------
Режим «IM 1». Из книги “Программирование в машинных кодах”

После включения питания в ZX Spectrum устанавливается режим прерываний «IM 1» - по приходу сигнала INT производится переход на 0038Н, по этому адресу расположена программа сканирования клавиатуры и встроенного системного таймера, но если подключено ПЗУ контроллера дисководов или интерфейса микродрайва, то все, что делается при обработке прерывания- это немедленный возврат без каких-либо других действий, т.е. по адресу 0038Н в этих ПЗУ записан код возврата из прерывания «RETI» (Return from interrupt) - ED4D Hex.
Далее речь пойдет о видео-системе фирменного «СПЕКТРУМА», в частности о контроллере дисплея на микросхеме «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 чисел из запрещенного интервала на компьютерах версий «НОВОСИБИРСК», «БАЛТИКА», «ЛЕНИНГРАД» развала картинки не наблюдалось.

Добавлено (21.08.2015, 02:59)
---------------------------------------------
«IM 2».
Путем установки режима «IM 2» возможно менять вектор прерываний как программно, так и аппаратно.
При получении прерывания по линии «INT» процессор запоминает адрес следующей команды программы на машинном стеке, затем просматривает ячейку, указанную шиной данных И теперь если В регистре I содержится число 10 (0AH), а на шине данных выставлено число 255 (0FFH).
То получаем :
10*256=2560
2560+255=2815.
Этот адрес находится в ПЗУ «СПЕКТРУМА», поэтому точка, к которой будет сделан переход, возьмется из содержимого адреса 2815+(256, умноженное на число по адресу 2816). В ячейке 2815 содержится 34, а в 2816 - 128. В этом можно убедиться с помощью оператора PEEK. Таким образом, адрес перехода равен :
34+(256*128)=32802.

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

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

По этому адресу берется точка перехода на программу обработки прерываний, где опять-таки данный адрес содержит младший байт, а следующий за ним - старший байт адреса программы.
Все это можно представить, как косвенную адресацию по содержимому регистровой пары. Это своего рода команда CALL (I+ШД). Но, т.к. такой команды не существует, и она не может разместить собственный адрес возврата, то адрес после последней выполненной команды кладется процессором на машинный стек, и к нему будет осуществлен возврат после выполнения программы обработки прерываний.
Как Вы видите, программное изменение вектора прерываний задается с помощью перезаписи регистра I, а аппаратное - благодаря шине данных.
Обычно в момент прерывания на шине данных содержится - 255 ( 0FFH ), но если Вы подключите внешнее устройство, изменяющее в этот момент состояние шины данных, то Вы можете, не переписывая регистр I, менять в небольших пределах адрес программы обработки «IM 2». Порой такое необходимо при подключении нескольких периферийных устройств, чтобы процессор знал, какое из них ему обслуживать на данный момент. Вдобавок ко всему, Вы можете еще перехватывать управление линией «INT» для аппаратного включения или выключения прерываний в необходимый момент времени. Именно так и делает контроллер дисковода.
С «IM 2» есть одна проблема при использовании прерываний при подключенном контроллере дисковода или микродрайва. Дело в том, что при переключении на теневое ПЗУ контроллера эти ПЗУ меняют указатель регистра I. Поэтому, по всей видимости, до включения «IM 2» необходима проверка на то, какое ПЗУ подключено на данный момент. Хорошо еще, что в распространенной версии контроллера «TR-DOS» предусмотрено, что Вы можете изменить указатель в регистре I.
Дополнительная проблема возникает при использовании указателей из ПЗУ при создании коммерческого ПО, т.к. любые изменения и дополнения в ПЗУ могут сделать вашу программу неработающей.
При размещении в регистре I чисел от 0 до 63 (03FH), все адреса точек переходов по прерыванию «IM 2» лежат в области ПЗУ.

Добавлено (21.08.2015, 02:59)
---------------------------------------------
Советы по программированию

Есть несколько правил написания программ обработки прерываний «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.

Путём присвоения приоритетов запросам можно добиться, чтобы ЦП реагировал, прежде всего, на наиболее важное событие, игнорируя запросы либо прерывая ISR менее важных.

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

Добавлено (21.08.2015, 03:00)
---------------------------------------------
Применение регистра I

Загрузка регистра I возможна только единственным образом:
LD I,A.
Чтение регистра I способно дать ценную информацию: при выполнении команды LD A,I значение триггера разрешения прерывания копируется
в флаг P/V. Таким путем программа пользователя может узнать, разрешены ли прерывания в данный момент:
P/V=1 - разрешены, 0 - запрещены.
В режимах прерываний 0 и 1 регистр I не задействован и может
быть использован программой для хранения данных. При чтении
LD A,I помимо флага P/V срабатывают флаги нуля Z и знака S.
Кроме загрузки и чтения через аккумулятор, других команд для
регистра I нет.


Spectrum жив в нашей душе навсегда

Сообщение отредактировал Hazar - Вторник, 25.08.2015, 04:04
 
Black_CatДата: Пятница, 13.05.2016, 23:40 | Сообщение # 2
Координатор
Группа: Координаторы
Сообщений: 517
Статус: Offline
При работе в IM2 с оригинальным Спектрумом, необходимо иметь ввиду, что шина данных у него нестабильна, т.к. на неё ULA непрерывно транслирует текущие значения сканирования видео ОЗУ через развязывающие резисторы на шину данных. Это так же породило такой феномен, как порт #FF. Поэтому, для корректного перехода по непредсказуемому вектору генерируемому ULA необходимо заполнять всю таблицу векторов прерывания одним значением. У большинства клонов такой проблемы нет, как нет и нестабильной шины данных. Т.к. в оригинальном Спектруме только один источник маскируемого прерывания, то это не является проблемой до тех пор, пока источников прерываний не станет больше, в этом случае необходимо использовать внешний контроллер прерываний, вырабатывающий не только вектор дополнительного источника прерываний, но и вектор #FF для кадрового прерывания ULA.

"Трудно найти чёрную кошку в тёмной комнате.. ...особенно, если её там нет", "Forever!".
"Я никогда не причиняю им зла. Я говорю им правду, и они думают, что это - зло."
Гарри Трумэн
 
HazarДата: Пятница, 28.10.2016, 23:46 | Сообщение # 3
80h
Группа: Пользователи
Сообщений: 227
Статус: Offline
Цитата Black_Cat ()
Т.к. в оригинальном Спектруме только один источник маскируемого прерывания, то это не является проблемой до тех пор, пока источников прерываний не станет больше, в этом случае необходимо использовать внешний контроллер прерываний, вырабатывающий не только вектор дополнительного источника прерываний, но и вектор #FF для кадрового прерывания ULA.


Надо думать как правильно сделать контроллер прерываний для нескольких
Устройств (3 , 4) что-бы они не мешали друг другу (последняя серьезная проблема)
И тогда получится почти настоящий компьютер 
 
Soviet Union ZX Spectrum Community » ZX-строительство » Информация » Система аппаратных маскируемых прерываний (CPU-Z80)
Страница 1 из 11
Поиск:

Copyright MyCorp © 2006Сайт управляется системой uCoz