Как работают прерывания на Intel 8080?

Как работают прерывания на Intel 8080? Я искал Google и в официальной документации Intel (197X), и я нашел только небольшое описание по этому поводу. Мне нужно подробное объяснение об этом, чтобы подражать этому процессору.

5 ответов

Решение

Я наконец-то нашел это!

Я создаю переменную с именем bus, куда идет код операции прерывания. Затем я вызвал функцию для обработки прерывания:

void i8080::interruption()
{
    // only for RST
    cycles -= cycles_table[bus];
    instruction[bus]();
    INT = false;
}

INT верно, когда нужно прерывание. Инструкции EI и DI обрабатывают INTE.

Когда INT и INTE - истина, прерывание выполняется.

8080 имеет линию прерывания (контакт 14). Все периферийные устройства подключены к этому выводу, обычно в конфигурации "провод-ИЛИ" (это означает, что выходы запроса прерывания являются открытым коллектором, а вывод прерывания поднят на резистор). Внутри процессор имеет бит разрешения прерывания. Две инструкции, EI и DI, устанавливают и очищают этот бит. Таким образом, вся система прерываний включается или выключается, отдельные прерывания не могут быть замаскированы на "голом" 8080. Когда устройство выдает прерывание, процессор отвечает сигналом "Подтверждение прерывания" (~INTA). Этот сигнал имеет ту же временную привязку, что и сигнал "Memory Read" (~MEMR), и он предназначен для запуска периферийного устройства для размещения команды "Restart" на шине данных. Сигнал подтверждения прерывания в основном является циклом выборки команд, он возникает только в ответ на прерывание.

Существует восемь инструкций перезапуска, RST 0 - RST 7. RST 7 - это код операции "0xFF". Команды Restart заставляют процессор помещать программный счетчик в стек и начинать выполнение с места вектора перезапуска. RST 0 векторов до 0x0000, RST 1 векторов до 0x0008, RST 2 векторов до 0x0010 и так далее. Перезапустите 7 векторов до 0x0038. Эти векторные адреса должны содержать исполняемый код, как правило, инструкцию перехода к процедуре обработки прерывания. Процедура обработки прерывания объединит все регистры, которые она использует, выполнит необходимые функции ввода-вывода, разархивирует все регистры и вернется в основную программу с помощью той же инструкции возврата, которая завершает подпрограммы (RET, код операции 0xC9).

Инструкции перезапуска являются действительными кодами операций, то есть они будут делать то же самое, если они извлекаются из памяти во время выполнения программы. Было удобно использовать Restart 7 в качестве "горячего перезапуска" для программы мониторинга / отладки клавиатуры, потому что ранние EPROM обычно содержали 0xFF в каждом пустом месте. Если вы выполняли пустую СППЗУ, это означало, что что-то пошло не так, и, возможно, вы все равно захотите вернуться к монитору.

Обратите внимание, что векторы RST 0 находятся в той же области памяти, что и RESET, оба начинают выполняться с 0x0000. Но RST 0 оставляет адрес возврата в стеке. В некотором смысле, RESET можно рассматривать как единственное немаскируемое прерывание, которое было у 8080.

Сигнал прерывания также очищает бит прерывания, поэтому процедура обработки прерывания должна будет выполнить инструкцию EI, как правило, непосредственно перед RET. В противном случае система будет реагировать на одно и только одно событие прерывания.

CP/M зарезервировал первые 256 байтов памяти для системного использования - и эта карта векторов прерываний использовала первые 64 байта (8 байтов на инструкцию Restart). В системах CP/M ОЗУ начиналось с 0x0000, а любое ПЗУ находилось в верхней части памяти. Эти системы использовали некоторую форму умного переключения банков для включения EPROM или что-то сразу после RESET, чтобы предоставить инструкцию JUMP системному ПЗУ, чтобы он мог начать последовательность загрузки. Системы с ПЗУ в нижней части карты памяти запрограммировали инструкции JUMP для векторов, расположенных в ОЗУ, в первые 64 байта. Эти системы должны были инициализировать эти векторы ОЗУ при запуске.

Функциональные указатели на обработчики прерываний хранятся в памяти. Приблизительно 32 из первых адресов являются аппаратными прерываниями: аппаратно сработало.

Следующие 32 или около того адреса являются инициируемыми пользователем, они называются программными прерываниями. Они вызваны INT инструкция.

Параметром INT является номер вектора программного прерывания, который будет вызванным прерыванием.

Вам нужно будет использовать IRET Инструкция по возвращению из прерываний.

Вероятно, вы также должны отключить прерывания, как первое, что вы делаете при вводе прерывания.

Для получения более подробной информации, вы должны обратиться к документации для вашей конкретной модели процессора, как правило, она может сильно различаться.

Прерывание - это способ прерывания процессора с помощью уведомления для обработки чего-то другого, я не уверен в чипе Intel 8080, но из моего опыта лучший способ описать прерывание заключается в следующем:

CS:IP (Сегмент кода: указатель инструкций) находится в этой инструкции по адресу памяти 0x0000:0020, в качестве примера для объяснения этого с помощью инструкций Intel 8086, ассемблер является бессмысленным и не имеет никакого реального смысла... инструкции являются образными

0x0000:001C   MOV AH, 07
0x0000:001D   CMP AH, 0
0x0000:001E   JNZ 0x0020
0x0000:001F   MOV BX, 20
0x0000:0020   MOV CH, 10; CS:IP указывает здесь
0x0000:0021   INT 0x15

Когда CS: IP указывает на следующую строку и INTвыдается 15 шестнадцатеричных ошибок, вот что происходит, процессор помещает регистры и флаги в стек, а затем выполняет код по адресу 0x1000: 0100, который обслуживает INT 15 в качестве примера.

0x1000:0100   PUSH AX
0x1000:0101   PUSH BX
0x1000:0102   PUSH CX
0x1000:0103   PUSH DX
0x1000:0104   PUSHF
0x1000:0105   MOV ES, CS
0x1000:0106   INC AX
0x1000:0107   ....
0x1000:014B   IRET

Затем, когда CS: IP попадает в команду 0x1000:014B, IRET (Прерывание RETurn), который выскакивает из ВСЕХ регистров и восстанавливает состояние, выдается, и когда он выполняется, CS: IP ЦП указывает на это после инструкции в 0x0000: 0021.

0x0000: 0022 CMP AX, 0
0x0000: 0023....

То, как процессор знает, куда перейти к определенному смещению, основано на таблице векторов прерываний, эта таблица векторов прерываний устанавливается BIOS в определенном месте в BIOS, это будет выглядеть так:

INT BIOS РАСПОЛОЖЕНИЕ ИНСТРУКЦИИ
---    --------------------------------------
0      0x3000
1      0x2000
..      ....
15     0x1000<--- ЭТО КАК ЗНАЕТ ЦП ГДЕ Прыжок

Эта таблица хранится в BIOS и когда INT 15 выполняется BIOS, перенаправит CS: IP в местоположение в BIOS для выполнения служебного кода, который обрабатывает прерывание.

В прежние времена, в Turbo C, было средство переопределения подпрограмм таблицы векторов прерываний вашими собственными функциями обработки прерываний, используя функции setvect а также getvect в котором фактические обработчики прерываний были перенаправлены в ваш собственный код.

Надеюсь, я объяснил это достаточно хорошо, хорошо, это не Intel 8080, но это мое понимание, и я был бы уверен, что концепция этого чипа такая же, как и у чипов семейства Intel x86.

8080 зависел от внешнего оборудования для управления обработкой прерываний, поэтому его невозможно обобщить. Ищите информацию о контроллерах прерываний Intel 8214 или 8259.

Другие вопросы по тегам