1

我正在用 Ruby 为一个相对简单的 6502 处理器编写一个模拟器。

我的问题是,有没有办法用汇编指令的详细信息定义散列或数组,然后是它需要的操作数数量,最后是实现它的方法/函数?

然后在代码的某个地方,可以根据读取的指令评估哈希或数组,并且可以启动为其实现的适当方法/函数?

我对想法持开放态度...

目前,我有这样的结构,但在实现它时遇到了困难:

@inst.push [ 0x48, :implied, 1, PHA]
@inst.push [ 0xA2, :immediate, 2, LDX ]
@inst.push [ 0xA9, :immediate, 2, LDA ]
@inst.push [ 0xAD, :absolute, 3, LDA ]
@inst.push [ 0xA6, :zeropage, 2, LDX ]
@inst.push [ 0xB6, :zeropagey, 2, LDX ]
@inst.push [ 0xAE, :absolute, 2, LDX ]
@inst.push [ 0xBE, :absolutey, 2, LDX ]
@inst.push [ 0x8A, :implied, 1, TXA ]

Lambdas,Procs?像这样的事情可以实现我在这里实现的目标吗?

我真的不希望每条指令都有一个大的“案例/时间”,然后是一个巨大、丑陋且相对不友好的地方的陈述。

谢谢!

4

2 回答 2

3

如果您的指令作为方法实现,则不需要 lambda。使用带有名称的符号指定方法,使用获取实际方法Class#method并使用 调用它Method#call。我的意思是

method = Object.method :puts
method.call "Oh, it seems to work!"

在你的情况下,它会是

implementation = Instructions.method instruction_name
# Store it in a hash in which instruction names are keys or any other
# appropriate data structure. Once you encounter this instruction...
implementation.call
于 2012-12-24T09:10:45.723 回答
0

您可以使用send调用对象上的任何方法

>> a = [1,2,8]
=> [1, 2, 8]
>> a.send(:size)
=> 3
>> a.send(:pop)
=> 8
>> a
=> [1, 2]
>> a.send(:push,42)
=> [1, 2, 42]

所以只需将实现您的指令的方法的名称作为符号存储在数组中,然后将符号发送给解释器以调用关联的方法。

于 2012-12-24T09:48:09.497 回答