VICE模拟器中加载PRG文件后出现C64内存不足错误

4

当我尝试获取一个磁盘的目录列表时,返回程序集例程后,我遇到了?OUT OF MEMORY ERROR错误。

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

*=$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文件。尝试运行它,但由于我没有包含BASIC加载器,所以什么也不会发生。即使在那之后,如果我输入LOAD "$",8来获取目录列表,我也会收到?OUT OF MEMORY ERROR的提示。那么上述情况有什么问题吗?
PRG文件的十六进制转储如下:
00 c0 a9 00 8d 20 d0 60 

1
你似乎在破坏BASIC环境的内存指针。乍一看,构建脚本看起来还是合理的,应该会发出并遵守“$C000”加载地址。你能给我们展示一下生成的二进制文件的HEX转储吗? - doynax
2
你需要使用,8,1进行加载,并使用sys 49152运行它。默认行为可能是针对基本程序量身定制的。 - Jester
@Jester,模拟器自动加载,8,1时出现问题。我尝试使用,8进行加载,没有问题。 - wizofwor
2个回答

10

这似乎只是Commodore 64加载程序时的一个特殊情况。当您使用LOAD命令将某些内容加载到内存中时,指向各种BASIC数据区开头和结尾的指针会被设置为所加载程序的地址后面紧接着的地址。因此对于在$C000处加载的6字节程序,这些指针被设置为$C006。但是,BASIC内存的结束指针仍然保持在$A000。这将创建一种无效的情况,因为BASIC数据区的指针高于BASIC允许使用的最大地址。结果看起来像是BASIC已经用完了内存。

通常这不是一个问题。您只能将汇编程序加载到$C000,因此在加载程序后,通常可以执行SYS 49152来运行该程序,就像Jester提到的那样。如果您想要加载程序但不立即执行它,则可以使用Peter Kofler的答案中给出的NEW命令解决无效指针问题,这应该将指针重置为它们的有效默认状态,同时保持加载到$C000的代码不变。


1
但是如果您想返回基本的返回命令怎么办?我正在使用CDM Studio:我已经加载了从* = $ 3800加载的字符集的ASM字节代码,并且我在* = $ C000处有一个例程,将VIC指向该字符集(末尾带有“ RTS”)。我的基本代码为10 SYS 49152,20 PRINT CHR $(147),并且在第20行出现“内存不足”的错误...我无法使用“new”,因为那会清除基本内存? - Simon

8
有时候在将数据装载到更高的内存区域,比如$c000时,会导致内存指针损坏(正如doynax所建议的)。您需要执行以下操作:

NEW

要解决这个问题 (基本内存指针会被更新到已加载文件的末尾。如果您的文件在$A000之后结束,则超出了基本内存,导致“内存不足错误”.) 之后,您将能够加载 $. 因为您没有基本代码,所以不会有任何损害。
我不知道您使用的工具,但正如Jester提到的,您的代码需要被加载为,8,1,以便尊重加载地址。您分享的代码是正确的,它以00 C0作为前两个字节,这是加载地址。
如果load "$",8成功并且您的文件在磁盘上,请尝试以,8,1加载它,然后尝试sys 49152(即0xC000)。

“NEW” 命令可以正常工作,但我不明白为什么会出现这个问题。如果我手动写入 load "file",8,1 来加载文件,就会出现同样的问题。但是当我写入 load "file",8 时,就没有问题了。 - wizofwor
3
@wizofwor 当你写 LOAD"FILE",8 时,确实存在一个问题:文件并不是加载到内存的 $C000,而是在基本内存开始的 $0801 加载。你需要使用 SYS2049 将其启动,并且这仅适用于您的机器程序不使用代码或数据的绝对寻址。 - BlackJack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接