Как прерывания работают на Intel 8080?
Как прерывания работают на Intel 8080? Я искал Google и в официальной документации Intel (197X), и я нашел только небольшое описание об этом. Мне нужно подробное объяснение об этом, чтобы эмулировать этот процессор.
5 ответов
8080 имеет линию прерывания (pin 14). Все периферийные устройства подключены к этому контакту, обычно в конфигурации "провод-или" (то есть выходы запроса прерывания являются открытыми коллекторами, а штырь прерывания вытягивается высоко резистором). Внутри процессор имеет прерываний бит. Две инструкции, EI и DI, установите и очистите этот бит. Таким образом, вся система прерываний включается или выключается, отдельные прерывания не могут быть замаскированы на "голом" 8080. Когда устройство выдает прерывание, процессор отвечает сигналом" Interrupt Acknowledge " (~INTA). Этот сигнал имеет то же время, что и сигнал "Memory Read" (~MEMR), и предназначен для запуска периферийного устройства для размещения инструкции "Restart" на шине данных. Сигнал подтверждения прерывания в основном представляет собой цикл выборки инструкций, он возникает только в ответ на прерывание.
есть восемь инструкций по перезапуску, RST 0-RST 7. RST 7-это код операции "0xFF". Перезапуск инструкции вызывают процессор, чтобы нажать счетчик программы в стеке и начать выполнение в векторном местоположении перезапуска. RST 0 векторов до 0x0000, RST 1 векторов до 0x0008, RST 2 векторов до 0x0010 и так далее. Перезапустите 7 векторов до 0x0038. Эти векторные адреса предназначены для содержания исполняемого кода, как правило, инструкции перехода к подпрограмме службы прерываний. Процедура прерывания будет стекать все используемые регистры, выполнять необходимые функции ввода-вывода, распаковывать все регистры и возвращаться к основная программа с помощью той же инструкции возврата, которая завершает подпрограммы (RET, opcode 0xC9).
инструкции по перезапуску являются фактическими кодами операций, то есть они будут делать то же самое, если они извлекаются из памяти во время выполнения программы. Было удобно использовать Restart 7 как "теплый перезапуск" для программы монитора / отладчика клавиатуры, потому что ранние EPROMs обычно содержали 0xFF в каждом пустом месте. Если вы выполняли пустой EPROM, это означало, что что-то пошло не так, и вы, вероятно, все равно хотел вернуться к монитору.
обратите внимание, что первые 0 векторов в том же месте памяти, что и сброс, начинают выполняться с 0x0000. Но первый 0 оставляет обратный адрес в стеке. В некотором смысле сброс можно рассматривать как единственное немаскируемое прерывание 8080.
сигнал прерывания также очистит бит прерывания, поэтому процедура обслуживания прерывания должна будет выполнить инструкцию EI, как правило, непосредственно перед RET. В противном случае, система будет реагировать на одно и только одно событие прерывания.
CP / M зарезервировал первые 256 байтов памяти для использования в системе-и эта векторная карта прерываний использовала первые 64 байта (8 байтов на команду перезапуска). В системах CP/M ОЗУ начиналось с 0x0000, и любой ПЗУ жил в верхнем конце памяти. Эти системы использовали какую-то форму умного переключения банка для переключения в EPROM или что-то сразу после сброса, чтобы предоставить команду перехода к системному ПЗУ, чтобы он мог начать последовательность загрузки. Системы, имевшие ПЗУ в нижней части карты памяти, запрограммировали инструкции перехода к векторам, расположенным в ОЗУ, в первые 64 байта. Эти системы должны были инициализировать эти векторы RAM при запуске.
указатели на функции обработчики прерываний хранятся в памяти. Некоторые в 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 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
(Interrupt RETurn), который выскакивает из всех регистров и восстанавливает состояние, выдается и когда он выполняется CS:IP CPU указывает назад сюда, после инструкции в 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 семейство чипсов произошло от этого.
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-true прерывание выполняется.