§ Введение

Мне нравится этот процессор. Он простой, у него хорошая система команд, на нём были созданы первые 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.
7 окт, 2020
© 2007-2022 Все дрова ништяково колючие