7

Я читаю о наборе инструкций процессора 6502 по многим ссылкам на 6502.org, и в одном из них говорится:

Указатель стека (S) указывает на байт на странице 1, то есть на байт, адрес которого от 0100 до 01FF, где последние две цифры поставляются S. Когда байт помещается в стек, он записывается по адресу в S, а затем S уменьшается.

Регистр S составляет 1 байт, поэтому он, очевидно, содержит значение от 00 до FF, но, поскольку он уменьшается при нажатии, когда ничего еще не было нажато, он должен начинаться с FF. Устанавливает ли физическое оборудование (транзисторы) в чипе все биты в этом регистре в «1», когда чип получает свое первое дыхание?

Мне просто нравится знать детали низкого уровня.

4 ответа4

3

Если вы посмотрите презентацию Майкла Стейла о реверс-инжиниринге 6502 (http://www.youtube.com/watch?v=fWqBmmPQP40), вы увидите около 42:15, что он объясняет, что происходит, когда происходит СБРОС. Как часть обработки RESET, 6502 фактически выдвигает значения ПК и P. Указатель стека начинается с 0x100 и после нажатия этих трех байтов заканчивается 0x1fd из-за этого.

3

Каждый ПЗУ на основе 6502 и совместимого кода, который я когда-либо видел, инициализирует указатель стека (LDX #$FF , TXS) во время процедуры RESET. Ты тоже должен.

Это возможно позже 6502 ревизий (то есть 65C02 в Apple II) действительно инициализируют его, а также 65816 16-битных вариантов и позже.

Я бы поспорил значительно это .S - это случайное значение при включении питания на исходных 6502 и 6510 на Commodore 64, и, возможно, даже на 2A07 в NES.

Обычно любая процедура сброса 6502 также начинается со следующих, как правило, первых двух инструкций:

SEI ;disable interrupts (set interrupt disable flag)
CLD ;turn decimal mode off
2

http://forum.6502.org/viewtopic.php?t=468&sid=ccdf15a560f1520a347ba896ae89767f утверждают, что он не указан.

http://whats.all.this.brouhaha.com/2011/07/07/stack-usage-in-the-apple-1-monitor/ также утверждает, что он не указан и, кроме того, что это не имеет значения, если вы не волнует точное положение стека на этой странице. Где бы он ни начался, он будет округлен, так что пока вы не используете более 256 байтов стека, все будет в порядке.

http://visual6502.org/JSSim/, который представляет собой имитацию транзисторного уровня реального оборудования, похоже, загружается с SP, установленным в FD; Вы могли бы, вероятно, отследить фактические регистры там и определить, является ли это преднамеренным или просто совпадением.

(В этом контексте "монитор" означает программу управления низкого уровня, а не дисплей)

0

Для программных приложений это обычно не имеет значения. Если ваша программа не вернется к основному, вы можете сделать, как было сказано выше, то есть самостоятельно взять под контроль SP. Если вы вернетесь к основному, то вы должны быть уверены, что вернетесь со стеком в том же состоянии, в котором он находился до запуска вашей программы, иначе BASIC потерпит крах.

Ответ Снарфблама, приведенный выше, технически вводит в заблуждение, во-первых, потому что "чтение второго локального" не имеет конкретного значения, а также потому, что с TSX, LDA $ 00FF, X никогда не будет LDA с любого адреса выше $ 01FE, так как максимальное значение для X составляет $ FF: $ 00FF + FF = $ 01FE. Также, если вы хотите, чтобы аккумулятор считывал предыдущее значение, помещенное в стек, PLA будет достаточно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .