Просмотр полной версии : Время выполнения команд CPI/CPD/CPIR/CPDR
Здравствуйте!
Раньше я никогда не задумывался над этим вопросом: сказано в справочнике, что 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, аууууу!!! ;)
Так есть ли этот цикл на самом деле в строковых командах сравнения или нет? У меня нынче рабочего реала нет, посмотреть не на чем... :confused:
Пожалуйста, кто может, просветите меня! :speccy:
А в чём собсно сомнение? По логике, зачем делать две похожие команды различными способами? Чтение присутствует в обоих, только в CPI (например) супротив LDI идёт не запись в память, а сравнение с A. Кстати, в CPIR/CPDR циклов может быть и 5, точнее их всегда 5, только при условии BC=0 и A=(HL) их 4.
Гы-гы, 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
Большое спасибо всем откликнувшимся.
Но я просил, если кто может, проверить, сколько реально занимают времени данные команды.
А в чём собсно сомнение? По логике, зачем делать две похожие команды различными способами? Чтение присутствует в обоих, только в 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. Спасибо.
Но я просил, если кто может, проверить, сколько реально занимают времени данные команды.
А как можно это проверить?
По какой, интересно, логике? Они, конечно, похожи, но неужто только ради этого нужно вставлять холостые циклы?
Хм, не факт, что холостой и не факт, что запись.
Не кажется ли это странным? Хочу напомнить, что в ряде команд всяческие проверки и сравнения байт процессор делает в 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" происходит. Сэкономили типо. :)
возможно, что ldi и cpi делает физически одна схема, рулимая парой вентилей...
Что я подозревал и подозреваю.
Сэкономили типо. :)
Нифига себе. Слабо развести вручную проц на 7,5 тыщ транзисторов?
а почему 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
Сомневаюсь, потому как Z80 не делает паралеьно несколько действий, мож на шине и есть какие нить рудименты из за предельного упрощения проца которые можно как то квалифицировать оперевшись на код операции
но это нада смотреть на живом проце пошагово его запустив
Добавлено через 4 минуты
и есть ли там холостой цикл записи в память?
Понятие дикое какое то, как может быть холостой цикл записи в память? Чтение еще понятно данные читаются и игнорируются
Lethargeek
13.12.2007, 16:24
Понятие дикое какое то, как может быть холостой цикл записи в память?
Ну дык видимо имелось в виду - записывается только что прочитанный байт туда же; можно было бы (а можно?) проверить, если остановить проц внешним девайсом после MRD и нарочно поменять содержимое памяти, а потом посмотреть, что там будет.
смотрим время исполнения команды 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 один (!)
Именно так! :)))) Однако та таблица, о которой я говорю, не "тянет" на упрощенную, там расписано по циклам, что и как.
И всё равно LDx/CPx сведены в одну группу. Либо неспроста, либо упростили таблицу. Здравый смысл говорит, что в CPx не надо писать в память, но ссылаясь на эту таблицу здравый смысл так же говорит, что если действительно так сделали, то только для того, что бы не раздувать схему.
а в "микропроцессорном комплекте" все очень неплохо расписано, если б еще без ошибок...
Возможно открою секрет, но "МП" - это в большей степени перепечатка старых док. Старые доки были лучше новых.
Но с другими группами "похожих" команд одна и та же развязка присутствует не всегда; и, насколько я помню, нигде нет холостых циклов или тактов;
И всё-таки почему ты уверен, что цикл холостой и что в этом цикле именно запись в память?
А на реале проверить можно, вставив эти команды в цикл, считая кол-во выполненных циклов от прерывания до прерывания, с записью тоже можно что-нибудь придумать; но я о том и говорю, что у меня сейчас нет действующего реального железа :'(
Это ничего не даст даже на реальном железе. Потому что если в случае с LDx известно, что приёмник стоит в (DE), то в случае с CPx неизвестно, где приёмник, сиречь ты не узнаешь, куда произошла запись в память, если она была.
Да просто можно зациклить CPI с запретом прерываний (DI; CPI; JR $-2), тогда если на осцилле будет видно дерганье сигнала WR процессора, значит, цикл записи имеется. Если есть цикл записи, значит, пишется наверняка то же и туда же, ибо содержимое памяти не меняется.
Ну дык видимо имелось в виду - записывается только что прочитанный байт туда жеИменно это и имелось в виду, никаких дикостей, было бы желание понять, о чем речь :))).
Добавлено через 3 минуты
И всё-таки почему ты уверен, что цикл холостой и что в этом цикле именно запись в память?В том-то и дело, я не уверен, поэтому я и задал этот вопрос изначально: запись там, что-то другое или более серьезная ошибка в документации?
Да просто можно зациклить CPI с запретом прерываний (DI; CPI; JR $-2), тогда если на осцилле будет видно дерганье сигнала WR процессора, значит, цикл записи имеется. Если есть цикл записи, значит, пишется наверняка то же и туда же, ибо содержимое памяти не меняется.
логично, есть одно но: когда меняется адрес на А0-А15? ведь по идее HL инкрементируется, а когда, до "записи" в память или после? исходить из похожести на LDI здесь нельзя, там "последний" адрес из DE
сиречь ты не узнаешь, куда произошла запись в память, если она былаНасколько мы знаем, содержимое памяти не меняется после CPx, во время выполнения команды считанный байт известен только один и по определенному адресу (если не учитывать код команды :-D ), так что отсюда и можно сделать заранее предположение, что запись идет туда же и того же. Если(!) она, эта запись, есть.
Это у ldi/ldd два inc/dec, а у cpi/cpd один (!)
Я особо не спорю, но вроде ты запарился
Lethargeek
13.12.2007, 16:57
Я вот че подумал: емнип были ж такие схемы теневого ПЗУ, с раздельным включением на чтение и на запись, то есть чтение может физически происходить из "настоящего" ПЗУ, а запись по тем же адресам - уже в теневую страницу ОЗУ... и соотв-но проверив ее после CPI в адресах 0-16383, получаем ответ!
Добавлено через 1 минуту
Я особо не спорю, но вроде ты запарился
Ну все равно на один меньше, чем в ldi... (про bc забыл, да)
Ну в некоторых моделях же можно отключать ПЗУ-тость 0-й страницы и делать ее обычным ОЗУ; тем не менее, о случаях дополнительных глюков при использовании CPx (и вообще других команд) я не слышал...
и соотв-но проверив ее после CPI в адресах 0-16383, получаем ответ Пардон, только сейчас до меня дошло :)))
Да просто можно зациклить CPI с запретом прерываний (DI; CPI; JR $-2)...
Зациклил, проверил... Нету WR ! :v2_smoke:
Z0840004PSC 90г.
Lethargeek
13.12.2007, 20:42
Зациклил, проверил... Нету WR !
Хм, возможно, "снаружи" записи и нету - а "внутри" мож все равно происходит
(только выход на WR отрубается)
Z80 ацтой :)
DDp, спасибо за информацию!! А можно уточнить, если WR нет, то по скорости выполнения CPI отличается от LDI ?
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, Если есть возможность, запустите, пожалуйста вот такие 2 программулины:...
...и замерьте время между спадающими фронтами WR (короче, период), я ведь правильно понял, у Вас и реал, и осцилл под рукой? ;)
В общем, нужно знать, одинаковое это время или нет и какое. Еще раз спасибо за помощь!
В обоих случаях 12мкс = 42 такта (как "по-учебнику").
А, вот, на счёт оцилла не угадали.
Нет у меня его. :v2_cry: :mad:
Приходиться извращаться по-всякому. :v2_wink2:
Примите мою благодарность за оперативную помощь по сути дела.
Дело закрыто! (с)
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot