- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我计划在我的新 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 建议的那样,作为第一个优化,只需重复 lda
、and
、sta
和 dey
八个次。消除cpy
和bne
。这将立即节省 103 个周期。即使您想保留正式循环,请注意 dey
设置了零标志,因此您不需要 cpy
。
作为第二个优化,请考虑编译 Sprite 。您无需从 sprite, x
执行读取,而是将这些值直接编码到您的例程中,为每个 sprite 制定一个不同的例程。这将又减少 16 个周期。
话虽如此,您的 lda
在对齐表中将是 4 个周期,而不是 3 个。因此,您还没有考虑到 8 个周期。这意味着展开加上专门针对您的 Sprite = 102 个周期(省略了最后的 dey
)。
在不了解 C64 架构和/或其余代码的作用的情况下,如果任何提取 SUPERIMPOSED
的人都可以从堆栈页执行此操作,请考虑将输出写入堆栈而不是通过索引寻址。只需使用适当的种子值加载 s
并通过 pha
存储新结果。这将为每个商店节省两个周期,但需要额外 12 个设置和恢复周期。
根据这个想法,如果您可以自由选择这些表的外观,那么请考虑切换它们的格式 - 不要用一个表来保存 TILESET
的所有八个字节,而是使用八个表,每个表都包含保存其中的一个字节。这样就无需在循环中调整 y 了;只需在每个展开的迭代中使用不同的目标表即可。
假设 TILESET
和 SUPERIMPOSED
都是八个表,那么您可以得出:
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/
我在 commodore 64 模拟器上输入了“hello world”。我必须把它打印成 Hello World Hello World Hello World 我怎样才能只使用一个打印语句来做到这
Closed. This question is off-topic。它当前不接受答案。 想改善这个问题吗? Update the question,因此它是on-topic,用于堆栈溢出。 已关闭8
所以,我想在 Commodore 64 BASIC 中编写更大的函数。到目前为止,从我从其他来源(例如各种 C64 wiki 以及 C64 本身的用户手册)看到的内容来看,函数定义只能是一行。 也就是
我知道这个问题是非常特殊的问题,但我知道这里有一些 c64 代码大师。所以,这是我的问题。 当我尝试使用 $d011 技巧禁用屏幕时,上/下边框也会打开。我想在不打开上/下边界的情况下做到这一点。是否
我正在尝试学习如何使用以下内核例程写入磁盘文件 Codebase64 Tutorial . 我复制了用 Acme Crossassembler 编写的例程,如下所示。它无法打开文件并给出错误消息:“文
我的好奇心已经有 25 年了,我很想了解这个技巧。 在 Commodore 64 中,6569 VIC 无法寻址边界。您所能做的就是在中心区域(光标移动的区域)绘制像素。边框始终是统一的,尽管您可以使
我在 commodore 64 中初始化了一 block “.”板。 我想随机将单词放入板中,单词的每个字母都是“.”在棋盘上(如单词搜索游戏)。如果单词不适合,则可以放置下一个单词。我想垂直和水平放
嗯,这很尴尬。我已经在 Gentoo(Commodore 64 模拟器)上安装了 VICE,但是……无法启动它。我查看了 distfiles,我应该将“x64”作为起始命令(还有一堆其他程序),但没有
我发现的 PET 的零页内存映射声称零页地址范围 $00C2..$00D9 用于静态数据,例如http://www.classiccmp.org/dunfield/pet/petmem.txt 说:
我有一些 6502 代码可以在清除屏幕后将字符串打印到屏幕内存中。不幸的是,如果我打印一个字符串,例如“HELLO WORLD”,它会出现乱码。我发现这是因为大写字符从 0x01 开始,而不是我从 P
我在 Commodore Basic 6502 中打印点板时遇到问题。 这就是我必须做的:(这是一个子程序) 10 INPUT "Please enter a number:", X 20 DIM A
我计划在我的新 C64 项目中使用多色字符模式下的软件 Sprite 。我的想法是使用叠加“子弹” Sprite 数据来平铺数据。 我想我可以在地址“TILESET”处拥有tileset数据,在地址“
我正在尝试在 Commodore BASIC 中用“.”填充 A$(X,X)。 这就是我到目前为止所拥有的......但我不太确定如何处理 ASCII 值等。有评论吗? INPUT A$ FOR I
我正在尝试使用 Commodore 64 中的内核例程来实现游戏控制。 下面的代码可以正常工作,但有一个异常(exception)。每个击键都算作单个输入。例如:如果按住按钮,则没有任何效果。每次移动
我正在尝试在 Commodore BASIC 中用“.”填充 A$(X,X)。 这就是我到目前为止所拥有的......但我不太确定如何处理 ASCII 值等。有评论吗? INPUT A$ FOR I
我正在写一个小爱好 c64 文本冒险,我在一个非常具体的时刻停了下来。也就是说,我不知道如何引用引用中的任何内容。 如何在 commodore 64 basic v.2.0 中做到这一点? 最佳答案
您使用哪些工具在 OSX 上对 C64 进行交叉开发? 哪些汇编器、文本编辑器或 IDE、gfx、sprite、字符集编辑器? 或者您只是更喜欢通过 parallels 桌面或 bootcamp 的
作为我之前的衍生curiosity question我有一个后续的好奇心。 6502、VIC 和 SID 芯片是否有 future 和/或应用?我知道它们仍在生产和使用。例如,我记得 6502 是一个
我想在 Commodore 64 上的 BASIC 程序中存储一些二进制数据为 DATA声明。为了节省空间,我更愿意存储为字符串,而不是数字序列。 是否可以存储任何字符,来自 CHR$(0)通过 CH
屏幕上的第 1 行有水平平滑滚动的文本。平滑滚动效果是使用 $d016 硬件滚动效果通过迭代 $d016 的 7 个最低位来实现的。滚动条在屏幕的第一行运行。我设置了两个光栅中断。 “noScroll
我是一名优秀的程序员,十分优秀!