Вопрос про выход из HALT-состояния по NMI/INT в Z80

Микропроцессоры и микроконтроллеры от фирмы Zilog, а также компьютеры на них построенные

Moderator: Shaos

antok
Junior
Posts: 1
Joined: 23 Aug 2010 11:44
Location: 79.111.177.2

Вопрос про выход из HALT-состояния по NMI/INT в Z80

Post by antok »

Доброго времени суток.
Как ведёт себя реальный железный Z80 когда он находится в состоянии останова (HALT) и приходит NMI или же INT (считаем, что INT разрешены)?
Он инкрементирует PC, а затем кладёт его в стек и прыгает на адрес обработчика прерывания или он просто кладёт PC в стек и прыгает на адрес обработчика прерывания?

Например ситуация с одним симулятором такая:
1. Допустим, инструкция HALT лежит по адресу 100
2. Симулятор процессора натыкается на неё и начинает генерировать NOP, при этом PC не инкрментируется, его значение так и остаётся 100.
3. Приходит NMI. Симулятор кладёт текущее значение PC (100) в стек и прыгает на адрес 66.
5. Допустим, по адресу 66 находится простой RET. В результате мы опять попадаем на адрес 100 где находится HALT. И так до бесконечности.

А ситуация с другим симулятором такая:
1. Допустим, инструкция HALT лежит по адресу 100
2. Симулятор процессора натыкается на неё и начинает генерировать NOP, при этом PC не инкрментируется, его значение так и остаётся 100.
3. Приходит NMI. Симулятор инкрементирует PC (PC становится равным 101) а затем кладёт его в стек и прыгает на адрес 66.
5. Допустим, по адресу 66 находится простой RET. В результате мы попадаем на адрес 101 и выполняем какую либо команду по этому адресу. На HALT по адресу 100 мы уже не залипаем.

Непонятно кому верить, а до практического эксперимента ещё не дошёл.
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Курите маны. Z80 в состоянии останова (!HALT=0) генерирует NOP'ы для обеспечения сигнала !REFSH (встроенная регенерация памяти). Из этого состояния его может вывести ТОЛЬКО аппаратное прерывание. А именно: !RESET, при этом он обнуляется и начинает с началаю !NMI, при этом в стэк пихается следующий за HALT адрес и выполняется 66h. !INT, только при EI, в остальном, так же как и с NMI - в стек следующий адрес, адрес перехода зависит от режима IM [0..2].
Поэтому, в спектруме каждая HALT = ждать следующий фрейм.