6502 间接寻址问题

6502 indirect addressing issues

我在使用 6502 机器的以下代码时遇到了一些问题:

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

练习题是从地址2000开始存储数字2、1、4,并说出A、X、Y的值是多少

我 "running" 我用笔和纸写代码,但我卡在了 C011,原因如下:
LDA ($FE),Y
它在 A 中加载存储在以这种方式计算的内存地址中的值:

  1. 选择$FE值(一开始是00)
  2. 添加 Y 的值(第一次迭代时为 7)
  3. 我现在有 07
  4. 用存储在 07 的值加载 A

这是正确的吗?我错过了什么吗? 如果我不是,我在哪里使用存储在 2000 20012002 中的值?

提前致谢..

pick $FE value (that at first is 00)

实际上,它从$FE加载一个16位的值,然后将该值加上Y得到有效地址。

您已将 [=12=] 存储在 $FE 并将 </code> 存储在 <code>$FF,因此从 $FE 加载的 16 位值将是 00

where do I use the values stored in 2000 2001 and 2002

Y 的值为 0、1 和 2 时。循环将继续,直到 Y 从 0 循环到 $FF。


参见 “10) Post-索引间接” 6502.txt

这种寻址方式称为post-indexed indirect,仅用于Y寄存器。有效地址由地址 [=12=]FE[=13=]FF 的(小端)内容构成,并且 Y 添加到该地址。

您将 00 存储在这两个零页位置,并且 Y 存储 7 因此有效地址是 07,超出了您希望的三个字节数据访问。

请注意,可以直接访问数组

LDA 00,Y

但间接方法的优点是您不需要提前知道地址,例如您可以 select 根据 运行- 要索引的几个表之一时间条件。

不,你不对。您错过了 LDA ($FE),Y 的含义,它使用 indirect indexed (而不是索引间接)寻址模式。间接表示括号内的值是一个 16 位指针的地址,低字节在前。那是你之前设置的 $00 和 $20,所以 $2000。

索引是用 Y 完成的,你的循环退出条件是基于 Y 的,所以你有那个。 A 的值是最后读取的值,所以你也有。

但是您对 Weather Vane 的回答的评论和问题非常相关。由于 CMP #F 以及随后的 BPLINX,其他内存位置中的值很重要。 CMP 就像一个减法,如果比较寄存器 < 比较内存,则设置 N 标志; see here.

所以 X 的值取决于其他内存值。