2017-10-15 30 views
1

我正在写一个使用Rust的6502 CPU模拟器,我试图尽可能地让我的代码尽可能干。如何编写一个有条件地更新仿真器CPU标志的宏?

解码操作码的代码并执行这些看起来是这样的:

//self refers to CPU struct 

match opcode { 
    0x29 => {self.A &= self.imm(); update_flags!(self.cpu, "Z0", "N7");}, 
    // ... other 55 opcodes 
} 

我希望有一个简单的方法执行每条指令后更新CPU的标志。例如,执行AND指令后,如果A = 0,则应设置标志Z,如果位7为1,则应设置标志N.我可以将这两个条件描述为Z0和N7。

我需要编写一个宏,占用CPU结构,Z0和N7作为参数,并扩展到类似:

if self.A == 0 {set flag Z}; 
if self.A.7thbit == 1 {set flag N}; 

这可能吗?

+1

为什么这是一个宏?有一个名为'Z'和'N'的函数会有什么问题,例如fn Z(&mut self,value:u8){self.z_flag = self.A == 0; }&'fn N(&mut self,bit:u8){self.n_flag = self.A&(1u8 << bit)!= 0; }'那么你可以称它们为'self.Z(0); self.N(7);'。当用常量参数调用时,它们应该像宏一样有效。 – user4815162342

+0

是的,我会适当地使用功能。最后,它们更容易调试。 –

+0

我现在发布了上面的答案。 – user4815162342

回答

2

这里没有必要使用宏,因为功能可以实现相同(如果不是更好的话)人体工程学和效率。

例如,你可以定义方法,如:

fn Z(&mut self, value: u8) { 
    self.z_flag = self.A == value; 
} 

fn N(&mut self, bit: u8) { 
    self.n_flag = self.A & (1u8 << bit) != 0; 
} 

相反的update_flags!(self.cpu, "Z0", "N7");,你会写self.Z(0); self.N(7);。当用常量参数调用时,它们应该像宏一样有效。