2012-12-25 35 views
3

我在6502仿真器上的工作正在继续。我遇到了一些与嵌入式处理器仿真有关的怪癖,我需要从0x1000开始的数组中加载一个6502二进制文件。如何加载从特定内存位置或阵列开始的文件

当然,加载文件很容易。但偏移部分不是。在C中,我可以轻松完成。

下面是加载我现在使用一个文件中的代码:

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

如果负载位于0x1000装,前面的空间可以是空的(之前的0x1000)。

任何想法?

对于任何有趣的,这是为6502.rb project我已经在GitHub上

感谢。

回答

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的长度(以字节为单位)。

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

0

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

您必须先将数组读入数组,然后将splicing转换为另一个数组。喜欢的东西

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

幸运的是,几乎所有的系统现在正在运行Ruby有几分更多的内存和CPU能力比C64,所以使用一个额外的数组是没有太多的麻烦。

+1

['IO.read'](http://www.ruby-doc.org/core-1.9.3/IO.html#method-i-read)不返回数组,它返回什么实际上是一个字符串,但它只是一个充满字节的“字符串”。字节可以代表任何东西。 'IO.read('/ dev/null')。class => String' –

+0

Doh,brain fart。当然,它不会返回一个'Array' ...让我换个话题。 (并且感谢您的注意) – Amadan

相关问题