Nicron #16
17 января 1997

Программирование - курс изучения ассемблера от 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.

[ Продолжение следует ].




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

Похожие статьи:
Контроллер SMUC - Истрория создания.
Злоба дня - Как правильно(!) делать дисковые версии программ для ZX Spectrum.
СС'4 - Kq: отчет о Chaos Constructions 2004.

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