Есть ли способ добавить код в бесконечный цикл сборки z80?

Некоторое время назад я спросил, какой самый быстрый бесконечный цикл был на TI-84. Один из ответов, которые я получил, использовал бесконечный цикл сборки с этим кодом:

AsmPrgm
18FE

Однако это немного непрактично, потому что его можно выйти только с помощью кнопки сброса, и ничего внутри не запускается.

Есть ли способ поместить код TI-Basic в этот цикл и / или заставить его выйти условно?

Вот ссылка на оригинальный вопрос и ответ: Какой самый быстрый бесконечный цикл в TI-84+ Basic?

3 ответа

Решение

Вы можете определенно заставить программы сборки завершиться условно. Команда C9 возврат, так что если у вас есть программа, состоящая только из AsmPrgmC9запуск его как программы сборки приведет к немедленному завершению (это будет выглядеть так же, как запуск программы, в которой ничего нет). Если вы хотите завершить цикл при выполнении какого-либо условия, вам нужно будет начать изучение ассемблера, поскольку ответ будет широко варьироваться в зависимости от того, что это за условие и какую версию ОС / калькулятор вы используете.

$18FE - это младший -2, который зацикливает два байта назад на себя. Вы захотите, чтобы дополнительная логика появлялась после начала цикла, чтобы позволить вам выйти (т.е. проверять нажатия кнопок), а затем просто вернуть ее к этой метке. Чтобы сделать это, вам нужно отрегулировать значение $FE, так как это расстояние для прыжка. Это 8-битное значение со знаком, поэтому убедитесь, что вы вводите весь свой условный код, а затем переходите обратно в зависимости от количества использованных байтов.

Что касается вашего исходного (связанного) вопроса, jr $ не самый быстрый цикл, возможный на Z80, так как самый быстрый - это jp $ (на самом деле jp (hl)), где $ обозначает адрес текущей инструкции. Самый быстрый выходной цикл может быть выполнен тремя способами, в зависимости от того, что вы определяете как "цикл" и как выйти из цикла:

  1. Используйте прерывания, чтобы выйти из вышеупомянутого цикла: в этом случае вы должны размотать стек в прерывании (удалить адрес возврата) и перейти в другое место.
  2. Используйте цикл следующим образом:

IN reg,(C)
JP cc,$-2

где команда IN reg,(C) также устанавливает флаги S (знак), Z (ноль) и P/V (четность) в зависимости от значения, считанного из порта, а JP cc использует один из этих флагов, чтобы продолжить цикл или выйти из него.

  1. Использовать HALT и выйти из него, естественно, с прерыванием.

Известно, что Z80 выполняет HALT непрерывно выбирая один и тот же байт HALT инструкции из памяти, затем игнорируя ее и делая это, пока прерывание не будет перехвачено. Это поведение может быть описано как зацикливание, пока прерывание не будет перехвачено. Основной причиной такого поведения является то, что Z80, естественно, DRAM обновляет каждую выборку кода операции, и таким образом обновление сохраняется во время HALT выполнение.

Другие вопросы по тегам