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

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


person Facon    schedule 29.01.2010    source источник


Ответы (5)


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

Существует восемь инструкций перезапуска, RST 0 — RST 7. RST 7 — это код операции «0xFF». Инструкции перезапуска заставляют процессор помещать счетчик программ в стек и начинать выполнение с позиции вектора перезапуска. Векторы 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 байтов на команду перезапуска). В системах CP/M ОЗУ начиналось с адреса 0x0000, а любое ПЗУ располагалось в верхнем конце памяти. Эти системы использовали некоторую форму умного переключения банков для переключения в EPROM или что-то еще сразу после RESET, чтобы предоставить инструкцию JUMP в системное ПЗУ, чтобы оно могло начать последовательность загрузки. Системы с ПЗУ в нижней части карты памяти программировали инструкции JUMP для векторов, расположенных в ОЗУ, в первые 64 байта. Эти системы должны были инициализировать эти векторы ОЗУ при запуске.

person jmc    schedule 04.10.2014

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

person Mark Ransom    schedule 29.01.2010

Я наконец нахожу это!

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

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

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

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

person Facon    schedule 30.01.2010
comment
Если это переменная, в которую помещается код операции, почему бы не назвать ее кодом операции? - person ; 30.01.2010
comment
opcode используется как тип данных, в любом случае, как я вижу, opcode прерывания идет на внешнюю шину 8080, так что я думаю, что это было нормально. Спасибо всем! - person Facon; 30.01.2010

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

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

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

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

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

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

person Paul Nathan    schedule 29.01.2010
comment
Это описывает 8086, а не 8080. - person john_e; 25.04.2014

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

CS:IP (Code Segment:Instruction Pointer) находится в этой инструкции по адресу памяти 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 указывает на следующую строку и выдается шестнадцатеричное число INTerrupt 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 (возврат прерывания), который извлекает ВСЕ регистры и восстанавливает состояние, и когда он выполняется, 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.

person t0mm13b    schedule 29.01.2010
comment
Хорошее объяснение! Спасибо. - person Leonardo; 23.04.2013
comment
это для 8086, а не для 080 - person Remember Monica; 27.11.2014