Программирование - курс изучения ассемблера от Wlodek Black, продолжение.
╔──────────────────────────────────────────────────────────────╗
│ ▒▒▒▒░ ▒▒▒▒░ ▒▒▒▒░ ▒▒▒▒▒▒░▒▒░ ▒▒░▒▒▒▒▒▒░ ▒▒▒▒░▒▒▒▒▒▒░▒▒▒▒▒░│
│▒▒░ ▒▒░▒▒░ ▒▒░▒▒░ ▒▒░▒▒░ ▒▒▒▒▒▒░▒▒░ ▒▒░▒▒░▒▒░ ▒▒░ ▒▒│
│▒▒░ ▒▒░▒▒░ ▒▒░ ▒▒▒▒▒░ ▒▒░ ▒▒░▒▒▒▒▒▒░ ▒▒░▒▒░▒▒▒▒▒░ ▒▒░ ▒▒│
│▒▒▒▒▒▒░▒▒░ ▒▒░▒▒░ ▒▒░▒▒░ ▒▒░ ▒▒░▒▒░ ▒▒░▒▒░ ▒▒░▒▒░ ▒▒▒▒▒░│
│▒▒░ ▒▒░ ▒▒▒▒░ ▒▒▒▒░ ▒▒▒▒▒▒░▒▒░ ▒▒░▒▒▒▒▒▒░▒▒░ ▒▒░▒▒▒▒▒▒░▒▒░z80│
╚──────────────────────────────────────────────────────────────╝
[ Продолжение ].
(C) WLODEK BLACK
3 типа прерываний.
Прерывания, о которых мы вели речь, строго говоря, называются
аппаратными маскируемыми. Аппаратными - потому что вызываются
путем манипулирования электрическим сигналом. Маскируемыми - по-
тому что их можно запретить программно.
Логично задать вопрос: выходит, существуют прерывания не аппара-
тные и не маскируемые? Ответ: да, существуют. Первые называются
программными, а вторые так и называются немаскируемыми. Мы пого-
ворим о них чуть позже.
Аппаратные маскируемые прерывания по своим свойствам и характе-
ру обработки подразделяются на 3 типа, обозначаемые номерами
0, 1 и 2.
Тип 1 самый простой. Получив запрос на прерывание, процессор за-
сылает в стек адрес возврата и переходит на адрес 0038h. И все.
С этого адреса должна начинаться процедура обслуживания прерыва-
ния. 1-й тип прерываний принят в системе MSX за стандартный. Во
всех ПЗУ BIOS-а, включаемых в 0-ю страницу памяти по адресам
0000h...3FFFh, с адреса 0038h расположена одинаковая процедура
обработки прерываний. В конфигурации MSX DOS на этом месте рас-
положено ОЗУ, и в нем по адресу 0038h помещается команда перехо-
да JP на адрес внутри MSX DOS, откуда в свою очередь вызывается
BIOS. В Спектруме в диапазоне адресов #0000...#3FFF всегда нахо-
дится ПЗУ (одно из трех - Бейсик-48,-128,TR-DOS), и в них также
размещена одинаковая процедура обработки прерываний.
Тип 0 прерываний требует аппаратной поддержки. По сигналу INTA
внешнее устройство, запросившее прерывание, должно выставить на
шину данных код команды, которая и будет выполнена процессором.
Обычно этими командами бывают RST - команды "рестарта". Именно
эти команды и называются командами программного прерывания. Их
всего 8: RST 0, RST 8, RST 10h, RST 18h, RST 20h, RST 28h,
RST 30h и RST 38h.Операнд в ассемблерной мнемонике - это не что
иное, как адрес перехода на подпрограмму. Однобайтовые команды
RST по своему действию абсолютно аналогичны трехбайтовым коман-
дам CALL: RST 10h = CALL 0010h, и т.п.
Получив с шины данных код какой-либо команды RST, процессор ее
тут же выполняет, так и совершается переход на процедуру обслу-
живания прерываний по типу 0. Команды RST могут быть и просто
включены в программу, то есть они не обязательно бывают привяза-
ны к "настоящим" прерываниям. Зачастую точки входа в наиболее
употребимые системные процедуры группируют под точки входа RST,
чем добиваются существенной экономии памяти за счет укорочения
вызовов этих процедур. Команды RST не влияют на состояние разре-
шения/запрещения прерывания.
Их называют командами программного прерывания чисто формально,
так как они все же имеют отношение к прерываниям.
Код команды RST 38h - 0FFh, то есть байт из сплошных единиц.
Обычно такой код и присутствует на шине данных в пассивном сос-
тоянии, когда ни одно устройство ничего на нее не выставляет
(шина данных "подтянута" к цепи +5В резисторами). Фактически
это означает, что, если задать режим прерываний 0,переход также
будет совершаться на адрес 0038h, как и при режиме 1. Обслужива-
ние прерывания типа 0 отнимает большее количество машинных так-
тов, нежели типа 1. Кроме того,вероятность сбоев на шине данных
не равна абсолютному нулю.
Ведя речь о прерываниях, мы попутно изучили еще одну группу
команд - RST.
0-й тип прерываний в MSX (абсолютно аналогично и в "Спектру-
ме") может представлять интерес лишь как предмет познания. Прак-
тическая его ценность равна его номеру.
По 0-му типу прерываний внешнее устройство может выставить
на шину данных код любой команды, в том числе CALL или JP. Если
выяснится, что требуется принять дополнительные байты команды,
процессор сформирует нужное количество циклов подтверждения пре-
рывания, в ответ на которые внешнее устройство должно передать
недостающие байты.
Прерывания 2-го типа - самые мощные и самые сложные. Можно
задать до 256-ти векторов прерывания, и на каждый (теоретически)
посадить свою обрабатывающую процедуру. Получив запрос на преры-
вание, процессор также самостоятельно засылает в стек адрес воз-
врата, а адрес перехода на обслуживающую процедуру формируется
следующим образом:
- вычисляется полный 16-разрядный вектор по формуле:
вектор=256*I+ШД, где I - значение регистра I, а ШД - байт с
шины данных, выставляемый на нее в цикле подтверждения преры-
вания (0FFh). Иными словами, старший байт адреса равен содер-
жимому регистра I, а младший байт берется с шины данных аппа-
ратно;
- по вычисленному адресу читается слово из ячеек (адрес) и
(адрес+1). Полученное слово и будет адресом перехода. Получа-
ется как бы дважды косвенная адресация: сначала определяется
адрес адреса перехода, а затем сам адрес перехода.
Прерывания типа 2 позволяют отвязаться от системной обслуживаю-
щей процедуры в условиях, когда ПЗУ BIOS-а включено в карту па-
мяти. Такая ситуация имеет место при работе Бейсика. Если вы пи-
шете игру типа .GM, .OBJ и т.п., то изучить и освоить 2-й тип
прерываний придется. Для .COM-программ гораздо проще изменить
адрес в команде перехода по адресу 0038h и оставить 1-й тип.
В "Спектруме" прерывания типа 2 используются практически в
каждой игрушке, так как в "Спектруме" "избавиться"от системного
ПЗУ невозможно.
Команды установки режима прерываний имеют мнемонический корень
IM - Interruption Mode:
IM 0
IM 1
IM 2.
Загрузка регистра 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 нет.
Запрещение и разрешение прерываний.
Запрещать прерывания необходимо при исполнении алгоритмов реаль-
ного времени, например, при программной генерации звука или сиг-
нала для записи файла на аудиокассету, а также при переключении
карты памяти. Часто приходится запрещать прерывания и при риско-
ванных манипуляциях со стеком. Смену режимов прерываний также
лучше проводить при запрещенных прерываниях.
Запрет прерываний:
DI (Disable Interruptions).
Разрешение прерываний:
EI (Enable Interruptions).
Интересная особенность:прерывания разрешаются не сразу после
EI, а по завершении выполнения следующей команды. Так что в кон-
це процедуры обслуживания прерывания
...
EI
RET
новое прерывание никогда не вклинится между EI и RET. Так авто-
матически решается задача недопущения переполнения области сте-
ка.
Немаскируемые прерывания.
Немаскируемые прерывания инициируются подачей низкого уровня на
вход NMI процессора. Процессор завершает исполнение текущей
команды, запоминает в специальном флаге значение триггера разре-
шения маскируемых прерываний, запрещает маскируемые прерывания,
засылает в стек адрес возврата и переходит на адрес 0066h.Выход
из процедуры обслуживания немаскируемых прерываний осуществляет-
ся по команде RETN, которая восстанавливает состояние маскируе-
мых прерываний и выполняет обычное RET.
Запретить немаскируемые прерывания невозможно.
Практическое применение немаскируемых прерываний ярко проил-
люстрировано в "Спектруме" - с помощью так называемой"волшебной
кнопки" можно выгрузить на диск всю оперативную память и затем
делать с полученным файлом все, что угодно. На MSX вход сигнала
NMI выведен на разъем интерфейса "общая шина", но встроенной
программной поддержки немаскируемые прерывания не имеют (произ-
водится просто возврат).Поэтому задачи типа извлечения картинок
из игр требуют индивидуального программирования.
Команда возврата из маскируемого прерывания - RETI.
Для нас эта команда если и представляет интерес, то чисто любо-
пытельский. Полноценное использование команды RETI возможно
только при наличии контроллера приоритета прерываний, который
сам отслеживает появление кода команды RETI и, получив таким об-
разом информацию о том, что одно из устройств, запросивших пре-
рывание, уже обслужено, разрешает другим устройствам запросить
прерывание по своим нуждам. Сама же по себе команда RETI выпол-
няет просто возврат типа RET. На разрешение/запрещение прерыва-
ний она не влияет. Для обычного возврата из маскируемых прерыва-
ний используются команды EI и RET.
[ Продолжение следует ].
Другие статьи номера:
|
|
|
|
|
|
Программирование - курс изучения ассемблера от Wlodek Black, продолжение.
|
|
|
|
|
|
|
|
|
|
|