在 VICE 模拟器中加载 PRG 文件后出现 C64 内存不足错误
C64 out of memory error after loading PRG file in VICE emulator
我在返回汇编例程后尝试获取磁盘的目录列表时得到 ?OUT OF MEMORY ERROR
。
我准备了一个简单的程序来了解发生了什么,例如:
*=$c000
lda #[=10=]
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
有时在将数据加载到更高的内存区域后,在您的情况下为 $c000,内存指针已损坏(如 doynax 所建议的)。你需要做一个
NEW
解决这个问题。 (Basic 内存指针被更新到加载文件的末尾。如果您的文件在 $A000 之后结束,则 Basic 内存不足,导致 OUT OF MEMORY ERROR
。)之后您将能够加载 $。由于您没有基本代码,因此不会造成任何伤害。
我不知道您使用的是什么工具,但正如 Jester 所提到的,您的代码需要加载为 ,8,1 以便加载地址。您分享的代码是正确的,它以 00 C0
开头作为加载地址的前两个字节。
如果 load "$",8
成功并且您的文件在磁盘上,请尝试加载它 ,8,1
然后尝试 sys 49152
(即 0xC000)。
这似乎只是 Commodore 64 加载程序的人工制品。当您使用 LOAD 命令将某些内容加载到内存中时,指向各种 BASIC 数据区的开始和结束的指针被设置为紧接加载程序之后的地址。因此对于加载到 $C000 的 6 字节程序,这些指针设置为 $C006。然而,BASIC 内存指针的末尾仍保持在 $A000。这会造成无效情况,因为指向 BASIC 数据区域的指针高于 BASIC 允许使用的最大地址。它最终看起来像 BASIC 运行 内存不足。
通常这不是问题。您只能将汇编程序加载到 $C000,加载程序后通常第一件事也是唯一一件事就是通过输入 SYS 49152
来执行程序,就像 Jester 提到的那样。如果您想加载程序但不立即执行它,您可以使用 Peter Kofler 的回答中给出的 NEW 命令来解决无效指针问题,这应该将指针重置为其有效的默认状态,同时将代码加载到 $C000未修改。
我在返回汇编例程后尝试获取磁盘的目录列表时得到 ?OUT OF MEMORY ERROR
。
我准备了一个简单的程序来了解发生了什么,例如:
*=$c000
lda #[=10=]
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
有时在将数据加载到更高的内存区域后,在您的情况下为 $c000,内存指针已损坏(如 doynax 所建议的)。你需要做一个
NEW
解决这个问题。 (Basic 内存指针被更新到加载文件的末尾。如果您的文件在 $A000 之后结束,则 Basic 内存不足,导致 OUT OF MEMORY ERROR
。)之后您将能够加载 $。由于您没有基本代码,因此不会造成任何伤害。
我不知道您使用的是什么工具,但正如 Jester 所提到的,您的代码需要加载为 ,8,1 以便加载地址。您分享的代码是正确的,它以 00 C0
开头作为加载地址的前两个字节。
如果 load "$",8
成功并且您的文件在磁盘上,请尝试加载它 ,8,1
然后尝试 sys 49152
(即 0xC000)。
这似乎只是 Commodore 64 加载程序的人工制品。当您使用 LOAD 命令将某些内容加载到内存中时,指向各种 BASIC 数据区的开始和结束的指针被设置为紧接加载程序之后的地址。因此对于加载到 $C000 的 6 字节程序,这些指针设置为 $C006。然而,BASIC 内存指针的末尾仍保持在 $A000。这会造成无效情况,因为指向 BASIC 数据区域的指针高于 BASIC 允许使用的最大地址。它最终看起来像 BASIC 运行 内存不足。
通常这不是问题。您只能将汇编程序加载到 $C000,加载程序后通常第一件事也是唯一一件事就是通过输入 SYS 49152
来执行程序,就像 Jester 提到的那样。如果您想加载程序但不立即执行它,您可以使用 Peter Kofler 的回答中给出的 NEW 命令来解决无效指针问题,这应该将指针重置为其有效的默认状态,同时将代码加载到 $C000未修改。