Assembly 在VICE emulator中加载PRG文件后出现C64内存不足错误

Assembly 在VICE emulator中加载PRG文件后出现C64内存不足错误,assembly,c64,Assembly,C64,返回汇编例程后,当我试图获取磁盘的目录列表时,出现?内存不足错误 我准备了一个简单的程序来了解发生了什么,例如: *=$c000 lda #$00 sta $d020 rts 我的构建脚本是: C:\...\acme0.95.6win\acme.exe --outfile build\ROUTFILE --format cbm RSOURCEFILE C:\...\tools\WinVICE-2.4-x64\x64.exe build\ROUTFILE 当我运行构建脚本模拟器时,会加

返回汇编例程后,当我试图获取磁盘的目录列表时,出现
?内存不足错误

我准备了一个简单的程序来了解发生了什么,例如:

*=$c000

 lda #$00
 sta $d020
 rts
我的构建脚本是:

C:\...\acme0.95.6win\acme.exe --outfile build\ROUTFILE --format cbm RSOURCEFILE
C:\...\tools\WinVICE-2.4-x64\x64.exe build\ROUTFILE
当我运行构建脚本模拟器时,会加载PRG文件。尝试运行它,但什么也没有发生,因为我没有包括基本的加载程序。即使在这一点之后,如果我写
加载“$”,8
以获取目录列表。我收到
?内存不足错误
。那么,在上面的场景中有什么问题呢


PRG文件的十六进制转储为:

00 c0 a9 00 8d 20 d0 60 

有时,在将数据加载到更高的内存区域(在您的例子$c000中)后,内存指针会断开(正如doynax所建议的)。你需要做一个测试

NEW
来解决这个问题。(基本内存指针将更新到加载文件的末尾。如果文件在$A000之后结束,则基本内存不足,导致
内存不足错误
),然后您将能够加载$。由于您没有基本的代码,这不会造成任何伤害

我不知道您正在使用的工具,但正如Jester所提到的,您的代码需要加载为,8,1,这样加载地址就得到了尊重。您共享的代码是正确的,它以
00c0
开头,作为加载地址的前两个字节


如果
加载“$”,8
成功,并且您的文件在磁盘上,请尝试加载它
,8,1
,然后尝试
系统49152
(即0xC000)。

这似乎只是Commodore 64加载程序的一个伪制品。当您使用LOAD命令加载内存中的某些内容时,指向各种基本数据区域的开始和结束的指针将设置为加载程序后的地址。因此,对于以$C000加载的6字节程序,这些指针设置为$C006。然而,基本内存指针的末尾仍然是$A000。这会造成无效的情况,因为指向BASIC数据区域的指针高于BASIC允许使用的最大地址。它最终看起来像是BASIC已经耗尽了内存


通常这不是问题。您只能将汇编程序加载到$C000,加载程序后通常要做的第一件事也是唯一的一件事就是通过输入
SYS 49152
来执行程序,就像Jester提到的那样。如果您希望加载程序但不立即执行,您可以使用Peter Kofler的回答中给出的新命令来修复无效指针问题,这应该会将指针重置为其有效的默认状态,同时将加载的代码保持在$C000不变。

您似乎在破坏基本环境的内存指针。乍一看,构建脚本看起来很合理,应该发出并尊重
$C000
加载地址。你能给我们看一下结果二进制文件的十六进制转储吗?你需要用
,8,1
加载并使用
sys 49152
运行它。默认行为可能是为基本程序量身定做的。@Jester仿真器会自动加载
、8,1
,然后问题就会出现。我试着用
,8
加载,没有问题。
新的
命令可以工作,但我不明白为什么会出现这个问题。如果我通过写入
load“file”手动加载文件,8,1
同样的问题也会出现。当我写“加载”文件时,8没有问题。@wizofw当你写
load“file”时,8
有一个问题:文件不是以$C000加载到内存中,而是以$0801开始加载到基本内存中。您需要从那里开始使用
SYS2049
,这只是因为您的机器程序不使用代码或数据的绝对寻址。