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 значение, сохраненное по адресу памяти, рассчитанному таким образом:
- выбирать
$FE
значение (это сначала 00) - Добавьте значение Y (которое на первой итерации равно 7)
- У меня сейчас 07
- Нагрузка A со значением, хранящимся в 07
Это правильно? Я что-то пропустил? Если я не, где я могу использовать значения, хранящиеся в 2000
2001
а также 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
но преимущество косвенного метода заключается в том, что вам не нужно заранее знать адрес, например, вы можете выбрать одну из нескольких таблиц для индексации в зависимости от условий выполнения.