当我在返回程序集例程后尝试获取磁盘的目录列表时,我得到#!/usr/bin/env python3
import os
import tempfile
msg = "THIS IS A HORRIBLE MESSAGE"
txt = None
try:
txt = tempfile.mkstemp(dir='.', suffix='.txt')[1]
with open(txt, "w") as f:
f.write(msg)
except Exception as exp:
raise exp
finally:
if txt:
os.remove(txt)
。
我准备了一个简单的例行程序,只是为了理解发生了什么,例如:
?OUT OF MEMORY ERROR
我的构建脚本是:
*=$c000
lda #$00
sta $d020
rts
当我运行构建脚本时,模拟器会加载PRG文件。尝试运行它,但没有任何反应,因为我没有包括BASIC加载器。即使在那之后,如果我写C:\...\acme0.95.6win\acme.exe --outfile build\ROUTFILE --format cbm RSOURCEFILE
C:\...\tools\WinVICE-2.4-x64\x64.exe build\ROUTFILE
来获取目录列表。我得到了LOAD "$",8
。那么在上面的场景中出了什么问题?
PRG文件的十六进制转储是:
?OUT OF MEMORY ERROR
答案 0 :(得分:6)
这似乎只是Commodore 64加载程序的工件。当您使用LOAD命令在内存中加载某些内容时,指向各种BASIC数据区域的开头和结尾的指针将被设置为加载程序之后的地址。因此,对于以$ C000加载的6字节程序,这些指针设置为$ C006。但是BASIC内存指针的结尾仍然是$ A000。这会产生无效的情况,因为指向BASIC数据区的指针高于BASIC允许使用的最大地址。它最终看起来像BASIC已经耗尽内存。
通常这不是问题。你只能将程序集程序加载到$ C000,这样通常是第一件事,加载程序后你唯一要做的就是输入SYS 49152
来执行程序,就像Jester提到的那样。如果你想加载程序但不立即执行它你可以通过使用Peter Kofler的答案中给出的NEW命令修复无效指针问题,这应该将指针重置为有效的默认状态,同时保留代码装载在$ C000未经修改。
答案 1 :(得分:4)
有时在将数据加载到更高的内存区域后,在你的情况下$ c000,内存指针被破坏(如doynax建议的那样)。你需要做一个
NEW
解决这个问题。 (基本内存指针更新到加载文件的末尾。如果文件在$ A000之后结束,则超出基本内存,导致OUT OF MEMORY ERROR
。)之后,您将能够加载$。由于您没有基本代码,因此不会造成任何伤害。
我不知道你正在使用的工具,但正如Jester所提到的,你的代码需要加载为8,1所以加载地址是受到尊重的。您共享的代码是正确的,它以00 C0
作为前两个字节(加载地址)开始。
如果load "$",8
成功并且您的文件位于磁盘上,请尝试加载,8,1
,然后尝试sys 49152
(即0xC000)。