2

我目前正在开发 NES(6502) 组装游戏,但我不明白如何进行精灵移动。以下是我认为它应该如何工作的方式:

(loop)
LDA $200 ;will load into the A register the content of address $200,wich contain the Y position of my sprite
INA ;Increment the A register which would increment the content of A which is the Y position of my sprite..?

但是,您似乎无法增加 A 寄存器累加器,因为在尝试使用 INA 指令进行汇编时出现错误。所以我有点迷失了。我应该使用 STA 代替 LDA 吗?但我想使用地址 $200 的内容,而不是在其中放置我选择的值。我不知道如何让我的精灵移动。

4

3 回答 3

5

NES 中使用的 6502 变体确实没有INA可用的。A您可以使用以下一对指令递增1:

CLC     ; Clear carry
ADC #1  ; A = A + 1 + carry = A + 1

或者,如果任一索引寄存器是免费的,您可以使用:

LDX $200  ; or LDY
INX       ; or INY

但请记住,其他算术运算(如ADC, SBC,LSR等)不能在Xor上执行Y

于 2015-10-19T19:45:46.440 回答
3

如果图形芯片在 200 美元中查找精灵位置,那么您需要在计算后写回修改后的值。如果您只想增加它,您可以使用绝对寻址模式直接执行INC

INC $200

将增加存储在 $200 中的任何值,而不更改任何寄存器值。

于 2015-10-20T02:54:22.973 回答
2

请记住,通常游戏不会直接编辑精灵。更新精灵位置的常用方法是首先更新对象的位置,然后使用精灵构造函数子例程将每个 8x8 精灵组装到相对于对象位置的正确位置。您可以有一个表格来列出所有精灵。该列表指定了该精灵的平铺和相对偏移量,因此您只需将其添加到对象位置即可获取写入下一个空闲 OAM 插槽的精灵的位置。

然后在 NMI 开始时,您使用 OAMDA 将“影子 OAM”(通常在第 2 页)复制到 PPU。游戏通常不使用 OAMADDR 和 OAMDATA,因为它们可能会损坏 OAM 数据。

于 2019-10-19T20:17:57.593 回答