PDA

Просмотр полной версии : Время выполнения команд CPI/CPD/CPIR/CPDR



ARTi
13.12.2007, 05:09
Здравствуйте!

Раньше я никогда не задумывался над этим вопросом: сказано в справочнике, что CPI/CPD=16, а CPIR/CPDR=21/16, значит, так и есть.
Недавно я, "уточняя" все команды по машинным циклам, наткнулся на такие записи в справочнике:


LDI/LDD/CPI/CPD:
M1=CBR(4),OCR(4);M2=MRD(3);M3=MWR(3)
где M1,M2,M3 - соотв. машинные циклы; CBR - control byte read; OCR - operation code read; MRD - memory read; MWR - memory write.
Все вроде логично, команды схожи, но... понятно, что у LDI/LDD имеется цикл записи в память. А откуда этот же цикл взялся в CPI/CPD ?! Холостой "за компанию", что ли? :v2_biggr:
Тот же самое с CPIR/CPDR...

Так есть ли этот цикл на самом деле в строковых командах сравнения или нет? У меня нынче рабочего реала нет, посмотреть не на чем... :confused:
Пожалуйста, кто может, просветите меня! :speccy:

Lethargeek
13.12.2007, 09:44
Гы-гы, heroy, аууууу!!! ;)

icebear
13.12.2007, 10:54
Так есть ли этот цикл на самом деле в строковых командах сравнения или нет? У меня нынче рабочего реала нет, посмотреть не на чем... :confused:
Пожалуйста, кто может, просветите меня! :speccy:

А в чём собсно сомнение? По логике, зачем делать две похожие команды различными способами? Чтение присутствует в обоих, только в CPI (например) супротив LDI идёт не запись в память, а сравнение с A. Кстати, в CPIR/CPDR циклов может быть и 5, точнее их всегда 5, только при условии BC=0 и A=(HL) их 4.

ZEK
13.12.2007, 12:36
Гы-гы, heroy, аууууу!!!

Из оф. даташита

Description: The contents of the memory location addressed by the HL register is
compared with the contents of the Accumulator. In case of a true compare,
a condition bit is set. Then HL is incremented and the Byte Counter
(register pair BC) is decremented.



M Cycles T States 4 MHz E.T.
4 16 (4, 4, 3, 5) 4.00


Condition Bits Affected:
S is set if result is negative; reset otherwise
Z is set if A is (HL); reset otherwise
H is set if borrow from bit 4; reset otherwise
P/V is set if BC -1 is not 0; reset otherwise
N is set
C is not affected

И от меня стандартные циклы доступа памяти не растянутые длятся 3 такта, то биш 5 тактов он просто занимается декрементами/инкрементами регистровых пар и не в холостую что то пишет, хотя канешна на шину интересно посмотреть

Lethargeek
13.12.2007, 14:32
хотя канешна на шину интересно посмотреть
Тому уж наверно год как ты собирался по корке выяснить :p

ARTi
13.12.2007, 14:43
Большое спасибо всем откликнувшимся.

Но я просил, если кто может, проверить, сколько реально занимают времени данные команды.


А в чём собсно сомнение? По логике, зачем делать две похожие команды различными способами? Чтение присутствует в обоих, только в CPI (например) супротив LDI идёт не запись в память, а сравнение с A.
По какой, интересно, логике? Они, конечно, похожи, но неужто только ради этого нужно вставлять холостые циклы?

Я попрошу подумать вот над этим:

LDI:
M1=CBR+OCR=8 тактов - префикс/код команды;
M2=MRD=3 такта - чтение из (HL);
M3=MWR=5 тактов - запись в (DE), DE+=1, HL+=1, BC-=1, выставление флагов.
Итого: 16 тактов.

CPI:
M1=CBR+OCR=8 тактов - префикс/код команды;
M2=MRD=3 такта - чтение из (HL);
M3=MWR=5 тактов - CP (HL), HL+=1, BC-=1, выставление флагов.
Итого: 16 тактов.
Не кажется ли это странным? Хочу напомнить, что в ряде команд всяческие проверки и сравнения байт процессор делает в 1 такт, а то и вовсе "заглатывает" без потерь времени.

"По логике" можно сделать так:
(a)
M1=CBR+OCR=8 тактов - префикс/код команды;
M2=MRD=5 тактов - чтение из (HL), CP (HL), HL+=1, BC-=1, выставление флагов.
Итого: 13 тактов.
В моем справочнике написано, что в этой команде M3 - это цикл записи в память (как в LDI), но откуда он, если "по логике" команда ничего в память писать не должна?

Возможно, в книженции моей ошибка, сделано на самом деле так:
(b)
M1=CBR+OCR=8 тактов - префикс/код команды;
M2=MRD=3 такта - чтение из (HL);
M3=IOP(internal operation)=5 тактов - CP (HL), HL+=1, BC-=1, выставление флагов.

И вот мне надо знать, последний цикл M3 - он вообще есть, есть ли там запись в память (вы ведь понимаете, что в случае разделяемой памяти или неполного турбирования имеются всякие wait'ы и прочее, а в случае внутренних операций процессора ничего не тормозится?), или там просто внутренние операции?

Мне не надо цитировать даташиты, я и сам уже посмотрел и там, и здесь, и, к сожалению, пока не нашел ответа.

Я, похоже, неверно выразился. Я просил просветить меня, если кто знает точно, а если нет, пожалуйста, если есть возможность, посмотрите кто-нибудь на реале, сколько занимает тактов команды CPI/CPD/CPIR/CPDR и есть ли там холостой цикл записи в память?

P.S. Извиняйте за возможный сумбур, но прошу, если не лень, внимательно перечитать до связного понимания того, что я хотел сказать :-D. Спасибо.

icebear
13.12.2007, 15:12
Но я просил, если кто может, проверить, сколько реально занимают времени данные команды.

А как можно это проверить?


По какой, интересно, логике? Они, конечно, похожи, но неужто только ради этого нужно вставлять холостые циклы?

Хм, не факт, что холостой и не факт, что запись.


Не кажется ли это странным? Хочу напомнить, что в ряде команд всяческие проверки и сравнения байт процессор делает в 1 такт, а то и вовсе "заглатывает" без потерь времени.

Не странно, ниже почему.


"По логике" можно сделать так:
...
В моем справочнике написано, что в этой команде M3 - это цикл записи в память (как в LDI), но откуда он, если "по логике" команда ничего в память писать не должна?

Так вот, почему не странно. В противовес этой логике могу спросить: а почему Z80 при записи данных пуляет данные уже во время T1, хотя при чтении снимает их в Т3 (см. диаграмму чтения/записи в память)? Не наводит ли это на мысль о том, что проц не может читать из памяти и одновременно рулить регистры, но может писать в память и одновремнно рулить регистры? Возможный ответ на мой вопрос - для того, что бы можно было работать с медленной памятью, но кто знает это конкретно?


Возможно, в книженции моей ошибка, сделано на самом деле так:

Книженция небось "микропроцессорный комплект Z80"? Возможно, там упрощённые таблицы для CPx/LDx.


И вот мне надо знать, последний цикл M3 - он вообще есть, есть ли там запись в память (вы ведь понимаете, что в случае разделяемой памяти или неполного турбирования имеются всякие wait'ы и прочее, а в случае внутренних операций процессора ничего не тормозится?), или там просто внутренние операции?

Идея понятна - тормозится там, где не должно. Но я так думаю Фаджин не стал бы делать отдельные развязки для похожих команд. Действительно ли идёт запись вопрос интересный. Как это проверить, я не знаю. Пошагово рулить клоком процессора и смотреть состояния сигналов?

Lethargeek
13.12.2007, 15:44
А цикл записи может действительно оказаться самый настоящий - типо "ld (hl),(hl)" и сбоку бантик "cp (hl)"... возможно, что ldi и cpi делает физически одна схема, рулимая парой вентилей... в первом случае флаг блокируется, во втором - временный "ex de,hl" происходит. Сэкономили типо. :)

icebear
13.12.2007, 15:52
возможно, что ldi и cpi делает физически одна схема, рулимая парой вентилей...

Что я подозревал и подозреваю.


Сэкономили типо. :)

Нифига себе. Слабо развести вручную проц на 7,5 тыщ транзисторов?

ARTi
13.12.2007, 15:52
а почему Z80 при записи данных пуляет данные уже во время T1, хотя при чтении снимает их в Т3 (см. диаграмму чтения/записи в память)? Не наводит ли это на мысль о том, что проц не может читать из памяти и одновременно рулить регистры, но может писать в память и одновремнно рулить регистры?Хм, надо сравнить с другими командами, имеется ли такая закономерность...


Книженция небось "микропроцессорный комплект Z80"? Возможно, там упрощённые таблицы для CPx/LDx.
Именно так! :)))) Однако та таблица, о которой я говорю, не "тянет" на упрощенную, там расписано по циклам, что и как. Вот это, например,


M Cycles T States 4 MHz E.T.
4 16 (4, 4, 3, 5) 4.00 - как раз и есть упрощенная, на мой взгляд ;), а в "микропроцессорном комплекте" все очень неплохо расписано, если б еще без ошибок...


Фаджин не стал бы делать отдельные развязки для похожих командНо с другими группами "похожих" команд одна и та же развязка присутствует не всегда; и, насколько я помню, нигде нет холостых циклов или тактов; более того, не так уж эти команды и похожи, строковые - да, с одним и тем же префиксом - да, но одна осуществляет пересылку, а другая всего лишь сравнение с A, из-за этого внутренние операции и работа с памятью различны.

Короче, в принципе с большой натяжкой можно понять, почему команды CPI/CPD могут выполняются столько же, сколько и LDI/LDD, по времени; но хотелось бы знать точно, в чем там дело.

А на реале проверить можно, вставив эти команды в цикл, считая кол-во выполненных циклов от прерывания до прерывания, с записью тоже можно что-нибудь придумать; но я о том и говорю, что у меня сейчас нет действующего реального железа :'(

Добавлено через 2 минуты

А цикл записи может действительно оказаться самый настоящий - типо "ld (hl),(hl)" и сбоку бантик "cp (hl)"... возможно, что ldi и cpi делает физически одна схема, рулимая парой вентилей... в первом случае флаг блокируется, во втором - временный "ex de,hl" происходит. Сэкономили типо.Именно это и хотелось бы знать точно. На чем сэкономили, может, на документации? ;)

Lethargeek
13.12.2007, 16:03
Кто-нить видел производственную документацию на Z80? ;)

Добавлено через 48 секунд
А простым смертным знать такие подробности не положено... :p

ZEK
13.12.2007, 16:15
Сомневаюсь, потому как Z80 не делает паралеьно несколько действий, мож на шине и есть какие нить рудименты из за предельного упрощения проца которые можно как то квалифицировать оперевшись на код операции
но это нада смотреть на живом проце пошагово его запустив

Добавлено через 4 минуты

и есть ли там холостой цикл записи в память?
Понятие дикое какое то, как может быть холостой цикл записи в память? Чтение еще понятно данные читаются и игнорируются

Lethargeek
13.12.2007, 16:24
Понятие дикое какое то, как может быть холостой цикл записи в память?
Ну дык видимо имелось в виду - записывается только что прочитанный байт туда же; можно было бы (а можно?) проверить, если остановить проц внешним девайсом после MRD и нарочно поменять содержимое памяти, а потом посмотреть, что там будет.

ZEK
13.12.2007, 16:36
смотрим время исполнения команды INC HL 6 тактов
4 выборка КОП, 2 инкримент пары

смотрим на CPI у него 2 inc/dec - то есть 4 такта из 5 холостых уже забито
а 1 тактик это возможно и есть время выполнения СP, или какие то внутренние пересылки, о которых можно гадать

так что физически если что то на шине и есть то это рудименты от адресного устройства проца

Lethargeek
13.12.2007, 16:42
Это у ldi/ldd два inc/dec, а у cpi/cpd один (!)

icebear
13.12.2007, 16:45
Именно так! :)))) Однако та таблица, о которой я говорю, не "тянет" на упрощенную, там расписано по циклам, что и как.

И всё равно LDx/CPx сведены в одну группу. Либо неспроста, либо упростили таблицу. Здравый смысл говорит, что в CPx не надо писать в память, но ссылаясь на эту таблицу здравый смысл так же говорит, что если действительно так сделали, то только для того, что бы не раздувать схему.


а в "микропроцессорном комплекте" все очень неплохо расписано, если б еще без ошибок...

Возможно открою секрет, но "МП" - это в большей степени перепечатка старых док. Старые доки были лучше новых.


Но с другими группами "похожих" команд одна и та же развязка присутствует не всегда; и, насколько я помню, нигде нет холостых циклов или тактов;

И всё-таки почему ты уверен, что цикл холостой и что в этом цикле именно запись в память?


А на реале проверить можно, вставив эти команды в цикл, считая кол-во выполненных циклов от прерывания до прерывания, с записью тоже можно что-нибудь придумать; но я о том и говорю, что у меня сейчас нет действующего реального железа :'(

Это ничего не даст даже на реальном железе. Потому что если в случае с LDx известно, что приёмник стоит в (DE), то в случае с CPx неизвестно, где приёмник, сиречь ты не узнаешь, куда произошла запись в память, если она была.

ARTi
13.12.2007, 16:47
Да просто можно зациклить CPI с запретом прерываний (DI; CPI; JR $-2), тогда если на осцилле будет видно дерганье сигнала WR процессора, значит, цикл записи имеется. Если есть цикл записи, значит, пишется наверняка то же и туда же, ибо содержимое памяти не меняется.

Ну дык видимо имелось в виду - записывается только что прочитанный байт туда жеИменно это и имелось в виду, никаких дикостей, было бы желание понять, о чем речь :))).

Добавлено через 3 минуты

И всё-таки почему ты уверен, что цикл холостой и что в этом цикле именно запись в память?В том-то и дело, я не уверен, поэтому я и задал этот вопрос изначально: запись там, что-то другое или более серьезная ошибка в документации?

icebear
13.12.2007, 16:51
Да просто можно зациклить CPI с запретом прерываний (DI; CPI; JR $-2), тогда если на осцилле будет видно дерганье сигнала WR процессора, значит, цикл записи имеется. Если есть цикл записи, значит, пишется наверняка то же и туда же, ибо содержимое памяти не меняется.

логично, есть одно но: когда меняется адрес на А0-А15? ведь по идее HL инкрементируется, а когда, до "записи" в память или после? исходить из похожести на LDI здесь нельзя, там "последний" адрес из DE

ARTi
13.12.2007, 16:55
сиречь ты не узнаешь, куда произошла запись в память, если она былаНасколько мы знаем, содержимое памяти не меняется после CPx, во время выполнения команды считанный байт известен только один и по определенному адресу (если не учитывать код команды :-D ), так что отсюда и можно сделать заранее предположение, что запись идет туда же и того же. Если(!) она, эта запись, есть.

ZEK
13.12.2007, 16:56
Это у ldi/ldd два inc/dec, а у cpi/cpd один (!)
Я особо не спорю, но вроде ты запарился

Lethargeek
13.12.2007, 16:57
Я вот че подумал: емнип были ж такие схемы теневого ПЗУ, с раздельным включением на чтение и на запись, то есть чтение может физически происходить из "настоящего" ПЗУ, а запись по тем же адресам - уже в теневую страницу ОЗУ... и соотв-но проверив ее после CPI в адресах 0-16383, получаем ответ!

Добавлено через 1 минуту

Я особо не спорю, но вроде ты запарился
Ну все равно на один меньше, чем в ldi... (про bc забыл, да)

ARTi
13.12.2007, 17:04
Ну в некоторых моделях же можно отключать ПЗУ-тость 0-й страницы и делать ее обычным ОЗУ; тем не менее, о случаях дополнительных глюков при использовании CPx (и вообще других команд) я не слышал...


и соотв-но проверив ее после CPI в адресах 0-16383, получаем ответ Пардон, только сейчас до меня дошло :)))

DDp
13.12.2007, 20:18
Да просто можно зациклить CPI с запретом прерываний (DI; CPI; JR $-2)...
Зациклил, проверил... Нету WR ! :v2_smoke:
Z0840004PSC 90г.

Lethargeek
13.12.2007, 20:42
Зациклил, проверил... Нету WR !
Хм, возможно, "снаружи" записи и нету - а "внутри" мож все равно происходит
(только выход на WR отрубается)

Z80 ацтой :)

ARTi
13.12.2007, 21:16
DDp, спасибо за информацию!! А можно уточнить, если WR нет, то по скорости выполнения CPI отличается от LDI ?

ARTi
17.12.2007, 20:31
DDp, Если есть возможность, запустите, пожалуйста вот такие 2 программулины:

LD HL, 0
DI
CPI
LD A, (HL)
LD (HL), A
JR $-4

и

LD HL, 0
LD DE, 0
DI
LDI
LD A, (HL)
LD A, (HL)
JR $-4


и замерьте время между спадающими фронтами WR (короче, период), я ведь правильно понял, у Вас и реал, и осцилл под рукой? ;)
В общем, нужно знать, одинаковое это время или нет и какое. Еще раз спасибо за помощь!

DDp
17.12.2007, 23:54
DDp, Если есть возможность, запустите, пожалуйста вот такие 2 программулины:...
...и замерьте время между спадающими фронтами WR (короче, период), я ведь правильно понял, у Вас и реал, и осцилл под рукой? ;)
В общем, нужно знать, одинаковое это время или нет и какое. Еще раз спасибо за помощь!

В обоих случаях 12мкс = 42 такта (как "по-учебнику").

А, вот, на счёт оцилла не угадали.
Нет у меня его. :v2_cry: :mad:
Приходиться извращаться по-всякому. :v2_wink2:

ARTi
18.12.2007, 16:32
Примите мою благодарность за оперативную помощь по сути дела.
Дело закрыто! (с)