**Это старая версия документа!**
"Управляющие команды" - это условное название большого количества контрольных линий, которые идут с верхней части процессора в нижнюю и управляют контекстом (регистрами, шинами и АЛУ). Ещё иногда я называю их "драйверами" (drivers).
Вот часть схемы процессора с несколькими контрольными линиями:
Каждая контрольная линия обычно содержит выходную защелку и иногда специальный транзистор-"отсекатель", который отключает линию в определенный полутакт (обычно часть линий отключается во время PHI2).
Большинство линий имеют названия вида A/B, это значит что линия "соединяет" A с B. Например SB/X означает что значение с внутренней шины SB помещается на регистр X.
Большинство команд идут в нижнюю часть процессора, но команды управления флагами не выходят за пределы рандомной логики, так как флаги располагаются в верхней части.
Список
- Команды управления регистрами
- Y/SB: Y ⇒ SB
- SB/Y: SB ⇒ Y
- X/SB: X ⇒ SB
- SB/X: SB ⇒ X
- S/ADL : S ⇒ ADL
- S/SB : S ⇒ SB
- SB/S : SB ⇒ S
- S/S : Команда S/S активна, если неактивна команда SB/S. Эта команда просто "рефрешит" текущее состояние регистра S.
- Команды управления АЛУ
- Команды управления счетчиком инструкций (PC)
- ADH/PCH : ADH ⇒ PCH
- PCH/PCH : Если не выполняется ADH/PCH, то выполняется эта команда (рефрешить PCH)
- PCH/ADH : PCH ⇒ ADH
- PCH/DB : PCH ⇒ DB
- ADL/PCL : ADL ⇒ PCL
- PCL/PCL : Если не выполняется ADL/PCL, то выполняется эта команда (рефрешить PCL)
- PCL/ADL : PCL ⇒ ADL
- PCL/DB : PCL ⇒ DB
- Команды управления шинами
- Команды управления регистром флагов
Конфликтные состояния
Конфликтные состояние возникают когда несколько внутренних схем одновременно пихают свои значения на одну и ту же шину.
Например, при одновременном выполнении команд X/SB и Y/SB оба регистра будут помещены на шину SB и при этом возникает так называемый конфликт шины.
Конфликт шины разруливается по простому правилу - "побеждает земля". То есть те разряды, которые равны 0 перебивают все единичные разряды.
Например, если значение X = 0x33 (00110011), а значение Y = 0x12 (00010010), то в результате одновременного выполнения команд X/SB и Y/SB значение шины будет равно 0x12 (00010010).
Симуляция конфликтных состояний
При обработке команд выгрузки значений на шины нужно делать не обычное присваивание типа SB = X, а применять следующий трюк :
SB = 0xFF; // bus precharged (not connected) if (X/SB) SB &= X; if (Y/SB) SB &= Y;
В результате чего единичные разряды шины разрядятся и возможные конфликты шины будут устранены.
Курица или яйцо?
Теоретически в процессоре 6502 могут быть установлены одновременно команда выдачи регистра на шину и команда загрузки того же самого регистра из шины (например X/SB и SB/X).
Поэтому возникает резонный вопрос : что делать вначале - помещать регистр на шину (X/SB) или загружать его (SB/X) ?
В данном случае транзисторы-ключи X/SB и SB/X будут открыты и получается что значение триггера просто "рефрешится" через шину.
По договоренности при симуляции триггеров значение с них вначале выдается потребителям, а потом загружается новое значение.
Поэтому команды выгрузки регистра на шину нужно делать перед командами загрузки новых значений.
Аналогичная ситуация может произойти например при выполнении инструкции TXS (поместить значение регистра X на регистр S). В этом случае рандомная логика выдаст две команды : X/SB и SB/S. При этом X/SB должна выполниться раньше SB/S, чтобы значение регистра X попало на шину SB, а с неё на регистр S.