Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
6502 [2015/09/03 23:15]
org
6502 [2018/11/27 09:36] (текущий)
org
Строка 1: Строка 1:
-====== ​6502 ======+6502
  
 Процессор 6502 был разработан компанией [[MOS]] в 197-бородатом году. За основу была положена архитектура процессора Motorolla 6800: Процессор 6502 был разработан компанией [[MOS]] в 197-бородатом году. За основу была положена архитектура процессора Motorolla 6800:
Строка 6: Строка 6:
 (видно что в обоих случаях верхнюю часть занимает декодер и рандомная логика,​ а всю нижнюю часть процессора занимает контекст) (видно что в обоих случаях верхнюю часть занимает декодер и рандомная логика,​ а всю нижнюю часть процессора занимает контекст)
  
-====== ​Описание внутренней архитектуры процессора 6502 ======+## Описание внутренней архитектуры процессора 6502
  
-Процессор делится на 2 части : верхняя и нижняя.+Процессор делится на 2 части: верхняя и нижняя.
  
 В верхней части находится управляющая часть, которая выдает ряд контрольных линий ("​команд"​) для управления нижней частью.\\ В верхней части находится управляющая часть, которая выдает ряд контрольных линий ("​команд"​) для управления нижней частью.\\
-В нижней части находится контекст процессора : внутренние шины и регистры,​ с одним исключением - регистр флагов (P) находится в верхней части в "​размазанном"​ виде.+В нижней части находится контекст процессора:​ внутренние шины и регистры,​ с одним исключением - регистр флагов (P) находится в верхней части в "​размазанном"​ виде.
  
 Работа процессора тактируется тактовым импульсом PHI0, при этом используются оба полутакта. Работа процессора тактируется тактовым импульсом PHI0, при этом используются оба полутакта.
Строка 17: Строка 17:
 Во время второго полутакта (PHI2) процессор находится в режиме "​слушаю",​ во время этого полутакта внешние устройства могут помещать данные на шину данных,​ чтобы процессор их "​обработал"​. Во время второго полутакта (PHI2) процессор находится в режиме "​слушаю",​ во время этого полутакта внешние устройства могут помещать данные на шину данных,​ чтобы процессор их "​обработал"​.
  
-====== ​Регистры ​======+## Регистры
  
-  * PD : текущее значения кода операции для предекодирования +  * PD: текущее значения кода операции для предекодирования 
-  * IR : регистр инструкций (хранит код текущей операции) +  * IR: регистр инструкций (хранит код текущей операции) 
-  * X, Y : индексные регистры+  * X, Y: индексные регистры
   * S: указатель стека   * S: указатель стека
-  * AI, BI : входные значения для АЛУ +  * AI, BI: входные значения для АЛУ 
-  * ADD : промежуточный результат операции на АЛУ +  * ADD: промежуточный результат операции на АЛУ 
-  * AC : аккумулятор +  * AC: аккумулятор 
-  * PCH/PCL : program counter, состоящий из 2-х половинок +  * PCH/PCL: program counter, состоящий из 2-х половинок 
-  * PCHS/PCLS : вспомогательные регистры program counter (S означает "​set"​ (?)) +  * PCHS/PCLS: вспомогательные регистры program counter (S означает "​set"​ (?)) 
-  * ABH/ABL : регистры для вывода на внешнюю шину адреса +  * ABH/ABL: регистры для вывода на внешнюю шину адреса 
-  * DL : data latch, хранит последнее прочитанное значение внешней шины данных +  * DL: data latch, хранит последнее прочитанное значение внешней шины данных 
-  * DOR : data output register, содержит значение которое будет записано в шину данных +  * DOR: data output register, содержит значение которое будет записано в шину данных 
-  * P : регистр флагов,​ на самом деле состоит из множества разбросанных по схеме защелок+  * P: регистр флагов,​ на самом деле состоит из множества разбросанных по схеме защелок
  
-Непосредственно программисту доступны следующие регистры : A (аккумулятор),​ X, Y, S, P, PC.+Непосредственно программисту доступны следующие регистры:​ A (аккумулятор),​ X, Y, S, P, PC.
  
-====== ​Внешние шины ​======+## Внешние шины
  
-Внешних шин всего две : 16-разрядная адресная (ADDR) и 8-разрядная шина данных (DATA). Адресная шина односторонняя - писать в неё может только процессор. Шина данных двунаправленная.+Внешних шин всего две: 16-разрядная адресная (ADDR) и 8-разрядная шина данных (DATA). Адресная шина односторонняя - писать в неё может только процессор. Шина данных двунаправленная.
  
-====== ​Внутренние шины ​======+## Внутренние шины
  
-  * ADH/ADL : шина адреса +  * ADH/ADL: шина адреса 
-  * SB : special bus, шина для обмена регистрами +  * SB: special bus, шина для обмена регистрами 
-  * DB : внутренняя шина данных+  * DB: внутренняя шина данных
  
 Во время второго полутакта (PHI2) все внутренние шины подзаряжаются и имеют значение 0xff. Сделано это по причине того, что "​разрядить"​ транзистор в нужный момент получается быстрее,​ чем "​зарядить"​ (смена значения 1=>0 происходит быстрее,​ чем смена 0=>1). Во время второго полутакта (PHI2) все внутренние шины подзаряжаются и имеют значение 0xff. Сделано это по причине того, что "​разрядить"​ транзистор в нужный момент получается быстрее,​ чем "​зарядить"​ (смена значения 1=>0 происходит быстрее,​ чем смена 0=>1).
  
-====== ​Соединения регистров с шинами ​======+## Соединения регистров с шинами
  
 {{6502:​6502_context.jpg?​900}} {{6502:​6502_context.jpg?​900}}
Строка 53: Строка 53:
 Последовательно соединяя шины и регистры процессор выполняет разнообразные инструкции. Многообразие соединений обеспечивает разнообразие команд процессора,​ а разделение команд на такты позволяет выполнять сложные действия. Дополнительно производится управление АЛУ (сложение,​ логическое-И и пр.) Последовательно соединяя шины и регистры процессор выполняет разнообразные инструкции. Многообразие соединений обеспечивает разнообразие команд процессора,​ а разделение команд на такты позволяет выполнять сложные действия. Дополнительно производится управление АЛУ (сложение,​ логическое-И и пр.)
  
-====== ​Режимы адресации 6502 ======+## Режимы адресации 6502
  
 **Адресация** - это способ доставить операнд в нужное место памяти (или загрузить его оттуда). Разработчики 6502 были очень щедрыми и добавили в контекст ажно два индексных регистра X и Y. **Адресация** - это способ доставить операнд в нужное место памяти (или загрузить его оттуда). Разработчики 6502 были очень щедрыми и добавили в контекст ажно два индексных регистра X и Y.
Строка 66: Строка 66:
   * Zero page Indexed ​ (индексная адресация на нулевой странице) : аналогично индексной,​ но использовать можно только регистр X. Пример **LDA $33, X** : A = [$0033 + X]   * Zero page Indexed ​ (индексная адресация на нулевой странице) : аналогично индексной,​ но использовать можно только регистр X. Пример **LDA $33, X** : A = [$0033 + X]
  
-Ну а дальше начинается особенная магия :+Ну а дальше начинается особенная магия:
   * Pre-indexed indirect (косвенная с пре-индексацией) : Значение операнда,​ который является адресом в нулевой странице складывается со значением регистра X и получается косвенный адрес. Затем по адресу,​ на который ссылается косвенный адрес, получается значение операнда. Пример **LDA ($34, X)** : A = %%[[$0034 + X]]%%. Важно : при сложении адреса и значения в регистре X происходит "​заворачивание"​ вокруг 256 байт. То есть перенос в старшую половину адреса не происходит. ( 0xFF + 0x02 будет равно 0x0001, а не 0x0101). **Косвенная** означает "​взять адрес по адресу"​.   * Pre-indexed indirect (косвенная с пре-индексацией) : Значение операнда,​ который является адресом в нулевой странице складывается со значением регистра X и получается косвенный адрес. Затем по адресу,​ на который ссылается косвенный адрес, получается значение операнда. Пример **LDA ($34, X)** : A = %%[[$0034 + X]]%%. Важно : при сложении адреса и значения в регистре X происходит "​заворачивание"​ вокруг 256 байт. То есть перенос в старшую половину адреса не происходит. ( 0xFF + 0x02 будет равно 0x0001, а не 0x0101). **Косвенная** означает "​взять адрес по адресу"​.
   * Post-indexed indirect (косвенная с пост-индексацией) : Отличается от предыдущей тем, что вначале выбирается косвенный адрес из нулевой страницы,​ а затем к нему добавляется значение индексного регистра Y. Пример **LDA ($2A), Y** : A = %%[[$002A] + Y]%%.   * Post-indexed indirect (косвенная с пост-индексацией) : Отличается от предыдущей тем, что вначале выбирается косвенный адрес из нулевой страницы,​ а затем к нему добавляется значение индексного регистра Y. Пример **LDA ($2A), Y** : A = %%[[$002A] + Y]%%.
  
-====== ​Набор инструкций ​======+## Набор инструкций
  
 6502 обладает всеми необходимыми инструкциями,​ а также включает в себя такие достаточно удобные инструкции как ротация бит (ROL/ROR) и тестирование разряда (BIT). Не все процессоры того времени содержали такие операции. 6502 обладает всеми необходимыми инструкциями,​ а также включает в себя такие достаточно удобные инструкции как ротация бит (ROL/ROR) и тестирование разряда (BIT). Не все процессоры того времени содержали такие операции.
Строка 142: Строка 142:
 |00|[[6502:​BRK-00|BRK impl]]|[[6502:​ORA-01|ORA X,​ind]]|[[6502:​NI-02|Not impl.02]]|[[6502:​NI-03|Not impl.03]]|[[6502:​NI-04|Not impl.04]]|[[6502:​ORA-05|ORA zpg]]|[[6502:​ASL-06|ASL zpg]]|[[6502:​NI-07|Not impl.07]]|[[6502:​PHP-08|PHP impl]]|[[6502:​ORA-09|ORA #​]]|[[6502:​ASL-0A|ASL A]]|[[6502:​NI-0B|Not impl.0B]]|[[6502:​NI-0C|Not impl.0C]]|[[6502:​ORA-0D|ORA abs]]|[[6502:​ASL-0E|ASL abs]]|[[6502:​NI-0F|Not impl.0F]]| |00|[[6502:​BRK-00|BRK impl]]|[[6502:​ORA-01|ORA X,​ind]]|[[6502:​NI-02|Not impl.02]]|[[6502:​NI-03|Not impl.03]]|[[6502:​NI-04|Not impl.04]]|[[6502:​ORA-05|ORA zpg]]|[[6502:​ASL-06|ASL zpg]]|[[6502:​NI-07|Not impl.07]]|[[6502:​PHP-08|PHP impl]]|[[6502:​ORA-09|ORA #​]]|[[6502:​ASL-0A|ASL A]]|[[6502:​NI-0B|Not impl.0B]]|[[6502:​NI-0C|Not impl.0C]]|[[6502:​ORA-0D|ORA abs]]|[[6502:​ASL-0E|ASL abs]]|[[6502:​NI-0F|Not impl.0F]]|
  
-====== ​Прерывания ​======+## Прерывания
  
 Всего у 6502 существует четыре типа прерываний:​ Всего у 6502 существует четыре типа прерываний:​
Строка 150: Строка 150:
   * BRK: программное прерывание. Инициируется инструкцией [[6502:​brk-00|BRK]].   * BRK: программное прерывание. Инициируется инструкцией [[6502:​brk-00|BRK]].
  
-====== ​Verilog ​======+## Verilog
  
 <code verilog> <code verilog>
  • Показать страницу