Как работают прерывания на Intel 8080? - PullRequest
8 голосов
/ 30 января 2010

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

Ответы [ 5 ]

16 голосов
/ 05 октября 2014

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 байта. Эти системы должны были инициализировать эти векторы ОЗУ при запуске.

2 голосов
/ 30 января 2010

Прерывание - это способ прерывания процессора с помощью уведомления для обработки чего-то другого, я не уверен в чипе 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 is pointing here
0x0000:0021   INT 0x15

Когда CS: IP указывает на следующую строку и выдается INT с ошибкой 15 шестнадцатеричных, это то, что происходит, CPU помещает регистры и флаги в стек, а затем выполняет код в 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 (Interrupt RETurn), который выскакивает из ВСЕХ регистров и восстанавливает состояние, и когда он выполняется, CPU CS: IP указывает назад здесь, после инструкции в 0x0000: 0021.

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

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

INT    BIOS's LOCATION OF INSTRUCTION POINTER
---    --------------------------------------
0      0x3000
1      0x2000
..      ....
15     0x1000    <--- THIS IS HOW THE CPU KNOWS WHERE TO JUMP TO

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

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

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

2 голосов
/ 30 января 2010

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

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

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

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

Скорее всего, вам также следует отключить прерывания, как первое, что вы делаете при вводе прерывания.

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

1 голос
/ 30 января 2010

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

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

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

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

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

1 голос
/ 30 января 2010

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

...