2017-10-15 8 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로 설명 할 수 있습니다.

내가 좋아하는 무언가로 인수로, Z0 및 N7을 CPU 구조체를 받아 확장 매크로 작성해야

:

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

이 가능를?

+1

왜 매크로 여야합니까? 'Z'와 'N'이라는 함수를 갖는 것은 잘못된 것입니다. fn Z (& mut 자체, 값 : u8) {self.z_flag = self.A == 0; }'와'fn N (& mut self, bit : u8) {self.n_flag = self.A & (1u8 << bit)! = 0; }'그럼 self.Z (0);로 호출 할 수 있습니다. 자기 .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);을 작성합니다

예를 들어, 다음과 같은 방법을 정의 할 수 있습니다. 상수 인수를 사용하여 호출하면 매크로만큼 효율적이어야합니다.