2017-10-15 50 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);。當用常量參數調用時,它們應該像宏一樣有效。