6502 косвенных решения вопросов

У меня возникли проблемы со следующим кодом для машины 6502:

C000 LDA #$00
C002 STA $FE
C004 LDA #$20
C006 STA $FF
C008 LDY #$08
C00A LDX #$00
C00C DEY
C00D CPY #$FF
C00F BEQ $C01B
C011 LDA ($FE),Y
C013 CMP #$2F
C015 BPL $C00C
C017 INX
C018 JMP $C00C
C01B BRK

Упражнение состоит в том, чтобы сохранить числа 2, 1 и 4, начиная с адреса 2000, и сказать, каковы значения A, X и Y.

Я "запускаю" свой код с ручкой и бумагой, но я застрял на C011 по следующей причине:
LDA ($FE),Y
Он загружает в A значение, сохраненное по адресу памяти, рассчитанному таким образом:

  1. выбирать $FE значение (это сначала 00)
  2. Добавьте значение Y (которое на первой итерации равно 7)
  3. У меня сейчас 07
  4. Нагрузка A со значением, хранящимся в 07

Это правильно? Я что-то пропустил? Если я не, где я могу использовать значения, хранящиеся в 20002001 а также 2002?

Заранее спасибо..

3 ответа

Решение

Нет, вы не правы. Вы упускаете смысл LDA ($FE),Y который использует косвенный индексированный (в отличие от индексированного косвенного) режим адресации. Косвенный означает, что значение в скобках - это адрес 16-битного указателя, младший байт - первый. Это $00 и $20, которые вы установили ранее, то есть $2000.

Индексация выполняется с помощью Y, и ваше условие выхода из цикла основано на Y, так что у вас это есть. Значение A является последним прочитанным значением, так что у вас это тоже есть.

Но ваш комментарий и вопрос об ответе Weather Vane очень важны. Значения в других местах памяти имеют значение из-за CMP #$2F и последующее BPL а также INX, CMP действует как вычитание, и флаг N устанавливается, если сравниваемый регистр <сравниваемая память; смотрите здесь.

Таким образом, значение X зависит от этих других значений памяти.

выбрать значение $FE (сначала это 00)

На самом деле, он загружает 16-битное значение из $FE, а затем добавляет Y на это значение, чтобы получить эффективный адрес.

Вы сохранили $00 в $FE а также $20 в $FF Таким образом, 16-битное значение загружается из $FE будет $2000

где я могу использовать значения, хранящиеся в 2000, 2001 и 2002 годах

когда Y имеет значения 0, 1 и 2. Цикл будет продолжаться до Y оборачивается от 0 до $FF.


См. "10) Постиндексированный косвенный" в 6502.txt.

Этот режим адресации называется пост-индексированным косвенным и используется только с Y регистр. Эффективный адрес формируется из (little-endian) содержимого адреса $00FE а также $00FF а также Y добавляется к этому адресу.

Вы сохранили $2000 в этих двух местах нулевой страницы, и Y держит 7 поэтому эффективный адрес $2007за пределами трех байтов данных, к которым вы хотите получить доступ.

Обратите внимание, что мог получить доступ к массиву напрямую как

LDA $2000,Y

но преимущество косвенного метода заключается в том, что вам не нужно заранее знать адрес, например, вы можете выбрать одну из нескольких таблиц для индексации в зависимости от условий выполнения.

Другие вопросы по тегам