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

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

AsmPrgm
18FE

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

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

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


person Johnny Dollard    schedule 15.02.2017    source источник
comment
Чистым решением для TI-BASIC было бы использование цикла Repeat или While. Я считаю, что нам нужно больше информации о том, что вы хотите сделать с циклом, чтобы предложить лучшие ответы. Кроме того, технически цикл jp будет быстрее, но для этого потребуется знать адрес. Например, C3959D имеет объем 10 куб. см против 12 куб. см для 18FE.   -  person Zeda    schedule 15.02.2017


Ответы (3)


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

person fuzzything44    schedule 16.02.2017

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

person Dandaman955    schedule 15.02.2017

Что касается вашего исходного (связанного) вопроса, 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.

person lvd    schedule 16.02.2017
comment
Самый быстрый цикл — LD HL,$+3; JP (ХЛ). При очень тщательной настройке вы можете получить IN L,(C); JP (ХЛ) работа. - person George Phillips; 16.02.2017
comment
Конечно, написать собственную последовательность прерываний на калькуляторах TI-84 немного сложно. Вы должны использовать IM 2, но отправленный байт совершенно случайный (ну, в некоторых калькуляторах это не так, но вы должны рассматривать его как случайный), поэтому вам нужно установить всю последовательность 257 байтов на тот же байт, где ваш код прерывания. - person fuzzything44; 16.02.2017
comment
Ах да, точно, jp(hl)! Как я мог... :) Я осмелился немного обновить свой ответ. - person lvd; 17.02.2017