在VICE仿真器中加载PRG文件后出现C64内存不足错误

wiz*_*wor 1 assembly c64

我得到?OUT OF MEMORY ERROR当我试图让磁盘返回后汇编程序的目录列表.

我准备了一个简单的例行程序,只是为了理解发生了什么,例如:

*=$c000

 lda #$00
 sta $d020
 rts
Run Code Online (Sandbox Code Playgroud)

我的构建脚本是:

C:\...\acme0.95.6win\acme.exe --outfile build\ROUTFILE --format cbm RSOURCEFILE
C:\...\tools\WinVICE-2.4-x64\x64.exe build\ROUTFILE
Run Code Online (Sandbox Code Playgroud)

当我运行构建脚本时,模拟器会加载PRG文件.尝试运行它,但没有任何反应,因为我没有包括BASIC加载器.即使在那之后,如果我写入LOAD "$",8目录列表.我到了?OUT OF MEMORY ERROR.那么上面的场景有什么问题呢?


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

00 c0 a9 00 8d 20 d0 60 
Run Code Online (Sandbox Code Playgroud)

Ros*_*dge 7

这似乎只是Commodore 64如何加载程序的工件.当您使用LOAD命令在内存中加载某些内容时,指向各种BASIC数据区域的开头和结尾的指针将被设置为加载程序之后的地址.因此,对于以$ C000加载的6字节程序,这些指针设置为$ C006.但是BASIC内存指针的结尾仍然是$ A000.这会产生无效的情况,因为指向BASIC数据区的指针高于BASIC允许使用的最大地址.它最终看起来像BASIC已经耗尽内存.

通常这不是问题.您只能将汇编程序加载到$ C000,并且通常是第一件事,加载程序后您唯一要做的就是通过输入来执行程序SYS 49152,就像Jester提到的那样.如果你想要加载的程序,但不执行它的时候,你可以通过使用新的命令,如彼得·科夫勒的答案给出,这应该重置指针的有效默认状态修复无效指针问题,同时留下$ C000装载代码修改.


Pet*_*ler 5

有时,在将数据加载到较高的内存区域(例如$ c000)后,内存指针已损坏(如doynax建议)。你需要做一个

NEW
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • @wizofwor 当你写 `LOAD"FILE",8` 时,_is_ 一个问题:文件不是在 $C000 处加载到内存中,而是在 BASIC 内存中以 $0801 开始。您需要使用“SYS2049”在那里启动它,这只是因为您的机器程序不使用代码或数据的绝对寻址。 (2认同)