Как прерывания работают на Intel 8080? Я искал в Google и в официальной документации Intel (197X) и нашел лишь небольшое описание этого. Мне нужно подробное объяснение этого, чтобы эмулировать этот процессор.
Как прерывания работают на Intel 8080?
Ответы (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 байта. Эти системы должны были инициализировать эти векторы ОЗУ при запуске.
8080 зависел от внешнего оборудования для управления обработкой прерываний, поэтому обобщать невозможно. Найдите информацию о контроллерах прерываний Intel 8214 или 8259.
Я наконец нахожу это!
Я создаю переменную с именем bus, куда идет код операции прерывания. Затем я вызвал функцию для обработки прерывания:
void i8080::interruption()
{
// only for RST
cycles -= cycles_table[bus];
instruction[bus]();
INT = false;
}
INT истинно, когда требуется прерывание. Инструкции EI и DI обрабатывают INTE.
Когда INT и INTE равны истине, выполняется прерывание.
Указатели функций на обработчики прерываний хранятся в нижней памяти. Примерно 32 или около того из первых адресов являются аппаратными прерываниями: срабатывает аппаратное обеспечение.
Следующие 32 или около того адреса запускаются пользователем, они называются программными прерываниями. Они запускаются инструкцией INT
.
Параметром INT является номер вектора программного прерывания, которое будет вызываться прерыванием.
Вам нужно будет использовать инструкцию IRET
для возврата из прерывания.
Вероятно, вам также следует отключить прерывания в первую очередь при входе в прерывание.
Для получения дополнительной информации вы должны обратиться к документации для вашей конкретной модели процессора, она может сильно различаться.
Прерывание — это способ прерывания процессора с уведомлением об обработке чего-то еще, я не уверен в чипе 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 указывает на следующую строку и выдается шестнадцатеричное число INT
errupt 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.