Важная информация

User Tag List

Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 28

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

  1. #1
    Member Аватар для ARTi
    Регистрация
    06.05.2006
    Адрес
    Санкт-Петербург
    Сообщений
    127
    Благодарностей: 6
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Время выполнения команд 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 ?! Холостой "за компанию", что ли?
    Тот же самое с CPIR/CPDR...

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

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Guru Аватар для Lethargeek
    Регистрация
    07.09.2005
    Адрес
    Воронеж
    Сообщений
    2,064
    Благодарностей: 203
    Записей в дневнике
    2
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Гы-гы, heroy, аууууу!!!
    Прихожу без разрешения, сею смерть и разрушение...

  4. #3
    Veteran Аватар для icebear
    Регистрация
    05.05.2005
    Адрес
    Германия
    Сообщений
    1,614
    Благодарностей: 7
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ARTi Посмотреть сообщение
    Так есть ли этот цикл на самом деле в строковых командах сравнения или нет? У меня нынче рабочего реала нет, посмотреть не на чем...
    Пожалуйста, кто может, просветите меня!
    А в чём собсно сомнение? По логике, зачем делать две похожие команды различными способами? Чтение присутствует в обоих, только в CPI (например) супротив LDI идёт не запись в память, а сравнение с A. Кстати, в CPIR/CPDR циклов может быть и 5, точнее их всегда 5, только при условии BC=0 и A=(HL) их 4.
    Who are you to fucking lecture me?

  5. #4
    ZEK
    Гость

    По умолчанию

    Цитата Сообщение от Lethargeek Посмотреть сообщение
    Гы-гы, 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 тактов он просто занимается декрементами/инкрементами регистровых пар и не в холостую что то пишет, хотя канешна на шину интересно посмотреть
    Последний раз редактировалось ZEK; 13.12.2007 в 12:39.

  6. #5
    Guru Аватар для Lethargeek
    Регистрация
    07.09.2005
    Адрес
    Воронеж
    Сообщений
    2,064
    Благодарностей: 203
    Записей в дневнике
    2
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от heroy Посмотреть сообщение
    хотя канешна на шину интересно посмотреть
    Тому уж наверно год как ты собирался по корке выяснить
    Прихожу без разрешения, сею смерть и разрушение...

  7. #6
    Member Аватар для ARTi
    Регистрация
    06.05.2006
    Адрес
    Санкт-Петербург
    Сообщений
    127
    Благодарностей: 6
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Большое спасибо всем откликнувшимся.

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

    А в чём собсно сомнение? По логике, зачем делать две похожие команды различными способами? Чтение присутствует в обоих, только в 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. Спасибо.

  8. #7
    Veteran Аватар для icebear
    Регистрация
    05.05.2005
    Адрес
    Германия
    Сообщений
    1,614
    Благодарностей: 7
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ARTi Посмотреть сообщение
    Но я просил, если кто может, проверить, сколько реально занимают времени данные команды.
    А как можно это проверить?

    Цитата Сообщение от ARTi Посмотреть сообщение
    По какой, интересно, логике? Они, конечно, похожи, но неужто только ради этого нужно вставлять холостые циклы?
    Хм, не факт, что холостой и не факт, что запись.

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

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

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

    Цитата Сообщение от ARTi Посмотреть сообщение
    И вот мне надо знать, последний цикл M3 - он вообще есть, есть ли там запись в память (вы ведь понимаете, что в случае разделяемой памяти или неполного турбирования имеются всякие wait'ы и прочее, а в случае внутренних операций процессора ничего не тормозится?), или там просто внутренние операции?
    Идея понятна - тормозится там, где не должно. Но я так думаю Фаджин не стал бы делать отдельные развязки для похожих команд. Действительно ли идёт запись вопрос интересный. Как это проверить, я не знаю. Пошагово рулить клоком процессора и смотреть состояния сигналов?
    Who are you to fucking lecture me?

  9. #8
    Guru Аватар для Lethargeek
    Регистрация
    07.09.2005
    Адрес
    Воронеж
    Сообщений
    2,064
    Благодарностей: 203
    Записей в дневнике
    2
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  10. #9
    Veteran Аватар для icebear
    Регистрация
    05.05.2005
    Адрес
    Германия
    Сообщений
    1,614
    Благодарностей: 7
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Lethargeek Посмотреть сообщение
    возможно, что ldi и cpi делает физически одна схема, рулимая парой вентилей...
    Что я подозревал и подозреваю.

    Цитата Сообщение от Lethargeek Посмотреть сообщение
    Сэкономили типо.
    Нифига себе. Слабо развести вручную проц на 7,5 тыщ транзисторов?
    Who are you to fucking lecture me?

  11. #10
    Member Аватар для ARTi
    Регистрация
    06.05.2006
    Адрес
    Санкт-Петербург
    Сообщений
    127
    Благодарностей: 6
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    а почему 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" происходит. Сэкономили типо.
    Именно это и хотелось бы знать точно. На чем сэкономили, может, на документации?
    Последний раз редактировалось ARTi; 13.12.2007 в 15:54. Причина: Добавлено сообщение

Страница 1 из 3 123 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 2
    Последнее: 04.11.2006, 14:08
  2. Каких команд с IX не существует?
    от captain cobalt в разделе Программирование
    Ответов: 5
    Последнее: 21.08.2006, 17:58
  3. Московское время не в почете?
    от Jedius в разделе Форум
    Ответов: 42
    Последнее: 12.04.2005, 21:31

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •