gpt4 book ai didi

assembly - 在 Commodore 64 上动态更新图 block 数据的更好方法

转载 作者:行者123 更新时间:2023-12-02 21:52:11 24 4
gpt4 key购买 nike

我计划在我的新 C64 项目中使用多色字符模式下的软件 Sprite 。我的想法是使用叠加“子弹” Sprite 数据来平铺数据。

我想我可以在地址“TILESET”处拥有tileset数据,在地址“SPRITE”处拥有 Sprite 数据。我可以将这两者结合起来准备一个具有动态计算背景的子弹字符并存储在地址“SUPERIMPOSED”中

我编写了以下代码和循环计数来检查是否可行。我认为事实并非如此。该循环消耗了 219 个周期。近四条光栅线。而且我没有包含此循环之前所需的其他必要计算。就像目标地址的计算一样。

当我想在屏幕上显示 16 个项目符号时,需要 64 个光栅或 8 个字符行。所以我开始怀疑。这是正确的方法吗?或者还有其他更优化的方法来完成同样的工作吗?

                         cycles
---------
ldy #$07 4 x1 = 4
- LDA TILESET,x 3 x8 = 24
AND SPRITE,x 4 x8 = 32
STA SUPERIMPOSED,x 5 x8 = 40
dey 2 x8 = 16
cpy 4 x8 = 32
bne - 3 x8-1 = 71
----------
219 Cycle

我正在考虑在背景中有重复的图案。这样我就可以使用相同的子弹图 block 而无需重新计算。

最佳答案

正如 Jester 建议的那样,作为第一个优化,只需重复 ldaandstadey 八个次。消除cpybne。这将立即节省 103 个周期。即使您想保留正式循环,请注意 dey 设置了零标志,因此您不需要 cpy

作为第二个优化,请考虑编译 Sprite 。您无需从 sprite, x 执行读取,而是将这些值直接编码到您的例程中,为每个 sprite 制定一个不同的例程。这将又减少 16 个周期。

话虽如此,您的 lda 在对齐表中将是 4 个周期,而不是 3 个。因此,您还没有考虑到 8 个周期。这意味着展开加上专门针对您的 Sprite = 102 个周期(省略了最后的 dey)。

在不了解 C64 架构和/或其余代码的作用的情况下,如果任何提取 SUPERIMPOSED 的人都可以从堆栈页执行此操作,请考虑将输出写入堆栈而不是通过索引寻址。只需使用适当的种子值加载 s 并通过 pha 存储新结果。这将为每个商店节省两个周期,但需要额外 12 个设置和恢复周期。

根据这个想法,如果您可以自由选择这些表的外观,那么请考虑切换它们的格式 - 不要用一个表来保存 TILESET 的所有八个字节,而是使用八个表,每个表都包含保存其中的一个字节。这样就无需在循环中调整 y 了;只需在每个展开的迭代中使用不同的目标表即可。

假设 TILESETSUPERIMPOSED 都是八个表,那么您可以得出:

LDA TILESET1, x
AND #<value>
STA SUPERIMPOSED1, x ; * 8

[... LDA TILESET2, x ...]

...总共 88 个周期。如果 SUPERIMPOSED 是线性的,但位于堆栈页面中,则:

TSX
TXA
LDX #newdest
TXS
TAX ; adds 10

LDA TILESET1, y
AND #<value>
PHA ; * 8

[... LDA TILESET2, y ...]

TXS ; adds 2

...这是 84 个周期。

后期添加:

如果您愿意将 x 中的索引预乘 8,从而有效地将可索引范围减少到 32 个图 block ,那么您可以继续填充线性输出数组,而无需调整 y,如下所示:

LDA TILESET, x
AND #<value1>
STA SUPERIMPOSED, x

LDA TILESET+1, x
AND #<value2>
STA SUPERIMPOSED+1, x

... etc ...

因此,您需要该例程的八个副本,具有不同的表基地址,仍然能够命中 256 个输出 block 。假设您有 20 个 Sprite ,则总共会生成 20*8 = 160 个 Sprite 绘图例程副本,每个副本可能约为 100 字节,因此您将花费大约 16kb。

如果您的游戏在一种 Sprite 上比在其他 Sprite 上重得多 - 例如通常是两到三艘宇宙飞船互相发射数千颗子弹 - 那么显然你可以非常有选择地进行优化并减少总足迹。

关于assembly - 在 Commodore 64 上动态更新图 block 数据的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32806395/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com