Я всегда считал эту пару инструкций чем-то вроде мошенничества. На исходном 6502 нет арифметических сдвигов вообще. Арифметические сдвиги сохраняют знак смещаемого числа, и так называемый ASL
делает это только благодаря тому факту, что 6502 использует дополнение 2.
Исходный 6502 имеет только две операции сдвига: сдвиг вправо и сдвиг влево со смещенным битом, идущим к флагу переноса, и смещенный бит при установке в ноль. Для сдвигов, оставленных с дополнением 2, нет различий между арифметическим и логическим. Однако, для сдвигов вправо, арифметический сдвиг должен сохранять знаковый бит. Это означает, что для этого вам понадобится схема для передачи верхнего бита входа в сдвиг к верхнему биту выхода и дополнительная управляющая линия для выбора между этим значением и 0. Для всех этих параметров требуется больше транзисторов, и арифметический сдвиг может быть смоделированным с вращением.
CLC
LDA number
BPL positive
SEC
positive:
ROR A
Основной движущей силой дизайна 6502 было превзойти Motorola 6800 по более низкой цене. Это было сделано путем удаления из 6800 несущественных элементов, чтобы они могли сделать подсчет транзисторов как можно ниже. 6502 имеет количество транзисторов около 3500. Более ранние 6800 имеют количество транзисторов около 4500. Таким образом, были исключены несущественные признаки, такие как правильное арифметическое смещение.
На самом деле, учитывая, что смены можно эмулировать, сняв флаг переноса и затем сделав поворот, я удивлен, что они вообще с ними обеспокоены. Разработчики, должно быть, обнаружили, что могут добавлять инструкции сдвига с минимальным увеличением сложности, так же, как инструкция SBC
точно такая же, как инструкции ADC
, но с инвертированными битами второго операнда.