如何在Assembly 6502中制作计时器?

问题描述 投票:0回答:1

我正在开发一个游戏,需要有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,因此它会更新,但速度很快。有什么办法可以实现某种以秒甚至毫秒为单位的延迟吗?

assembly 6502 nes
1个回答
0
投票

你说得对。你必须使用循环。要延长时间,您可以添加

NOP
操作。

6502 有非常具体的时序。假设您没有超加速的现代版本,您可以非常精确。这些指令应该准确地使用参考分配的时间量。因此,例如

DEX + BNE
循环时需要 6 个周期,最后一步需要 5 个周期(如果不采用分支,则需要少 1 个周期,而当采用时,则需要多 1 个周期,并且目标位于单独的页面上, PC 高位递增或递减)。

所以现在你需要找到一个包含 CPU 指令以及每个指令所花费的周期数的文档。

如果您可以使用时钟,那么您可以读取时钟并使用该值来知道您何时完成。否则6502默认是没有这个东西的。它必须是某种 I/O。

© www.soinside.com 2019 - 2024. All rights reserved.