NES(6502汇编)精灵运动

时间:2015-10-19 19:24:22

标签: assembly sprite 6502

我目前正在制作NES(6502)组装游戏,但我不明白如何制作精灵。我认为它应该如何运作:

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

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

谢谢!

3 个答案:

答案 0 :(得分:4)

在NES中使用的6502的变体上确实没有INA可用。您可以使用以下一对说明将A增加1:

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

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

LDX $200  ; or LDY
INX       ; or INY

请记住,ADCSBCLSR等其他算术操作不能在X或{{0}}上执行{1}}。

答案 1 :(得分:2)

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

INC $200

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

答案 2 :(得分:1)

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

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