╔──────────────────────────────────────────────────────────────╗ │ ▒▒▒▒░ ▒▒▒▒░ ▒▒▒▒░ ▒▒▒▒▒▒░▒▒░ ▒▒░▒▒▒▒▒▒░ ▒▒▒▒░▒▒▒▒▒▒░▒▒▒▒▒░│ │▒▒░ ▒▒░▒▒░ ▒▒░▒▒░ ▒▒░▒▒░ ▒▒▒▒▒▒░▒▒░ ▒▒░▒▒░▒▒░ ▒▒░ ▒▒│ │▒▒░ ▒▒░▒▒░ ▒▒░ ▒▒▒▒▒░ ▒▒░ ▒▒░▒▒▒▒▒▒░ ▒▒░▒▒░▒▒▒▒▒░ ▒▒░ ▒▒│ │▒▒▒▒▒▒░▒▒░ ▒▒░▒▒░ ▒▒░▒▒░ ▒▒░ ▒▒░▒▒░ ▒▒░▒▒░ ▒▒░▒▒░ ▒▒▒▒▒░│ │▒▒░ ▒▒░ ▒▒▒▒░ ▒▒▒▒░ ▒▒▒▒▒▒░▒▒░ ▒▒░▒▒▒▒▒▒░▒▒░ ▒▒░▒▒▒▒▒▒░▒▒░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. [ Продолжение следует ].