2017-02-15 31 views
1

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

AsmPrgm 
18FE 

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

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

Вот ссылка на оригинальный вопрос и ответ: What is the fastest infinite loop in TI-84+ Basic?

+0

Чистым решением TI-BASIC было бы использовать цикл Repeat или While. Я считаю, что нам нужна дополнительная информация о том, что вы хотите сделать с циклом, чтобы предлагать более качественные ответы.Кроме того, технически цикл «jp» будет быстрее, но для этого потребуется знать адрес. Например, C3959D составляет 10cc против 12cc для 18FE. – Zeda

ответ

1

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

4

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

3

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

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

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

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

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

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

+2

Самый быстрый цикл: «LD HL, $ + 3; JP (HL)». С некоторой тщательной настройкой вы можете сделать «IN L, (C), JP (HL)» работать. –

+0

Конечно, запись собственной последовательности прерываний немного сложна в калькуляторах TI-84. Вы должны использовать IM 2, но отправленный байт является полностью случайным (ну, некоторые калькуляторы это не так, но вы должны рассматривать его как случайный), поэтому вам нужно установить целую последовательность 257 байтов на все тот же байт, где ваш код прерывания. – fuzzything44

+0

О да, точно, jp (hl)! Как я мог ... :) Я посмел немного обновить свой ответ. – lvd