кстати интерестно как отреагирует на это реал.Меня интересует вопрос прихода прерывания во время выполнения этой длинной команды.
жалко что мой кай сейчас без моника...
хым,
я вот так думаю.
Команда LD IX,#ABCD не может быть прервана, так что прерывание не может на неё прийти. Однако что будет если перед #DD будет стоять ещё и #FD не знаю.
Я тут всё пытаюсь отладить программу которая на реале бы проверила действие этого мегафрукта - набора префиксов команд. Как наберу скажу что и как.
Судя по поведению некоторых эмуляторов, выполнение операций с префиксами не является атомарным (по меньшей мере, с точки зрения инфраструктуры эмулятора- иначе бы все затыкались). Вопрос о точке зрения процессора остается открытым.
GriV,
Проверь, плз на одинаковых префиксах и чередующихся- может быть разное поведение.
Насколько я понял, приход префикса в префиксе уменьшает PC на 1 и все, при этом тратится 8 тактов. Соответственно, прерывания никто не запрещает, два префикса выполняются как команда уменьшения PC на 1.
P.S. Кстати вдруг стало интересно. Засекали ли время выполнения команд, префиксирование которых ничего не дает? Например, команда EX DE,HL не превращается в EX DE,IX/IY, значит ли это, что, встретив "неверный" КОП для определенного префикса (в т.ч. и другой префикс кроме 0xCB), Z80 просто уменьшает PC на 1, отчего PC ставится на следующий байт сразу после префикса?
Последний раз редактировалось ARTi; 30.01.2008 в 16:51.
Если мне не изменяет память, в результате своих давнишних экспериментов на реале я выяснил, что:
1. Последовательности вроде
PC+0: #DD/#FD
PC+1: #недопустимый КОП (в т.ч. #ED, #DD, #FD) поправка - к #ED не относится, см ниже
PC+2: #xx
в результате ставят PC на PC+1, tacts = tacts+8. Но на сколько увеличивается R - на 1 или 2 - я тогда, тупица, не посмотрел... предположительно на 2 все-таки. При этом сбоев функционирования прерываний при моих экспериментах я не заметил. Хороший, однако, Фаджин придумал "workaround"
2. Последовательность
PC+0: #ED
PC+1: #ED/#DD/#FD
PC+2: #xx
работает как 8-тактный NOP, т.е. PC ставится на PC+2, tacts = tacts+8. Регистр R предположительно должен увеличиваться на 2, т.к. в данном случае никаких специальных действий (типа отката как в случае с #DD/#FD) не производится.
Надо будет напридумать простеньких прожек для проверки, навроде таких, и хорошо попросить товарища DDp проверить (и сделать замеры) на реале .
Добавлено через 15 часов 2 минуты
Итак, начнем.
Господин DDp или кто-нибудь еще! Если есть возможность, запустите, пожалуйста, на реале вот такие 2 программулины:
иКод:ORG #8000 LD HL, 0 XOR A, A LD R, A DI DB #00 ; R += 1 DB #00 ; R += 1 LD BC, (#8000) ; R += 2 LD A, R ; R += 2 OUT (#FE), A ; R += 1 JR $-10 ; R += 1
Как всегда, просьба замерить время между спадающими фронтами WR (короче, период). А также: в первом варианте бордюр должен быть постоянно одного цвета (вроде белого). Как ведет себя бордюр во втором варианте?Код:ORG #8000 LD HL, 0 XOR A, A LD R, A DI DB #DD ; R += 2 ??? LD BC, (#8000) ; R += 2 LD A, R ; R += 2 OUT (#FE), A ; R += 1 JR $-9 ; R += 1
Неприятный побочный эффект: через динамик будет слышен звук определенной частоты (~2 кГц) , т.к. содержимое регистра R полностью транслируется в порт #FE без изменений. Кстати, как частота тона будет отличаться во втором случае?
Заранее спасибо за содействие!
Последний раз редактировалось ARTi; 05.02.2008 в 17:49.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Ага, при том, что у меня нет осцилла...
Только потому, что мне это тоже интересно:
var1 - 60 тактов,
var2 - 56 тактов.
Z0840004PSC (9011)
US0.36.7 ведёт себя также:
var1 - бордюр белый (R+8),
var2 - цвет "уменьшается на еденицу" (R+7).
~14-15 kHz
Опа...
Я похоже совсем в тот день пересидел на работе, что-то не совсем то написал, что хотел
Однако все равно определенную часть картины это подтверждает. В случае с #DD/#FD + #ED никакого отката не происходит, все как и надо. А я что написал? Сейчас подправлю, приношу извинения за дезинформацию... R увеличивается как и надо, такты - тоже. Только я чего-то не въехал, почему частота-то такая большая?..
Если у Вас еще не пропал интерес, то теперь будет самое интересное . Просьба - та же:Только потому, что мне это тоже интересно
иКод:ORG #8000 LD HL, 0 XOR A, A LD R, A DI DB #00 ; R += 1 DB #00 ; R += 1 DB #00 ; R += 1 EX DE, HL ; R += 1 LD A, R ; R += 2 OUT (#FE), A ; R += 1 JR $-8 ; R += 1
В обоих ли случаях бордюр белый? Время между WR-ами одно и то же или разное?Код:ORG #8000 LD HL, 0 XOR A, A LD R, A DI DB #00 ; R += 1 DB #DD ; R += 2 ??? EX DE, HL ; R += 1 LD A, R ; R += 2 OUT (#FE), A ; R += 1 JR $-7 ; R += 1
А как Вы это тогда делаете?Ага, при том, что у меня нет осцилла...
Прочитал тред. Не смешно. Длинная команда выполняется как серия коротких это известно давным давно. Соответственно, если "длинная" команда после очередного выполнения затирает себя (например), то на следующей итерации выполняется уже модифицированная команда. И прерывания обрабатываются как после обычной короткой команды LDI.
Короче: LDIR = LDI;PC=PC-2. И точка. Осциллографом тыкать сразу - нет чтобы доки почитать...
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)