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 
4

2 回答 2

10

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

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

于 2017-04-19T20:38:40.763 回答
8

有时在将数据加载到更高的内存区域后,在您的情况下为 $c000,内存指针被破坏(正如 doynax 所建议的那样)。你需要做一个

NEW

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

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

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

于 2017-04-19T19:06:54.503 回答