Доброго времени суток.
Как ведёт себя реальный железный 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 мы уже не залипаем.
Непонятно кому верить, а до практического эксперимента ещё не дошёл.
Вопрос про выход из HALT-состояния по NMI/INT в Z80
Moderator: Shaos
-
- Junior
- Posts: 1
- Joined: 23 Aug 2010 11:44
- Location: 79.111.177.2
-
- Banned
- Posts: 2139
- Joined: 20 Mar 2005 13:41
- Location: От туда
Курите маны. Z80 в состоянии останова (!HALT=0) генерирует NOP'ы для обеспечения сигнала !REFSH (встроенная регенерация памяти). Из этого состояния его может вывести ТОЛЬКО аппаратное прерывание. А именно: !RESET, при этом он обнуляется и начинает с началаю !NMI, при этом в стэк пихается следующий за HALT адрес и выполняется 66h. !INT, только при EI, в остальном, так же как и с NMI - в стек следующий адрес, адрес перехода зависит от режима IM [0..2].
Поэтому, в спектруме каждая HALT = ждать следующий фрейм.
Поэтому, в спектруме каждая HALT = ждать следующий фрейм.