Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
6502:control [2013/09/25 11:00] org |
6502:control [2020/02/10 13:05] (текущий) org |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | # Управляющие команды | ||
+ | |||
**"Управляющие команды"** - это условное название большого количества контрольных линий, которые идут с верхней части процессора в нижнюю и управляют контекстом (регистрами, шинами и АЛУ). Ещё иногда я называю их "драйверами" (drivers). | **"Управляющие команды"** - это условное название большого количества контрольных линий, которые идут с верхней части процессора в нижнюю и управляют контекстом (регистрами, шинами и АЛУ). Ещё иногда я называю их "драйверами" (drivers). | ||
Строка 11: | Строка 13: | ||
Большинство команд идут в нижнюю часть процессора, но команды управления флагами не выходят за пределы рандомной логики, так как флаги располагаются в верхней части. | Большинство команд идут в нижнюю часть процессора, но команды управления флагами не выходят за пределы рандомной логики, так как флаги располагаются в верхней части. | ||
- | ==== Список ==== | + | ## Список |
* **Команды управления регистрами** | * **Команды управления регистрами** | ||
Строка 23: | Строка 25: | ||
* S/S : Команда S/S активна, если неактивна команда SB/S. Эта команда просто "рефрешит" текущее состояние регистра S. | * S/S : Команда S/S активна, если неактивна команда SB/S. Эта команда просто "рефрешит" текущее состояние регистра S. | ||
* **Команды управления АЛУ** | * **Команды управления АЛУ** | ||
+ | * FIXME | ||
* **Команды управления счетчиком инструкций (PC)** | * **Команды управления счетчиком инструкций (PC)** | ||
+ | * 1/PC : сделать инкремент program counter | ||
* ADH/PCH : ADH => PCH | * ADH/PCH : ADH => PCH | ||
* PCH/PCH : Если не выполняется ADH/PCH, то выполняется эта команда (рефрешить PCH) | * PCH/PCH : Если не выполняется ADH/PCH, то выполняется эта команда (рефрешить PCH) | ||
Строка 33: | Строка 37: | ||
* PCL/DB : PCL => DB | * PCL/DB : PCL => DB | ||
* **Команды управления шинами** | * **Команды управления шинами** | ||
+ | * ADH/ABH : ADH => ABH | ||
+ | * ADL/ABL : ADL => ABL | ||
+ | * 0/ADL0, 0/ADL1, 0/ADL2 : используется для установки вектора прерываний, путем управления младшими 3 разрядами шины ADL. Например 0/ADL0 означает что 0-й разряд шины ADL устанавливается в 0. Значение с адресных регистров выводится на внешнюю шину адреса. | ||
+ | * 0/ADH0, 0/ADH17 : сбросить часть разрядов шины ADH | ||
+ | * SB/DB : SB <=> DB, соединить две шины | ||
+ | * SB/ADH : SB <=> ADH | ||
+ | * **Команды управление data latch** | ||
+ | * FIXME | ||
* **Команды управления регистром флагов** | * **Команды управления регистром флагов** | ||
+ | * DB/P : load I, D, Z flags from internal data bus | ||
+ | * IR5/I : used to handle SEI/CLI instructions | ||
+ | * IR5/C : used to handle SEC/CLC instructions | ||
+ | * DB/C : load C flag, from internal data bus | ||
+ | * ACR/C : put ALU carry out to C flag | ||
+ | * IR5/D : used to handle SED/CLD instructions | ||
+ | * DBZ/Z : put ALU zero result to Z flag | ||
+ | * 1/V : forced whenever input pad SO is set | ||
+ | * 0/V : used to handle CLV instruction | ||
+ | * DB/V : load V flag, from internal data bus | ||
+ | * AVR/V : put ALU overflow out to V flag | ||
+ | * DB/N : load N flag, from internal data bus | ||
+ | * P/DB : enables tri-state buffer, to connect flags output with internal data bus. | ||
- | ==== Конфликтные состояния ==== | + | ## Когда какие команды активны |
- | Конфликтные состояние возникают когда несколько внутренних схем одновременно пихают свои значения на шину. | + | Часть команд принудительно устанавливается в 0 (отключается) во время PHI2. Связано это с тем, что внутренние шины подзаряжаются во время PHI2, а регистры в это время обычно "рефрешатся". Ниже приведена таблица, галочкой помечаются команды который могут быть активны в указанный полутакт, а прочерком - когда команды принудительно отключаются. |
- | Например, при одновременном выполнении команд X/SB и Y/SB оба регистра будут помещены на шину и при этом возникает так называемый конфликт шины. | + | ^Команда^PHI1^PHI2^ |
+ | |**Команды управления регистрами**||| | ||
+ | |Y/SB|✓|---| | ||
+ | |SB/Y|✓|---| | ||
+ | |X/SB|✓|---| | ||
+ | |SB/X|✓|---| | ||
+ | |S/ADL|✓|✓| | ||
+ | |S/SB|✓|✓| | ||
+ | |SB/S|✓|---| | ||
+ | |S/S|✓|---| | ||
+ | |||
+ | ## Конфликтные состояния | ||
+ | |||
+ | Конфликтные состояние возникают когда несколько внутренних схем одновременно пихают свои значения на одну и ту же шину. | ||
+ | |||
+ | Например, при одновременном выполнении команд X/SB и Y/SB оба регистра будут помещены на шину SB и при этом возникает так называемый конфликт шины. | ||
Конфликт шины разруливается по простому правилу - "побеждает земля". То есть те разряды, которые равны 0 перебивают все единичные разряды. | Конфликт шины разруливается по простому правилу - "побеждает земля". То есть те разряды, которые равны 0 перебивают все единичные разряды. | ||
Строка 45: | Строка 85: | ||
Например, если значение X = 0x33 (00110011), а значение Y = 0x12 (00010010), то в результате одновременного выполнения команд X/SB и Y/SB значение шины будет равно 0x12 (00010010). | Например, если значение X = 0x33 (00110011), а значение Y = 0x12 (00010010), то в результате одновременного выполнения команд X/SB и Y/SB значение шины будет равно 0x12 (00010010). | ||
- | ==== Симуляция конфликтных состояний ==== | + | ## Симуляция конфликтных состояний |
- | При обработке команд загрузки значений на шины нужно делать не обычное присваивание типа SB = X, а применять следующий трюк : | + | При обработке команд выгрузки значений на шины нужно делать не обычное присваивание типа SB = X, а применять следующий трюк : |
<code c> | <code c> | ||
Строка 55: | Строка 95: | ||
</code> | </code> | ||
- | В результате чего разрешаются возможные конфликты шин. | + | В результате чего единичные разряды шины разрядятся и возможные конфликты шины будут устранены. |
+ | |||
+ | ## Курица или яйцо? | ||
+ | |||
+ | Теоретически в процессоре 6502 могут быть установлены одновременно команда выдачи регистра на шину и команда загрузки того же самого регистра из шины (например X/SB и SB/X). | ||
+ | |||
+ | {{6502:regs_nice_flow.jpg}} | ||
+ | |||
+ | Поэтому возникает резонный вопрос : что делать вначале - помещать регистр на шину (X/SB) или | ||
+ | загружать его (SB/X) ? | ||
+ | |||
+ | В данном случае транзисторы-ключи X/SB и SB/X будут открыты и получается что значение триггера просто "рефрешится" через шину. | ||
+ | |||
+ | По договоренности при симуляции триггеров значение с них вначале выдается потребителям, а потом загружается новое значение. | ||
+ | |||
+ | Поэтому команды выгрузки регистра на шину нужно делать перед командами загрузки новых значений. | ||
+ | |||
+ | Аналогичная ситуация может произойти например при выполнении инструкции TXS (поместить значение регистра X на регистр S). В этом случае рандомная логика выдаст две команды : X/SB и SB/S. При этом X/SB должна выполниться раньше SB/S, чтобы значение регистра X попало на шину SB, а с неё на регистр S. | ||
+ | |||
+ | {{template>6502:6502_blocks}} |