我正在开发一个游戏,需要有60秒倒计时,但我不知道如何让它从60秒开始倒计时,因为内存更新得太快了。
这是我尝试过的:
.proc timer
PHP
PHA
TXA
PHA
TYA
PHA
LDA #60
STA $0000
Loop:
DEC $0000
LDA $0000
BEQ TimerDone
DelayLoop:
LDX #$FF
InnerLoop:
DEX
BNE InnerLoop
JMP Loop
TimerDone:
PLA
TAY
PLA
TAX
PLA
PLP
RTS
.endproc
我得到的是,当我开始游戏时,它在内存查看器中立即变为 0,因此它会更新,但速度很快。有什么办法可以实现某种以秒甚至毫秒为单位的延迟吗?
你说得对。你必须使用循环。要延长时间,您可以添加
NOP
操作。
6502 有非常具体的时序。假设您没有超加速的现代版本,您可以非常精确。这些指令应该准确地使用参考分配的时间量。因此,例如
DEX + BNE
循环时需要 6 个周期,最后一步需要 5 个周期(如果不采用分支,则需要少 1 个周期,而当采用时,则需要多 1 个周期,并且目标位于单独的页面上, PC 高位递增或递减)。
所以现在你需要找到一个包含 CPU 指令以及每个指令所花费的周期数的文档。
如果您可以使用时钟,那么您可以读取时钟并使用该值来知道您何时完成。否则6502默认是没有这个东西的。它必须是某种 I/O。