如何从特定的内存位置或数组开始加载文件

时间:2012-12-25 03:11:40

标签: ruby

我在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

感谢。

2 个答案:

答案 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的长度。

同样,我们无法尝试使用@progsplit('')转换为数组,因为它也允许使用多字节字符。相反,我们可以获取字节并将其转换为数组。可以使用unpackbytes.to_a完成此操作。

答案 1 :(得分:0)

AFAIK,你做不到。 io.read返回一个数组一个字符串;它不会写入预先存在的数组。

您必须首先读取数组,然后splicing进入另一个数组。像

这样的东西
progimage = io.read.bytes.to_a
image[start, progimage.size] = progimage

幸运的是,现在运行Ruby的任何系统都拥有比C64更多的内存和CPU功率,因此使用额外的阵列并不会太麻烦。