我有一个代码片段,在初始化内斯程序集的游戏之前清除内存.当我像这样将代码留在reset proc中时,它可以工作:
.proc reset
SEI
CLD
LDX #0
ClearRAM:
STA $000,x
STA $100,x
STA $200,x
STA $300,x
STA $400,x
STA $500,x
STA $600,x
STA $700,x
INX
BNE ClearRAM
.endproc
字符串
但是,如果我尝试将此ClearRAM片段移动到一个作用域proc中:
.scope Memory
.proc clear
LDX #0
ClearRAM:
STA $000,x
STA $100,x
STA $200,x
STA $300,x
STA $400,x
STA $500,x
STA $600,x
STA $700,x
INX
BNE ClearRAM
RTS
.endproc
.endscope
型
然后像这样加载:
.proc reset
SEI
CLD
JSR Memory::clear
.endproc
型
它停止工作。就像它在ClearRAM循环中永远循环一样。
知道我哪里做错了吗
谢谢你,谢谢
1条答案
按热度按时间r8uurelv1#
您的代码将清除前2K的RAM内存。(我不知道内斯是否有超过2K的内存。
因为堆栈始终位于使用6502 CPU的系统的前1K内存中(更准确地说:在100h.1FFh范围内),程序也会清除堆栈。
JSR
将程序流在RTS
之后继续的地址保存到堆栈中,RTS
指令从堆栈中读取该地址。如果您擦除堆栈的内容,
RTS
将从堆栈中读取一些错误的值并跳转到该地址。如果程序中的
A
寄存器包含值12h
,则RTS
指令将从堆栈中读取1212h
,并且程序将在地址1212h
(在RTS
指令之后)而不是JSR
之后的指令继续执行。