Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly NES(6502组件)精灵运动_Assembly_Sprite_6502_Nes - Fatal编程技术网

Assembly NES(6502组件)精灵运动

Assembly NES(6502组件)精灵运动,assembly,sprite,6502,nes,Assembly,Sprite,6502,Nes,我目前正在开发一款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 p

我目前正在开发一款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的内容,而不是在其中放置我选择的值。我不知道如何使我的精灵移动。

在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
等,不能在
X
Y

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


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

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


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

递增寄存器意味着向其添加一个。指令没有增量,但指令有一个add。你也可以使用有递增指令的X或Y寄存器。你可以直接加内存地址,例如,
INC$0200。
我想让我的精灵移动,所以是的,我需要更改/写回寄存器,使它移动(我没想过).我不太清楚怎么做?谢谢如果你使用
INC$200
,它发生在适当的位置:读取当前$200的值,再将一个(mod 256)写回$200,这样就完成了。如果将其加载到A,则在修改后,必须使用
STA
将其写回$200,因此您的代码将为:
LDA$200;计算一个新的值;STA$200
。谢谢你的回答。我不知道怎么了。我试过了,但仍然没有移动。精灵Y的位置总是写在$200地址,对吗?我不明白为什么它不增加它并使它移动。我在“NMI:”部分写代码。我认为你使用了错误的内存地址——据我所知,$200完全在正常的CPU RAM中。也许你需要四处看看?我应该补充一点,我从来没有编程过一个NES,所以以上只是粗略浏览一下NES开发维基。
INC $200