§ Введение
Мне нравится этот процессор. Он простой, у него хорошая система команд, на нём были созданы первые Apple, и конечно же, NES (Dendy, Subor и прочие клоны). На нем сложно программировать, не спорю. Но мне нравится процессор сам по себе из-за его простоты. Он обладает несложной системой команд и небольшим количеством регистров: A (аккумулятор), X, Y, P (флаги), S (стек) и PC (счетчик команд). Все регистры, за исключением PC - 8 битные. Регистры процессора можно посмотреть здесь. Несмотря на небольшие возможности, но этом процессоре создавались впечатляющие вещи, игры, что угодно. Размер памяти не превышает 64Кб из-за его 16-битной адресации, но благодаря смене банков в картриджах NES можно было адресовать сколько угодно большой объем.§ Методы адресации по маскам
В процессоре 6502 при чтении опкода дешифруются сперва метод адресации операнда, иными словами, номер опкода содержит не только то, что он будет исполнять, а еще и откуда берет операнд, откуда получает данные. Данные могут получаться разными способами, их в целом, 13 разновидностей.xxx_000_x1: NDX Indirect,X xxx_010_x1: IMM Immediate 1xx_000_x0: IMM Immediate xxx_100_x1: NDY Indirect,Y xxx_110_x1: ABY Absolute,X xxx_001_xx: ZP_ ZeroPage xxx_011_xx: ABS Absolute 001_000_00: ABS Absolute 10x_101_1x: ZPY ZeroPage,Y xxx_101_xx: ZPX ZeroPage,X 10x_111_1x: ABY Absolute,Y xxx_111_xx: ABX Absolute,X xxx_100_00: REL Relative 0xx_010_10: ACC Accumulator default: IMP ImpliedМаски здесь означают то, какие биты значащие, какие нет, и как их читать. Читается сверху вниз. Допустим, у нас есть опкод 11011001, или B9h. Начинаем читать сверху вниз
110_110_01 и xxx_000_x1
, первые три бита не проверяем, проверяем 110 и 000 - не совпало110_110_01 и xxx_010_x1
, 110 != 010, не подходит110_110_01 и 1xx_000_x0
, 110 != 000, не подходит110_110_01 и xxx_100_x1
, 110 != 100, не подходит110_110_01 и xxx_110_x1
, 110 == 110, совпало, потом бит не проверяем, и 1=1, тоже совпалоЗначит, что опкод B9h использует метод адресации "Absolute,X". По обозначениям методов адресации я уже писал ранее.
§ Инструкции
Всего существует 56 разных инструкции и они детально описаны вот здесь, поэтому рассказывать о них подробно не буду. Некоторые инструкции можно объединить по маскам, как и методы адресации. Например???xxx01 0=ORA, 1=AND, 2=EOR, 3=ADC, 4=STA, 5=LDA, 6=CMP, 7=SBC
Вместо символов ??? содержится номер АЛУ-операции от 0 до 7, которая должна выполниться. Там где xxx - это номер метода адресации, они все описаны выше. Единственным исключением будет являться инструкция
STA imm
, поскольку такая инструкция ошибочная и не должна сработать. Хотя, она наверняка сработает, но, при этом, запишет значение прямо в код. Я не уверен, что это правильно и что процессор реально так работает. Это надо проверять на реальном процессоре, которого у меня нет.000xxx10 ASL Логический сдвиг операнда влево, или умножение на 2 001xxx10 ROL Сдвиг влево с заемом из флага C 010xxx10 LSR Логический сдвиг вправо, или беззнаковое деление на 2 011xxx10 ROR Сдвиг вправо через с заемом из CОднако стоит сказать, что методы адресации тут не все поддерживаются. К примеру IMM здесь работать на будет, как и многие другие. Странно, что их не реализовали, это было бы удобно, да и не тратило бы места на кристалле, как по мне, это архитектурное упущение.
xxx_100_00 Bcc b8 Условный переход по относительному адресу -128..127Вот еще один пример группировки инструкции. В старших двух битах записан номер проверяемого флага {00=N, 01=V, 10=C, 11=Z}, а в бите 5 находится проверяемое условие. Допустим опкод
010_100_00
отвечает за BVC. Здесь старшие 2 бита это "01" это V, в бите 5 находится значение 0. Это значит, что если V=0, то тогда будет выполнен условный переход.Допустим, надо найти опкод, чтобы условный переход выполнялся если будет C=1, то тогда, по таблице C это "10", а при C=1 надо будет установить бит 5 равным 1, итого получается опкод "101_100_00" или инструкция BCS.