我正在使用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};
这可能吗?
答案 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调用时,它们应该像宏一样有效。