Как были реализованы инструкции перехода на микропроцессоре 6502?

Существует множество способов реализации инструкции ветвления в оборудовании контроллера/секвенсора. Я сам делал это раньше своим методом, но у меня вопрос: как это было сделано на микропроцессоре 6502 и есть ли универсальный или хотя бы популярный способ аппаратного проектирования инструкций перехода?

(Дополнительная информация) Метод, который я использовал, заключался в том, что я добавил контакты флагов, прикрепленные к шине кода операции, которые при установке высокого уровня во время конкретной инструкции ветвления загружали значение определенного флага в ПЗУ декодера, таким образом выполняя ветвь, если флаг был высокий/низкий, и пропуская ветвь, если флаг был низкий/высокий. Например, во время инструкции BNE (переход на неравное) в определенном тактовом цикле будет активирован контакт «Нулевой флаг». Если на выводе низкий уровень, то он не меняет код операции, и декодер обычно переходит к следующей ячейке памяти для выполнения следующего набора микроинструкций, который в данном случае завершает инструкцию BNE без ветвления, а затем ожидает новую инструкцию. Однако, если на выводе «Нулевой флаг» высокий уровень, он изменяет код операции, что заставляет декодер перейти к новому адресу (который равен коду операции), где он будет считывать другой набор микроинструкций, которые будут выполнять ветвь, а не просто заканчивать /игнорируя это.


person Senijs    schedule 24.03.2019    source источник
comment
Вы делаете клон 6502 или делаете процессор вообще. 6502 неплох, но действительно ли это то, из чего вы хотите смоделировать свой? Очевидно, что правильного ответа нет, и это зависит от набора инструкций, например, рука, у вас есть несколько счетчиков программ, фальшивый, используемый в математике с r15, тот, который на самом деле выполняет предварительную выборку как минимум. Если в вашем наборе инструкций нет открытого счетчика программ, то от того, как вы вычисляете относительную адресацию ПК, относительные переходы и, возможно, относительный доступ к данным, зависит, можете ли вы использовать один компьютер для этого и выборки.   -  person old_timer    schedule 26.03.2019
comment
вы посмотрите на 6502 или другой в ту эпоху, и у них будет один счетчик программ, который выполняет выборку, и когда вы переходите к выполнению, он указывает на следующую инструкцию. если я правильно помню свой 6502. Помните, что эти чипы были нарисованы вручную на бумаге, каждый транзистор. худой и средний   -  person old_timer    schedule 26.03.2019
comment
как уже отмечалось, люди, работающие с visual6502, многому научились из реверс-инжиниринга по любой причине, по которой вы заинтересованы в 6502, который является хорошим ресурсом. обратите внимание, что существует 6502 открытых ядра, которые вы также можете загрузить и изучить...   -  person old_timer    schedule 26.03.2019
comment
Я бы не изменил код операции, у меня был бы конечный автомат и переменные состояния. если на диаграмме не осталось достаточно свободных кодов операций, чтобы покрыть эти состояния, на которые вы хотите перейти.   -  person old_timer    schedule 26.03.2019
comment
@old_timer Я не пытаюсь сделать точную копию 6502, я просто хочу создать процессор, который будет работать так же. Я делаю все это в симуляторе (Logisim), а не в реальной жизни. Я не слышал об opencores, проверю 6502 на их сайте, как только моя регистрация будет завершена. Я тоже не слышал о конечных автоматах и ​​переменных. Я полагаю, что просто сделаю разветвленное аппаратное/программное обеспечение наилучшим способом, который я могу придумать.   -  person Senijs    schedule 26.03.2019
comment
открытые ядра в целом некоторые из них находятся на opencores.org, вы получаете то, за что платите с открытым ядром, помните. и есть другие не на этом сайте, а просто в дикой природе, может быть, github и т. д.   -  person old_timer    schedule 26.03.2019
comment
вам в основном приходится иметь дело с выборкой с использованием некоторого адреса и вычислением пунктов назначения ветвления с использованием некоторого адреса в качестве контрольной точки. затем условные ветки, которые могут привести к двум возможным результатам и/или вы модифицируете преклир или не зависите от условия. вы можете заставить свою логику вычислить возможный пункт назначения независимо от того, выполняется ли условие, но в конечном итоге у вас должно быть условие if-then-else if then pc=pc_computed, иначе pc=pc. быть логикой, чем-то программируемым, логикой, программным обеспечением, чем угодно, что вы, конечно, вольны разрабатывать и реализовывать по своему усмотрению.   -  person old_timer    schedule 26.03.2019


Ответы (1)


Во-первых, опкод никогда не меняется.

Если у вас нет инсайдерской информации о «микрокоде» 6502, вы не можете знать точную реализацию. Таблица данных дает вам только выполняемую операцию, но редко дает подробные сведения о том, как именно это выполняется. Можно только догадываться.

Одно такое предположение:

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

  2. К PC добавляется 8-битное смещение со знаком (теперь, возможно, замаскированное).

person tonypdmtr    schedule 25.03.2019
comment
Полную инсайдерскую информацию можно найти на веб-сайте Visual 6502. Особенно полезным для получения из первых принципов ответа на этот конкретный вопрос может быть схема обратного проектирования. - person Jeremy; 25.03.2019
comment
Итак, вы говорите, что инструкции ветвления используют смещения для ветвления в нужное место в памяти? Я думал, что это больше похоже на инструкцию по переходу: вы пишете абсолютный адрес, и он загружается в ПК, если переход выполняется. Тем не менее, я объяснил свой метод очень плохо и сложно, я мог бы его отредактировать. Я разработал свой микроконтроллер таким образом, чтобы он изменял код операции промежуточной инструкции перехода, если переход должен быть выполнен, и не менял его, если переход не должен быть выполнен. Он работает как ветвь внутри инструкции ветвления. Я не слышал о регистрации кода состояния. - person Senijs; 25.03.2019
comment
Регистр кода состояния — одно из многих возможных названий регистра, в котором хранятся различные флаги процессора. Я не помню, как звали 6502 (может быть, регистр состояния?). Инструкции ветвления используют смещения со знаком (обычно 8-битные в младших и старых ЦП, но они могут быть любого размера в зависимости от ЦП). Смещение обычно происходит от инструкции, следующей за ветвью, поскольку PC всегда увеличивается, чтобы указывать на текущую инструкцию. У вас может быть любая реализация, которая вам нравится, но желательно, чтобы инструкции имели фиксированное количество циклов выполнения независимо от потока внутреннего выполнения. - person tonypdmtr; 25.03.2019
comment
На 6502 это регистр состояния или регистр флагов. Известен как «P» для процессора [статус/флаги]. Я чувствую, что CCR как термин наиболее тесно связан с 68000, но это не то, что я хотел бы пытаться доказать. Увы, я тупица в том, что касается ныне известных внутренностей 6502, так что мне больше нечего добавить. - person Tommy; 25.03.2019
comment
Я вижу, регистр кода состояния - это тот же регистр, что и регистр состояния процессора (регистр флагов). Мне все еще любопытно, как эти инструкции ветвления обычно реализуются в процессорах. Кроме того, использование смещений вместо абсолютных адресов кажется мне неэффективным. Почему это лучше, чем абсолютная адресация? - person Senijs; 25.03.2019
comment
Филиалы на самом деле очень эффективны. Их основными преимуществами являются более короткие инструкции (2-байтовый BRA по сравнению с 3-байтовым JMP в 8-битных машинах) и независимость от позиции, которая необходима, когда один и тот же код загружается по разным адресам в ОС. Некоторые процессоры (например, 6809) включают длинные ветви (например, LBRA) с 16-битным смещением. - person tonypdmtr; 25.03.2019
comment
@Senijs Ветки 6502 рассчитываются путем знака, расширяющего восьмибитное смещение и добавляющего его к ПК (который на данный момент на два байта превышает адрес инструкции перехода). - person JeremyP; 28.03.2019
comment
Обратите внимание, что при вычислении адреса используется 8-битное АЛУ для добавления 8-битного смещения с расширенным знаком к 16-битному ПК, поэтому, если ветвь пересекает границу страницы (т. е. генерирует перенос из младших 8 битов в старшие 8 бит) требуется дополнительный цикл для увеличения или уменьшения старшей половины PC. (В качестве альтернативы 8-битному АЛУ требуется 2 цикла для выполнения 16-битного сложения, но секвенсор сокращает это, если нет переноса из младшей половины.) - person Jeremy; 02.04.2019