3

我在 6502 仿真器上的工作仍在继续。我在嵌入式处理器仿真中遇到了一些问题,我需要在从 0x1000 开始的数组中加载 6502 二进制文件。

当然,加载文件很容易。但偏移部分不是。在 C 中,我可以轻松地做到这一点。

这是加载我现在正在使用的文件的代码:

  def loadbinary(filename)
    @prog = File.open(filen, "rb") { |io| io.read }
    @imagesize = @prog.size
  end

如果加载在 0x1000 处加载,则前面的空间可以为空(0x1000 之前)。

有任何想法吗?

对于任何有趣的人,这是我在 GitHub 上的6502.rb 项目

谢谢。

4

2 回答 2

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,根据文档

返回 str 的长度(以字节为单位)。

同样,我们不能尝试使用转换@prog为数组,split('')因为它也允许多字节字符。相反,我们可以获取字节并将其转换为数组。可以使用unpack或来完成bytes.to_a

于 2012-12-25T05:05:41.257 回答
0

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

您必须首先读取一个数组,然后拼接到另一个数组中。就像是

progimage = io.read.bytes.to_a
image[start, progimage.size] = progimage

幸运的是,现在运行 Ruby 的几乎所有系统都比 C64 拥有更多的内存和 CPU 能力,因此使用额外的数组并不太麻烦。

于 2012-12-25T03:19:46.947 回答