我在6502仿真器上的工作仍在继续。我遇到了嵌入式处理器仿真的一些怪癖,其中我需要在一个从0x1000开始的数组中加载6502二进制文件。
当然,加载文件很容易。但偏移部分不是。在C中,我可以轻松完成。
以下是加载我正在使用的文件的代码:
def loadbinary(filename)
@prog = File.open(filen, "rb") { |io| io.read }
@imagesize = @prog.size
end
如果加载加载到0x1000,则前面的空格可以为空(在0x1000之前)。
有什么想法吗?
对于任何有趣的人,这是我在GitHub上的6502.rb project
感谢。
答案 0 :(得分:2)
您可能需要分配n
个字节的数组,其中n
是您要模拟的可寻址RAM的大小。从那里,您可以开始将从文件中读取的数据存储到" RAM"。
这就是我的开始:
def loadbinary(filename)
@prog = File.read(filename, 'rb')
@imagesize = @prog.bytesize
end
RAM_SIZE = 1024 * 64
RAM = Array.new(RAM_SIZE)
loadbinary('/path/to/foo')
RAM[0x1000, @imagesize] = @prog.bytes.to_a
注意:您不能使用String.size
来获取字符串的长度,因为它允许使用多字节字符。相反,要获得字节数,您需要bytesize
,根据the documentation:
以字节为单位返回str的长度。
同样,我们无法尝试使用@prog
将split('')
转换为数组,因为它也允许使用多字节字符。相反,我们可以获取字节并将其转换为数组。可以使用unpack
或bytes.to_a
完成此操作。
答案 1 :(得分:0)
AFAIK,你做不到。 io.read
返回一个数组一个字符串;它不会写入预先存在的数组。
您必须首先读取数组,然后splicing进入另一个数组。像
这样的东西progimage = io.read.bytes.to_a
image[start, progimage.size] = progimage
幸运的是,现在运行Ruby的任何系统都拥有比C64更多的内存和CPU功率,因此使用额外的阵列并不会太麻烦。