如何编写有条件地更新仿真器CPU标志的宏?

时间:2017-10-15 14:18:59

标签: macros rust

我正在使用Rust编写6502 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 个答案:

答案 0 :(得分: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);。当使用常量args调用时,它们应该像宏一样有效。