Что касается вашего исходного (связанного) вопроса, jr $ - это не самый быстрый цикл на Z80, так как самым быстрым является jp $ (фактически jp (hl)), где $ обозначает адрес текущей команды. Самый быстрый exitable цикл может быть сделано тремя способами, в зависимости от того, что ваше определение «петли» и как цикл должен быть прерван:
- Используйте прерывания бросить вышеупомянутую цикл: в этом случае вы должен отключить стек в прерывании (удалить адрес возврата) и перейти в другое место.
- Используйте цикл, как это:
IN reg,(C)
JP cc,$-2
где рег, (С) команда также устанавливает S (знак), Z (ноль) и/V (четности) флаги P в зависимости от значения, считанного с порта, и JP cc использует один из этих флагов, чтобы продолжить цикл или оставить его.
- Используйте
HALT
и выйдите естественным путем с прерыванием.
Известно, что Z80 выполняет HALT
путем непрерывной выборки тот же байт следующей HALT
инструкции из памяти, а затем игнорируя его и делать это до тех пор пока прерывание не будет пойман. Такое поведение можно описать как цикл, пока прерывание не будет схвачено. Коренной причиной такого поведения является то, что Z80, естественно, обновляет DRAM каждую выборку опкода, и таким образом обновление сохраняется во время выполнения HALT
.
Чистым решением TI-BASIC было бы использовать цикл Repeat или While. Я считаю, что нам нужна дополнительная информация о том, что вы хотите сделать с циклом, чтобы предлагать более качественные ответы.Кроме того, технически цикл «jp» будет быстрее, но для этого потребуется знать адрес. Например, C3959D составляет 10cc против 12cc для 18FE. – Zeda